diff options
| author | saber safavi <saber.safavi@codic.se> | 2023-03-17 15:15:49 +0100 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2023-03-20 16:21:29 +0100 |
| commit | f6b23f668137169f9c1cdc26c09a3dbe8fe76d0a (patch) | |
| tree | 4a370485c58eab17d357c15128d7f2647f0c7b9e | |
| parent | d69c346accf92301e5c6f8db30854f2cd28113e3 (diff) | |
| download | mullvadvpn-f6b23f668137169f9c1cdc26c09a3dbe8fe76d0a.tar.xz mullvadvpn-f6b23f668137169f9c1cdc26c09a3dbe8fe76d0a.zip | |
Migrate advanced settings fragment to use composified view
43 files changed, 37 insertions, 1134 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt index 10a4f2b5d7..8abb712ff8 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt @@ -4,268 +4,59 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle -import androidx.recyclerview.widget.LinearLayoutManager -import java.net.InetAddress -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.shareIn -import kotlinx.coroutines.launch +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.platform.ComposeView import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.model.Settings -import net.mullvad.mullvadvpn.ui.customdns.CustomDnsAdapter -import net.mullvad.mullvadvpn.ui.extension.requireMainActivity +import net.mullvad.mullvadvpn.compose.screen.AdvancedSettingScreen import net.mullvad.mullvadvpn.ui.fragment.BaseFragment -import net.mullvad.mullvadvpn.ui.fragment.ConfirmDnsDialogFragment import net.mullvad.mullvadvpn.ui.fragment.SplitTunnelingFragment -import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager -import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState -import net.mullvad.mullvadvpn.ui.serviceconnection.customDns -import net.mullvad.mullvadvpn.ui.serviceconnection.settingsListener -import net.mullvad.mullvadvpn.ui.widget.CellSwitch -import net.mullvad.mullvadvpn.ui.widget.CustomRecyclerView -import net.mullvad.mullvadvpn.ui.widget.MtuCell -import net.mullvad.mullvadvpn.ui.widget.NavigateCell -import net.mullvad.mullvadvpn.ui.widget.ToggleCell -import net.mullvad.mullvadvpn.util.AdapterWithHeader -import net.mullvad.mullvadvpn.util.JobTracker -import net.mullvad.mullvadvpn.util.callbackFlowFromNotifier -import org.koin.android.ext.android.inject +import net.mullvad.mullvadvpn.viewmodel.AdvancedSettingsViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel -// TODO: Move as part of refactoring to compose. class AdvancedFragment : BaseFragment() { + private val vm by viewModel<AdvancedSettingsViewModel>() - // Injected dependencies - private val serviceConnectionManager: ServiceConnectionManager by inject() - - private var isAllowLanEnabled = false - - // Both customDnsAdapter and customDnsToggle are nullable since onNewServiceConnection, - // which sets up custom dns subscriptions, is called before onSafelyCreateView. - private var customDnsAdapter: CustomDnsAdapter? = null - private var customDnsToggle: ToggleCell? = null - - private lateinit var wireguardMtuInput: MtuCell - private lateinit var titleController: CollapsibleTitleController - - @Deprecated("Refactor code to instead rely on Lifecycle.") - private val jobTracker = JobTracker() - - val shared = serviceConnectionManager.connectionState - .flatMapLatest { state -> - if (state is ServiceConnectionState.ConnectedReady) { - flowOf(state.container) - } else { - emptyFlow() - } - } - .map { - it.customDns - } - .shareIn(lifecycleScope, SharingStarted.WhileSubscribed()) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - lifecycleScope.launch { - repeatOnLifecycle(Lifecycle.State.RESUMED) { - launch { - serviceConnectionManager.connectionState - .flatMapLatest { state -> - if (state is ServiceConnectionState.ConnectedReady) { - flowOf(state.container) - } else { - emptyFlow() - } - } - .flatMapLatest { - callbackFlowFromNotifier(it.settingsListener.settingsNotifier) - } - .collect { settings -> - if (settings != null) { - updateUi(settings) - } - } - } - - launch { - shared - .flatMapLatest { - callbackFlowFromNotifier(it.onEnabledChanged) - } - .collect { isEnabled -> - customDnsAdapter?.updateState(isEnabled) - jobTracker.newUiJob("updateEnabled") { - if (isEnabled) { - customDnsToggle?.state = CellSwitch.State.ON - } else { - customDnsToggle?.state = CellSwitch.State.OFF - } - } - } - } - - launch { - shared - .flatMapLatest { - callbackFlowFromNotifier(it.onDnsServersChanged) - } - .collect { servers -> - customDnsAdapter?.updateServers(servers) - } - } - } - } - } - + @OptIn(ExperimentalMaterialApi::class) override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val view = inflater.inflate(R.layout.advanced, container, false) - - view.findViewById<View>(R.id.back).setOnClickListener { - customDnsAdapter?.stopEditing() - requireActivity().onBackPressed() - } - - titleController = CollapsibleTitleController(view, R.id.contents) - - customDnsAdapter = CustomDnsAdapter( - onAddServer = { address -> - serviceConnectionManager.customDns()?.addDnsServer(address) ?: false - }, - onRemoveDnsServer = { address -> - serviceConnectionManager.customDns()?.removeDnsServer(address) ?: false - }, - onSetCustomDnsEnabled = { isEnabled -> - if (isEnabled) { - serviceConnectionManager.customDns()?.enable() - } else { - serviceConnectionManager.customDns()?.disable() - } - }, - onReplaceDnsServer = { oldServer, newServer -> - serviceConnectionManager.customDns()?.replaceDnsServer( - oldServer, - newServer - ) ?: false - } - ).also { newCustomDnsAdapter -> - - newCustomDnsAdapter.confirmAddAddress = ::confirmAddAddress - - view.findViewById<CustomRecyclerView>(R.id.contents).apply { - layoutManager = LinearLayoutManager(requireContext()) - - adapter = AdapterWithHeader(newCustomDnsAdapter, R.layout.advanced_header).apply { - onHeaderAvailable = { headerView -> - configureHeader(headerView) - titleController.expandedTitleView = - headerView.findViewById(R.id.expanded_title) - } - } - - addItemDecoration( - ListItemDividerDecoration( - topOffset = resources.getDimensionPixelSize(R.dimen.list_item_divider) - ) + return inflater.inflate(R.layout.fragment_compose, container, false).apply { + findViewById<ComposeView>(R.id.compose_view).setContent { + val state = vm.uiState.collectAsState().value + AdvancedSettingScreen( + uiState = state, + onMtuCellClick = vm::onMtuCellClick, + onMtuInputChange = vm::onMtuInputChange, + onSaveMtuClick = vm::onSaveMtuClick, + onRestoreMtuClick = vm::onRestoreMtuClick, + onCancelMtuDialogClicked = vm::onCancelDialogClick, + onSplitTunnelingNavigationClick = ::openSplitTunnelingFragment, + onToggleDnsClick = vm::onToggleDnsClick, + onDnsClick = vm::onDnsClick, + onDnsInputChange = vm::onDnsInputChange, + onSaveDnsClick = vm::onSaveDnsClick, + onRemoveDnsClick = vm::onRemoveDnsClick, + onCancelDnsDialogClick = vm::onCancelDialogClick, + onBackClick = { activity?.onBackPressed() } ) } } - - attachBackButtonHandler() - - return view - } - - override fun onDestroyView() { - detachBackButtonHandler() - customDnsAdapter?.onDestroy() - titleController.onDestroy() - super.onDestroyView() - } - - private fun configureHeader(view: View) { - wireguardMtuInput = view.findViewById<MtuCell>(R.id.wireguard_mtu).apply { - onSubmit = { mtu -> - serviceConnectionManager.settingsListener()?.wireguardMtu = mtu - } - value = serviceConnectionManager.settingsListener()?.let { settingsNotifier -> - settingsNotifier.wireguardMtu - } - } - - view.findViewById<NavigateCell>(R.id.split_tunneling).apply { - targetFragment = SplitTunnelingFragment::class - } - - customDnsToggle = view.findViewById<ToggleCell>(R.id.enable_custom_dns).apply { - state = serviceConnectionManager.customDns().let { customDns -> - if (customDns?.isCustomDnsEnabled() == true) { - CellSwitch.State.ON - } else { - CellSwitch.State.OFF - } - } - - listener = { state -> - jobTracker.newBackgroundJob("toggleCustomDns") { - if (state == CellSwitch.State.ON) { - serviceConnectionManager.customDns()?.enable() - } else { - serviceConnectionManager.customDns()?.disable() - } - } - } - } - } - - private fun updateUi(settings: Settings) { - if (this::wireguardMtuInput.isInitialized && wireguardMtuInput.hasFocus == false) { - wireguardMtuInput.value = settings.tunnelOptions.wireguard.mtu - } - } - - private suspend fun confirmAddAddress(address: InetAddress): Boolean { - val isLocalAddress = address.isLinkLocalAddress() || address.isSiteLocalAddress() - - return !isLocalAddress || isAllowLanEnabled || showConfirmDnsServerDialog() - } - - private suspend fun showConfirmDnsServerDialog(): Boolean { - val confirmation = CompletableDeferred<Boolean>() - val transaction = parentFragmentManager.beginTransaction() - - detachBackButtonHandler() - transaction.addToBackStack(null) - - ConfirmDnsDialogFragment(confirmation) - .show(transaction, null) - - val result = confirmation.await() - - attachBackButtonHandler() - - return result } - private fun attachBackButtonHandler() { - requireMainActivity().backButtonHandler = { - if (customDnsAdapter?.isEditing == true) { - customDnsAdapter?.stopEditing() - } - false + private fun openSplitTunnelingFragment() { + parentFragmentManager.beginTransaction().apply { + setCustomAnimations( + R.anim.fragment_enter_from_right, + R.anim.fragment_exit_to_left, + R.anim.fragment_half_enter_from_left, + R.anim.fragment_exit_to_right + ) + replace(R.id.main_fragment, SplitTunnelingFragment()) + addToBackStack(null) + commitAllowingStateLoss() } } - - private fun detachBackButtonHandler() { - requireMainActivity().backButtonHandler = null - } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/AddCustomDnsServerHolder.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/AddCustomDnsServerHolder.kt deleted file mode 100644 index 1d0f940d4b..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/AddCustomDnsServerHolder.kt +++ /dev/null @@ -1,16 +0,0 @@ -package net.mullvad.mullvadvpn.ui.customdns - -import android.view.View -import net.mullvad.mullvadvpn.R - -class AddCustomDnsServerHolder(view: View, adapter: CustomDnsAdapter) : CustomDnsItemHolder(view) { - init { - view.findViewById<View>(R.id.add).setOnClickListener { - adapter.newDnsServer() - } - - view.findViewById<View>(R.id.click_area).setOnClickListener { - adapter.newDnsServer() - } - } -} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt deleted file mode 100644 index 1d44ca3a50..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt +++ /dev/null @@ -1,302 +0,0 @@ -package net.mullvad.mullvadvpn.ui.customdns - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView.Adapter -import java.net.InetAddress -import kotlin.properties.Delegates.observable -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.util.JobTracker -import org.apache.commons.validator.routines.InetAddressValidator - -class CustomDnsAdapter( - val onSetCustomDnsEnabled: (Boolean) -> Unit, - val onAddServer: (InetAddress) -> Boolean, - val onRemoveDnsServer: (InetAddress) -> Unit, - val onReplaceDnsServer: (InetAddress, InetAddress) -> Boolean -) : Adapter<CustomDnsItemHolder>() { - private enum class ViewTypes { - ADD_SERVER, - EDIT_SERVER, - SHOW_SERVER, - FOOTER, - } - - private val customDnsServersLock = Mutex() - private val inetAddressValidator = InetAddressValidator.getInstance() - private val jobTracker = JobTracker() - - private var editingPosition: Int? = null - - private var activeCustomDnsServers by observable<List<InetAddress>>( - emptyList() - ) { _, _, servers -> - if (servers != cachedCustomDnsServers) { - cachedCustomDnsServers = servers.toMutableList() - notifyDataSetChanged() - } - } - - private var cachedCustomDnsServers = emptyList<InetAddress>().toMutableList() - - private var enabled by observable(false) { _, oldValue, newValue -> - if (oldValue != newValue) { - if (newValue == true) { - notifyItemRangeInserted(0, cachedCustomDnsServers.size + 1) - } else { - notifyItemRangeRemoved(0, cachedCustomDnsServers.size + 1) - editingPosition = null - } - } - } - - val isEditing - get() = editingPosition != null - - // By default, refuse the address so that the dialog can be recreated by the user if needed - var confirmAddAddress: suspend (InetAddress) -> Boolean = { false } - - fun updateServers(servers: List<InetAddress>) { - jobTracker.newBackgroundJob("toggleCustomDns") { - if (servers.isEmpty()) { - onSetCustomDnsEnabled(false) - } - } - - jobTracker.newUiJob("updateDnsServers") { - customDnsServersLock.withLock { - activeCustomDnsServers = servers - } - } - } - - fun updateState(isEnabled: Boolean) { - jobTracker.newUiJob("updateEnabled") { - customDnsServersLock.withLock { - enabled = isEnabled - } - } - } - - override fun getItemCount() = - if (enabled) { - cachedCustomDnsServers.size + 2 - } else { - 1 - } - - override fun getItemViewType(position: Int): Int { - val count = getItemCount() - val footer = count - 1 - val addServer = count - 2 - - if (position == footer) { - return ViewTypes.FOOTER.ordinal - } else if (position == editingPosition) { - return ViewTypes.EDIT_SERVER.ordinal - } else if (position == addServer) { - return ViewTypes.ADD_SERVER.ordinal - } else { - return ViewTypes.SHOW_SERVER.ordinal - } - } - - override fun onCreateViewHolder(parentView: ViewGroup, type: Int): CustomDnsItemHolder { - val inflater = LayoutInflater.from(parentView.context) - when (ViewTypes.values()[type]) { - ViewTypes.FOOTER -> { - val view = inflater.inflate(R.layout.custom_dns_footer, parentView, false) - return CustomDnsFooterHolder(view) - } - ViewTypes.ADD_SERVER -> { - val view = inflater.inflate(R.layout.add_custom_dns_server, parentView, false) - return AddCustomDnsServerHolder(view, this) - } - ViewTypes.EDIT_SERVER -> { - val view = inflater.inflate(R.layout.edit_custom_dns_server, parentView, false) - return EditCustomDnsServerHolder(view, this) - } - ViewTypes.SHOW_SERVER -> { - val view = inflater.inflate(R.layout.custom_dns_server, parentView, false) - return CustomDnsServerHolder(view, this) - } - } - } - - override fun onBindViewHolder(holder: CustomDnsItemHolder, position: Int) { - if (holder is CustomDnsServerHolder) { - holder.serverAddress = cachedCustomDnsServers[position] - } else if (holder is EditCustomDnsServerHolder) { - if (position >= cachedCustomDnsServers.size) { - holder.serverAddress = null - } else { - holder.serverAddress = cachedCustomDnsServers[position] - } - } - } - - fun onDestroy() { - jobTracker.newBackgroundJob("toggleCustomDns") { - if (cachedCustomDnsServers.isEmpty()) { - onSetCustomDnsEnabled(false) - } - } - } - - fun newDnsServer() { - jobTracker.newUiJob("newDnsServer") { - customDnsServersLock.withLock { - if (enabled) { - val count = getItemCount() - - editDnsServerAt(count - 2) - } - } - } - } - - fun saveDnsServer(address: String, errorCallback: () -> Unit) { - jobTracker.newUiJob("saveDnsServer $address") { - customDnsServersLock.withLock { - editingPosition?.let { position -> - var validAddress: Boolean - - if (position >= cachedCustomDnsServers.size) { - validAddress = addDnsServer(address) - } else { - validAddress = replaceDnsServer(address, position) - } - - if (!validAddress) { - errorCallback() - } - } - } - } - } - - fun editDnsServer(address: InetAddress) { - jobTracker.newUiJob("editDnsServer $address") { - customDnsServersLock.withLock { - if (enabled) { - val position = cachedCustomDnsServers.indexOf(address) - - editDnsServerAt(position) - } - } - } - } - - fun stopEditing() { - jobTracker.newUiJob("stopEditing") { - customDnsServersLock.withLock { - if (enabled) { - editDnsServerAt(null) - } - } - } - } - - fun stopEditing(address: InetAddress) { - jobTracker.newUiJob("stopEditing $address") { - customDnsServersLock.withLock { - if (enabled) { - editingPosition?.let { position -> - if (cachedCustomDnsServers.getOrNull(position) == address) { - editDnsServerAt(null) - } - } - } - } - } - } - - fun removeDnsServer(address: InetAddress) { - jobTracker.newUiJob("removeDnsServer $address") { - customDnsServersLock.withLock { - val position = jobTracker.runOnBackground { - val index = cachedCustomDnsServers.indexOf(address) - cachedCustomDnsServers.removeAt(index) - onRemoveDnsServer(address) - index - } - - // Immediately disable custom dns in the ui when the last server in the list has - // been removed to avoid glitches with the ADD_SERVER view. - if (cachedCustomDnsServers.size == 0) { - enabled = false - } - - notifyItemRemoved(position) - } - } - } - - private suspend fun addDnsServer(addressText: String): Boolean { - var added = false - - withValidAddress(addressText) { address -> - if (onAddServer(address)) { - cachedCustomDnsServers.add(address) - added = true - } - } - - if (added) { - editingPosition = null - - val count = getItemCount() - - notifyItemChanged(count - 3) - notifyItemInserted(count - 2) - } - - return added - } - - private suspend fun replaceDnsServer(address: String, position: Int): Boolean { - var replaced = false - - withValidAddress(address) { newAddress -> - val oldAddress = cachedCustomDnsServers[position] - - if (onReplaceDnsServer(oldAddress, newAddress)) { - cachedCustomDnsServers[position] = newAddress - replaced = true - } - } - - if (replaced) { - editingPosition = null - notifyItemChanged(position) - } - - return replaced - } - - private fun editDnsServerAt(position: Int?) { - editingPosition?.let { oldPosition -> - notifyItemChanged(oldPosition) - } - - editingPosition = position - - position?.let { newPosition -> - notifyItemChanged(newPosition) - } - } - - private suspend fun withValidAddress(addressText: String, handler: (InetAddress) -> Unit) { - jobTracker.runOnBackground { - if (inetAddressValidator.isValid(addressText)) { - val address = InetAddress.getByName(addressText) - - if (!address.isLoopbackAddress() && confirmAddAddress(address)) { - handler(address) - } - } - } - } -} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsFooterHolder.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsFooterHolder.kt deleted file mode 100644 index d09beffbce..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsFooterHolder.kt +++ /dev/null @@ -1,5 +0,0 @@ -package net.mullvad.mullvadvpn.ui.customdns - -import android.view.View - -class CustomDnsFooterHolder(view: View) : CustomDnsItemHolder(view) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsItemHolder.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsItemHolder.kt deleted file mode 100644 index cfaf9399cc..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsItemHolder.kt +++ /dev/null @@ -1,6 +0,0 @@ -package net.mullvad.mullvadvpn.ui.customdns - -import android.view.View -import androidx.recyclerview.widget.RecyclerView.ViewHolder - -abstract class CustomDnsItemHolder(view: View) : ViewHolder(view) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsServerHolder.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsServerHolder.kt deleted file mode 100644 index 49efad9310..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsServerHolder.kt +++ /dev/null @@ -1,30 +0,0 @@ -package net.mullvad.mullvadvpn.ui.customdns - -import android.view.View -import android.widget.TextView -import java.net.InetAddress -import kotlin.properties.Delegates.observable -import net.mullvad.mullvadvpn.R -import net.mullvad.talpid.util.addressString - -class CustomDnsServerHolder(view: View, adapter: CustomDnsAdapter) : CustomDnsItemHolder(view) { - private val label: TextView = view.findViewById(R.id.label) - - var serverAddress by observable<InetAddress?>(null) { _, _, address -> - label.text = address?.addressString() ?: "" - } - - init { - view.findViewById<View>(R.id.click_area).setOnClickListener { - serverAddress?.let { address -> - adapter.editDnsServer(address) - } - } - - view.findViewById<View>(R.id.remove).setOnClickListener { - serverAddress?.let { address -> - adapter.removeDnsServer(address) - } - } - } -} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/EditCustomDnsServerHolder.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/EditCustomDnsServerHolder.kt deleted file mode 100644 index 5e62f47209..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/EditCustomDnsServerHolder.kt +++ /dev/null @@ -1,89 +0,0 @@ -package net.mullvad.mullvadvpn.ui.customdns - -import android.text.Editable -import android.text.TextWatcher -import android.view.View -import android.view.View.OnFocusChangeListener -import android.widget.EditText -import java.net.InetAddress -import kotlin.properties.Delegates.observable -import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.util.setOnEnterOrDoneAction -import net.mullvad.talpid.util.addressString - -class EditCustomDnsServerHolder( - view: View, - val adapter: CustomDnsAdapter -) : CustomDnsItemHolder(view) { - private enum class State { - Normal, - Error, - } - - private val errorColor = view.context.getColor(R.color.red) - private val normalColor = view.context.getColor(R.color.blue) - - private val input: EditText = view.findViewById<EditText>(R.id.input).apply { - onFocusChangeListener = OnFocusChangeListener { _, hasFocus -> - if (!hasFocus) { - serverAddress?.let { address -> - adapter.stopEditing(address) - } - } - } - - setOnEnterOrDoneAction(::saveDnsServer) - } - - private val watcher: TextWatcher = object : TextWatcher { - override fun beforeTextChanged(text: CharSequence, start: Int, count: Int, after: Int) {} - - override fun afterTextChanged(text: Editable) { - state = State.Normal - } - - override fun onTextChanged(text: CharSequence, start: Int, before: Int, count: Int) {} - } - - private var state by observable(State.Normal) { _, oldState, newState -> - if (oldState != newState) { - input.apply { - when (newState) { - State.Normal -> { - setTextColor(normalColor) - removeTextChangedListener(watcher) - } - State.Error -> { - setTextColor(errorColor) - addTextChangedListener(watcher) - } - } - } - } - } - - var serverAddress by observable<InetAddress?>(null) { _, _, address -> - if (address != null) { - val addressString = address.addressString() - - input.setText(addressString) - input.setSelection(addressString.length) - } else { - input.setText("") - } - - input.requestFocus() - } - - init { - view.findViewById<View>(R.id.save).setOnClickListener { - saveDnsServer() - } - } - - private fun saveDnsServer() { - val onFailCallback = { state = State.Error } - - adapter.saveDnsServer(input.text.toString(), onFailCallback) - } -} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConfirmDnsDialogFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConfirmDnsDialogFragment.kt deleted file mode 100644 index 0e26163ac2..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConfirmDnsDialogFragment.kt +++ /dev/null @@ -1,66 +0,0 @@ -package net.mullvad.mullvadvpn.ui.fragment - -import android.app.Dialog -import android.content.DialogInterface -import android.graphics.drawable.ColorDrawable -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.ViewGroup.LayoutParams -import android.widget.Button -import androidx.fragment.app.DialogFragment -import kotlinx.coroutines.CompletableDeferred -import net.mullvad.mullvadvpn.R - -class ConfirmDnsDialogFragment @JvmOverloads constructor( - private var confirmation: CompletableDeferred<Boolean>? = null -) : DialogFragment() { - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val view = inflater.inflate(R.layout.confirm_dns, container, false) - - view.findViewById<Button>(R.id.back_button).setOnClickListener { - activity?.onBackPressed() - } - - view.findViewById<Button>(R.id.confirm_button).setOnClickListener { - confirmation?.complete(true) - confirmation = null - dismiss() - } - - return view - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val dialog = super.onCreateDialog(savedInstanceState) - - dialog.window?.setBackgroundDrawable(ColorDrawable(android.R.color.transparent)) - - return dialog - } - - override fun onStart() { - super.onStart() - - dialog?.window?.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) - - if (confirmation == null) { - dismiss() - } - } - - override fun onDismiss(dialogInterface: DialogInterface) { - confirmation?.complete(false) - } - - override fun onDestroy() { - confirmation?.cancel() - - super.onDestroy() - } -} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/MtuCell.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/MtuCell.kt deleted file mode 100644 index 93daba0856..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/MtuCell.kt +++ /dev/null @@ -1,85 +0,0 @@ -package net.mullvad.mullvadvpn.ui.widget - -import android.content.Context -import android.text.Editable -import android.text.TextWatcher -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.EditText -import android.widget.TextView -import kotlin.properties.Delegates.observable -import net.mullvad.mullvadvpn.R - -private const val MIN_MTU_VALUE = 1280 -private const val MAX_MTU_VALUE = 1420 - -class MtuCell : Cell { - private val input = - (LayoutInflater.from(context).inflate(R.layout.mtu_edit_text, null) as EditText).apply { - val width = resources.getDimensionPixelSize(R.dimen.cell_input_width) - val height = resources.getDimensionPixelSize(R.dimen.cell_input_height) - - layoutParams = LayoutParams(width, height, 0.0f) - - addTextChangedListener(InputWatcher()) - setOnFocusChangeListener { _, newHasFocus -> hasFocus = newHasFocus } - } - - private val validInputColor = context.getColor(R.color.white) - private val invalidInputColor = context.getColor(R.color.red) - - var value: Int? - get() = input.text.toString().trim().toIntOrNull() - set(value) = input.setText(value?.toString() ?: "") - - var onSubmit: ((Int?) -> Unit)? = null - - var hasFocus by observable(false) { _, oldValue, newValue -> - if (oldValue && !newValue) { - val mtu = value - - if (mtu == null || (mtu in MIN_MTU_VALUE..MAX_MTU_VALUE)) { - onSubmit?.invoke(mtu) - } - } - } - - @JvmOverloads - constructor( - context: Context, - attributes: AttributeSet? = null, - defaultStyleAttribute: Int = 0, - defaultStyleResource: Int = 0 - ) : super( - context, - attributes, - defaultStyleAttribute, - defaultStyleResource, - TextView(context) - ) { - cell.apply { - setEnabled(false) - setFocusable(false) - addView(input) - } - - footer?.text = - context.getString(R.string.wireguard_mtu_footer, MIN_MTU_VALUE, MAX_MTU_VALUE) - } - - inner class InputWatcher : TextWatcher { - override fun beforeTextChanged(text: CharSequence, start: Int, count: Int, after: Int) {} - - override fun onTextChanged(text: CharSequence, start: Int, count: Int, after: Int) {} - - override fun afterTextChanged(text: Editable) { - val value = text.toString().trim().toIntOrNull() - - if (value != null && value >= MIN_MTU_VALUE && value <= MAX_MTU_VALUE) { - input.setTextColor(validInputColor) - } else { - input.setTextColor(invalidInputColor) - } - } - } -} diff --git a/android/app/src/main/res/drawable/cell_input_background.xml b/android/app/src/main/res/drawable/cell_input_background.xml deleted file mode 100644 index 436b3adb6e..0000000000 --- a/android/app/src/main/res/drawable/cell_input_background.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <corners android:radius="4dp" /> - <solid android:color="@color/white10" /> -</shape> diff --git a/android/app/src/main/res/drawable/cell_input_cursor.xml b/android/app/src/main/res/drawable/cell_input_cursor.xml deleted file mode 100644 index 781c1d9b87..0000000000 --- a/android/app/src/main/res/drawable/cell_input_cursor.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@color/white" /> - <size android:width="1sp" - android:height="24sp" /> -</shape> diff --git a/android/app/src/main/res/drawable/icon_add.xml b/android/app/src/main/res/drawable/icon_add.xml deleted file mode 100644 index f44a660a95..0000000000 --- a/android/app/src/main/res/drawable/icon_add.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<rotate xmlns:android="http://schemas.android.com/apk/res/android" - android:fromDegrees="45" - android:toDegrees="45" - android:pivotX="50%" - android:pivotY="50%" - android:drawable="@drawable/icon_close" /> diff --git a/android/app/src/main/res/drawable/icon_check.xml b/android/app/src/main/res/drawable/icon_check.xml deleted file mode 100644 index b5bbbc6dd2..0000000000 --- a/android/app/src/main/res/drawable/icon_check.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <group> - <path android:fillColor="@color/colorPrimary" - android:pathData="M12,24A12,12 0,0 1,3.515 3.515a12,12 0,1 1,16.97 16.97A11.922,11.922 0,0 1,12 24zM5.345,10.9a1.108,1.108 0,0 0,-0.785 0.322,1.095 1.095,0 0,0 0,1.556L9,17.177a1.115,1.115 0,0 0,1.569 0l8.874,-8.8a1.095,1.095 0,0 0,0 -1.556,1.116 1.116,0 0,0 -1.569,0l-8.092,8.024 -3.653,-3.623a1.106,1.106 0,0 0,-0.784 -0.322z" /> - </group> -</vector> diff --git a/android/app/src/main/res/layout/add_custom_dns_server.xml b/android/app/src/main/res/layout/add_custom_dns_server.xml deleted file mode 100644 index 892b48a6fe..0000000000 --- a/android/app/src/main/res/layout/add_custom_dns_server.xml +++ /dev/null @@ -1,31 +0,0 @@ -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/blue40" - android:orientation="horizontal"> - <TextView android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_marginLeft="54dp" - android:layout_marginVertical="14dp" - android:background="?android:attr/selectableItemBackground" - android:gravity="center_vertical" - android:textColor="@color/white" - android:textSize="@dimen/text_medium" - android:text="@string/add_a_server" /> - <View android:id="@+id/click_area" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_alignParentLeft="true" - android:layout_alignParentRight="true" - android:focusable="true" - android:clickable="true" - android:background="?android:attr/selectableItemBackground" /> - <ImageButton android:id="@+id/add" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="right" - android:paddingHorizontal="16dp" - android:paddingVertical="14dp" - android:background="?android:attr/selectableItemBackground" - android:src="@drawable/icon_add" /> -</FrameLayout> diff --git a/android/app/src/main/res/layout/advanced.xml b/android/app/src/main/res/layout/advanced.xml deleted file mode 100644 index 42f94b7b7f..0000000000 --- a/android/app/src/main/res/layout/advanced.xml +++ /dev/null @@ -1,34 +0,0 @@ -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:mullvad="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/darkBlue" - android:gravity="left"> - <TextView android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/settings_advanced" - style="@style/SettingsCollapsedHeader" /> - <LinearLayout android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - <FrameLayout android:layout_width="match_parent" - android:layout_height="wrap_content"> - <net.mullvad.mullvadvpn.ui.widget.BackButton android:id="@+id/back" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - mullvad:text="@string/settings" /> - <TextView android:id="@+id/collapsed_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginHorizontal="4dp" - android:layout_gravity="center" - android:text="@string/settings_advanced" - style="@style/SettingsCollapsedHeader" /> - </FrameLayout> - <net.mullvad.mullvadvpn.ui.widget.CustomRecyclerView android:id="@+id/contents" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:scrollbars="vertical" /> - </LinearLayout> -</FrameLayout> diff --git a/android/app/src/main/res/layout/advanced_header.xml b/android/app/src/main/res/layout/advanced_header.xml deleted file mode 100644 index 70a583ea7c..0000000000 --- a/android/app/src/main/res/layout/advanced_header.xml +++ /dev/null @@ -1,32 +0,0 @@ -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:mullvad="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:gravity="left"> - <TextView android:id="@+id/expanded_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="2dp" - android:layout_marginLeft="@dimen/side_margin" - android:lines="1" - android:text="@string/settings_advanced" - style="@style/SettingsExpandedHeader" /> - <net.mullvad.mullvadvpn.ui.widget.MtuCell android:id="@+id/wireguard_mtu" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/vertical_space" - android:focusable="true" - android:focusableInTouchMode="true" - mullvad:text="@string/wireguard_mtu" /> - <net.mullvad.mullvadvpn.ui.widget.NavigateCell android:id="@+id/split_tunneling" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/vertical_space" - mullvad:text="@string/split_tunneling" /> - <net.mullvad.mullvadvpn.ui.widget.ToggleCell android:id="@+id/enable_custom_dns" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/vertical_space" - mullvad:text="@string/enable_custom_dns" /> -</LinearLayout> diff --git a/android/app/src/main/res/layout/confirm_dns.xml b/android/app/src/main/res/layout/confirm_dns.xml deleted file mode 100644 index 6c7266eae9..0000000000 --- a/android/app/src/main/res/layout/confirm_dns.xml +++ /dev/null @@ -1,31 +0,0 @@ -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:scrollbars="none"> - <LinearLayout android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:padding="30dp" - android:background="@drawable/dialog_background" - android:orientation="vertical" - android:gravity="left"> - <ImageView android:layout_width="44dp" - android:layout_height="44dp" - android:layout_marginTop="8dp" - android:layout_gravity="center" - android:src="@drawable/icon_alert" /> - <TextView android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="0" - android:layout_marginTop="16dp" - android:textColor="@color/white80" - android:textSize="@dimen/text_small" - android:text="@string/confirm_local_dns" /> - <Button android:id="@+id/confirm_button" - android:layout_marginVertical="@dimen/button_separation" - android:text="@string/add_anyway" - style="@style/RedButton" /> - <Button android:id="@+id/back_button" - android:text="@string/back" - style="@style/BlueButton" /> - </LinearLayout> -</ScrollView> diff --git a/android/app/src/main/res/layout/custom_dns_footer.xml b/android/app/src/main/res/layout/custom_dns_footer.xml deleted file mode 100644 index c939eebb7f..0000000000 --- a/android/app/src/main/res/layout/custom_dns_footer.xml +++ /dev/null @@ -1,14 +0,0 @@ -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center"> - <TextView android:id="@+id/name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingHorizontal="@dimen/cell_footer_horizontal_padding" - android:paddingBottom="@dimen/screen_vertical_margin" - android:paddingTop="@dimen/cell_footer_top_padding" - android:textColor="@color/white60" - android:textSize="@dimen/text_small" - android:text="@string/custom_dns_footer" /> -</FrameLayout> diff --git a/android/app/src/main/res/layout/custom_dns_server.xml b/android/app/src/main/res/layout/custom_dns_server.xml deleted file mode 100644 index 54d7e9f01e..0000000000 --- a/android/app/src/main/res/layout/custom_dns_server.xml +++ /dev/null @@ -1,31 +0,0 @@ -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/blue40" - android:orientation="horizontal"> - <TextView android:id="@+id/label" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_marginLeft="54dp" - android:layout_marginVertical="14dp" - android:background="?android:attr/selectableItemBackground" - android:gravity="center_vertical" - android:textColor="@color/white" - android:textSize="@dimen/text_medium" /> - <View android:id="@+id/click_area" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_alignParentLeft="true" - android:layout_alignParentRight="true" - android:focusable="true" - android:clickable="true" - android:background="?android:attr/selectableItemBackground" /> - <ImageButton android:id="@+id/remove" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="right" - android:paddingHorizontal="16dp" - android:paddingVertical="14dp" - android:background="?android:attr/selectableItemBackground" - android:src="@drawable/icon_close" /> -</FrameLayout> diff --git a/android/app/src/main/res/layout/edit_custom_dns_server.xml b/android/app/src/main/res/layout/edit_custom_dns_server.xml deleted file mode 100644 index 855504f077..0000000000 --- a/android/app/src/main/res/layout/edit_custom_dns_server.xml +++ /dev/null @@ -1,30 +0,0 @@ -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/white" - android:orientation="horizontal"> - <EditText android:id="@+id/input" - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_weight="1" - android:layout_marginLeft="54dp" - android:layout_marginVertical="14dp" - android:gravity="center_vertical" - android:background="@android:color/transparent" - android:singleLine="true" - android:imeOptions="flagNoPersonalizedLearning" - android:textCursorDrawable="@drawable/text_input_cursor" - android:textColorHint="@color/blue60" - android:textColor="@color/blue" - android:textSize="@dimen/text_medium" - android:hint="@string/custom_dns_hint" /> - <ImageButton android:id="@+id/save" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_weight="0" - android:layout_gravity="right" - android:paddingHorizontal="16dp" - android:paddingVertical="14dp" - android:background="?android:attr/selectableItemBackground" - android:src="@drawable/icon_check" /> -</LinearLayout> diff --git a/android/app/src/main/res/layout/mtu_edit_text.xml b/android/app/src/main/res/layout/mtu_edit_text.xml deleted file mode 100644 index 11334cf4c1..0000000000 --- a/android/app/src/main/res/layout/mtu_edit_text.xml +++ /dev/null @@ -1,14 +0,0 @@ -<EditText xmlns:android="http://schemas.android.com/apk/res/android" - android:paddingHorizontal="8dp" - android:paddingVertical="4dp" - android:background="@drawable/cell_input_background" - android:digits="0123456789" - android:inputType="number" - android:singleLine="true" - android:imeOptions="flagNoPersonalizedLearning" - android:textCursorDrawable="@drawable/cell_input_cursor" - android:gravity="center" - android:hint="@string/hint_default" - android:textColorHint="@color/white80" - android:textColor="@color/white" - android:textSize="@dimen/text_medium_plus" /> diff --git a/android/app/src/main/res/values-da/strings.xml b/android/app/src/main/res/values-da/strings.xml index b7ed47f668..41e79658f5 100644 --- a/android/app/src/main/res/values-da/strings.xml +++ b/android/app/src/main/res/values-da/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Viser påmindelser, når kontotiden er ved at udløbe</string> <string name="account_time_notification_channel_name">Påmindelser om kontotid</string> <string name="add_a_server">Tilføj en server</string> - <string name="add_anyway">Tilføj alligevel</string> <string name="add_time_to_account">Køb enten kredit på vores hjemmeside, eller indløs en kupon.</string> <string name="all_applications">Alle applikationer</string> <string name="allow_lan_footer">Giver adgang til andre enheder på det samme netværk til deling, udskrivning osv.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">OPRETTER SIKKER FORBINDELSE</string> <string name="critical_error">Kritisk fejl (som kræver din opmærksomhed)</string> <string name="custom_dns_footer">Aktiver for at tilføje mindst én DNS-server.</string> - <string name="custom_dns_hint">Indtast IP</string> <string name="custom_tunnel_host_resolution_error">Kunne ikke fortolke værtsnavnet på den tilpassede server</string> <string name="device_inactive_description">Du har fjernet denne enhed. For at oprette forbindelse igen skal du logge ind igen.</string> <string name="device_inactive_title">Enheden er inaktiv</string> diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml index 476caab0bc..072de1fe8a 100644 --- a/android/app/src/main/res/values-de/strings.xml +++ b/android/app/src/main/res/values-de/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Erinnerungen anzeigen, wenn die Kontozeit bald abläuft</string> <string name="account_time_notification_channel_name">Erinnerungen an die Kontozeit</string> <string name="add_a_server">Server hinzufügen</string> - <string name="add_anyway">Trotzdem hinzufügen</string> <string name="add_time_to_account">Kaufen Sie entweder Guthaben über unsere Seite oder lösen Sie einen Gutschein ein.</string> <string name="all_applications">Alle Anwendungen</string> <string name="allow_lan_footer">Ermöglicht den Zugriff auf andere Geräte im selben Netzwerk zum Teilen von Dateien, Drucken etc.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">SICHERE VERBINDUNG WIRD ERSTELLT</string> <string name="critical_error">Kritischer Fehler (Ihre Aufmerksamkeit ist erforderlich)</string> <string name="custom_dns_footer">Aktivieren, um mindestens einen DNS-Server hinzuzufügen.</string> - <string name="custom_dns_hint">IP eingeben</string> <string name="custom_tunnel_host_resolution_error">Der Hostname des benutzerdefinierten Servers konnte nicht aufgelöst werden</string> <string name="device_inactive_description">Sie haben dieses Gerät entfernt. Um sich erneut zu verbinden, müssen Sie sich erneut anmelden.</string> <string name="device_inactive_title">Gerät ist inaktiv</string> diff --git a/android/app/src/main/res/values-es/strings.xml b/android/app/src/main/res/values-es/strings.xml index 13bdc1d505..52b5381c0d 100644 --- a/android/app/src/main/res/values-es/strings.xml +++ b/android/app/src/main/res/values-es/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Muestra avisos cuando el tiempo de la cuenta está a punto de caducar</string> <string name="account_time_notification_channel_name">Recordatorios de tiempo de la cuenta</string> <string name="add_a_server">Añadir un servidor</string> - <string name="add_anyway">Añadir de todos modos</string> <string name="add_time_to_account">Compre crédito en nuestro sitio web o canjee un cupón.</string> <string name="all_applications">Todas las aplicaciones</string> <string name="allow_lan_footer">Permite el acceso a otros dispositivos de la misma red para compartir archivos, imprimir, etc.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">CREANDO CONEXIÓN SEGURA</string> <string name="critical_error">Error crítico (precisa su atención)</string> <string name="custom_dns_footer">Active esta opción para agregar como mínimo un servidor DNS.</string> - <string name="custom_dns_hint">Escriba la IP</string> <string name="custom_tunnel_host_resolution_error">No se puede resolver el nombre de host del servidor personalizado</string> <string name="device_inactive_description">Ha quitado este dispositivo. Vuelva a iniciar la sesión para conectarse.</string> <string name="device_inactive_title">El dispositivo está inactivo</string> diff --git a/android/app/src/main/res/values-fi/strings.xml b/android/app/src/main/res/values-fi/strings.xml index 5847fe930f..fa4d54f1d7 100644 --- a/android/app/src/main/res/values-fi/strings.xml +++ b/android/app/src/main/res/values-fi/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Näyttää muistutuksia, kun tilin käyttöaika on umpeutumassa</string> <string name="account_time_notification_channel_name">Muistutukset tilin käyttöajasta</string> <string name="add_a_server">Lisää palvelin</string> - <string name="add_anyway">Lisää silti</string> <string name="add_time_to_account">Osta käyttöaikaa verkkosivustoltamme tai lunasta kuponki.</string> <string name="all_applications">Kaikki sovellukset</string> <string name="allow_lan_footer">Sallii jakamisen, tulostuksen ym. saman verkon muille laitteille.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">LUODAAN SUOJATTU YHTEYS</string> <string name="critical_error">Vakava virhe (vaatii huomiotasi)</string> <string name="custom_dns_footer">Ota käyttöön lisätäksesi vähintään yhden DNS-palvelimen.</string> - <string name="custom_dns_hint">Anna IP-osoite</string> <string name="custom_tunnel_host_resolution_error">Mukautetun palvelimen isäntänimen selvittäminen epäonnistui</string> <string name="device_inactive_description">Olet poistanut tämän laitteen. Jos haluat muodostaa yhteyden uudelleen, sinun täytyy kirjautua takaisin sisään.</string> <string name="device_inactive_title">Laite ei ole aktiivinen</string> diff --git a/android/app/src/main/res/values-fr/strings.xml b/android/app/src/main/res/values-fr/strings.xml index 0c8ee02884..8c32c7ddc6 100644 --- a/android/app/src/main/res/values-fr/strings.xml +++ b/android/app/src/main/res/values-fr/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Affiche des rappels lorsque le temps du compte va expirer</string> <string name="account_time_notification_channel_name">Rappels de temps pour le compte</string> <string name="add_a_server">Ajouter un serveur</string> - <string name="add_anyway">Ajouter quand même</string> <string name="add_time_to_account">Achetez du crédit sur notre site web ou échangez un bon.</string> <string name="all_applications">Toutes les applications</string> <string name="allow_lan_footer">Autorise l\'accès aux autres appareils sur le même réseau pour partager, imprimer, etc.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">CRÉATION D\'UNE CONNEXION SÉCURISÉE</string> <string name="critical_error">Erreur critique (votre attention est requise)</string> <string name="custom_dns_footer">Activez pour ajouter au moins un serveur DNS.</string> - <string name="custom_dns_hint">Saisir l\'IP</string> <string name="custom_tunnel_host_resolution_error">Échec de la résolution du nom d\'hôte du serveur personnalisé</string> <string name="device_inactive_description">Vous avez supprimé cet appareil. Vous devrez vous reconnecter pour connecter cet appareil à nouveau.</string> <string name="device_inactive_title">L\'appareil est inactif</string> diff --git a/android/app/src/main/res/values-it/strings.xml b/android/app/src/main/res/values-it/strings.xml index 51bcdaff09..be38a145fe 100644 --- a/android/app/src/main/res/values-it/strings.xml +++ b/android/app/src/main/res/values-it/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Mostra promemoria quando il tempo dell\'account sta per scadere</string> <string name="account_time_notification_channel_name">Promemoria temporali per l\'account</string> <string name="add_a_server">Aggiungi un server</string> - <string name="add_anyway">Aggiungi comunque</string> <string name="add_time_to_account">Acquista credito sul nostro sito web o riscatta un voucher.</string> <string name="all_applications">Tutte le applicazioni</string> <string name="allow_lan_footer">Consenti l\'accesso ad altri dispositivi sulla stessa rete per condividere, stampare e altro.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">CREAZIONE CONNESSIONE PROTETTA</string> <string name="critical_error">Errore critico (è necessario intervenire)</string> <string name="custom_dns_footer">Abilita per aggiungere almeno un server DNS.</string> - <string name="custom_dns_hint">Inserisci IP</string> <string name="custom_tunnel_host_resolution_error">Impossibile risolvere il nome host del server personalizzato</string> <string name="device_inactive_description">Hai rimosso questo dispositivo. Per riconnetterti, dovrai effettuare nuovamente il login.</string> <string name="device_inactive_title">Il dispositivo è inattivo</string> diff --git a/android/app/src/main/res/values-ja/strings.xml b/android/app/src/main/res/values-ja/strings.xml index 8072f2ae86..d48abcd90a 100644 --- a/android/app/src/main/res/values-ja/strings.xml +++ b/android/app/src/main/res/values-ja/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">アカウントの期限切れが迫っているときにリマインダーを表示します</string> <string name="account_time_notification_channel_name">アカウント時間のリマインダー</string> <string name="add_a_server">サーバーを追加</string> - <string name="add_anyway">追加を続ける</string> <string name="add_time_to_account">当社ウェブサイトでクレジットを購入するか、バウチャーを使用してください。</string> <string name="all_applications">すべてのアプリケーション</string> <string name="allow_lan_footer">共有や印刷などのため、同一ネットワーク上の他のデバイスへのアクセスを許可します。</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">セキュリティ保護接続を確立中</string> <string name="critical_error">重大なエラー (ご注意ください)</string> <string name="custom_dns_footer">1つ以上のDNSサーバーを追加するには有効にしてください。</string> - <string name="custom_dns_hint">IPを入力</string> <string name="custom_tunnel_host_resolution_error">カスタムサーバーのホスト名を解決できませんでした</string> <string name="device_inactive_description">このデバイスを削除しました。再度接続するには、ログインし直す必要があります。</string> <string name="device_inactive_title">デバイスが無効です</string> diff --git a/android/app/src/main/res/values-ko/strings.xml b/android/app/src/main/res/values-ko/strings.xml index e40286aa59..4b76cc5175 100644 --- a/android/app/src/main/res/values-ko/strings.xml +++ b/android/app/src/main/res/values-ko/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">계정 시간이 만료되려고 할 때 알림 표시</string> <string name="account_time_notification_channel_name">계정 시간 알림</string> <string name="add_a_server">서버 추가</string> - <string name="add_anyway">추가</string> <string name="add_time_to_account">웹 사이트에서 크레딧을 구매하거나 바우처를 사용하세요.</string> <string name="all_applications">모든 애플리케이션</string> <string name="allow_lan_footer">공유, 인쇄 등을 위해 동일한 네트워크의 다른 장치에 액세스할 수 있습니다.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">보안 연결 생성 중</string> <string name="critical_error">심각한 오류(주의가 필요함)</string> <string name="custom_dns_footer">하나 이상의 DNS 서버를 추가하려면 활성화합니다.</string> - <string name="custom_dns_hint">IP 입력</string> <string name="custom_tunnel_host_resolution_error">사용자 지정 서버의 호스트 이름을 확인하지 못함</string> <string name="device_inactive_description">이 장치를 제거했습니다. 다시 연결하려면 다시 로그인해야 합니다.</string> <string name="device_inactive_title">장치가 비활성 상태입니다.</string> diff --git a/android/app/src/main/res/values-my/strings.xml b/android/app/src/main/res/values-my/strings.xml index cdf8a4f56c..1feff0574f 100644 --- a/android/app/src/main/res/values-my/strings.xml +++ b/android/app/src/main/res/values-my/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">အကောင့်အချိန် သက်တမ်းကုန်ခါနီးချိန်၌ သတိပေးချက်များ ပြသပေးပါသည်</string> <string name="account_time_notification_channel_name">အကောင့်အချိန် သတိပေးချက်များ</string> <string name="add_a_server">ဆာဗာ ပေါင်းထည့်ရန်</string> - <string name="add_anyway">မည်သို့ပင်ဖြစ်စေ ပေါင်းထည့်ရန်</string> <string name="add_time_to_account">ကျွန်ုပ်တို့၏ ဝက်ဘ်ဆိုက်တွင် ခရက်ဒစ် ဝယ်ယူပါ သို့မဟုတ် ဘောက်ချာဖြင့် လဲယူပါ။</string> <string name="all_applications">အပလီကေးရှင်း အားလုံး</string> <string name="allow_lan_footer">ဝေမျှရန်၊ ပရင့်ထုတ်ရန်စသည်တို့အတွက် တူညီသည့် ကွန်ရက်ရှိ အခြားစက်များ ရယူသုံးစွဲခွင့်ပြုပေးပါသည်။</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">လုံခြုံသည့် ချိတ်ဆက်မှုကို ဖန်တီးနေပါသည်</string> <string name="critical_error">အလွန်အရေးပါသည့် ချို့ယွင်းချက် (သင့်အာရုံစိုက်မှု လိုအပ်ပါသည်)</string> <string name="custom_dns_footer">အနည်းဆုံး DNS ဆာဗာတစ်ခုကို ပေါင်းထည့်ပါ။</string> - <string name="custom_dns_hint">IP ဖြည့်ပါ</string> <string name="custom_tunnel_host_resolution_error">စိတ်ကြိုက် ဆာဗာ၏ Hostname ကို ဖြေရှင်း၍ မရနိုင်ပါ</string> <string name="device_inactive_description">ဤစက်ကို ဖယ်ရှားပြီး ဖြစ်သည်။ ထပ်မံချိတ်ဆက်ရန်အတွက် ပြန်လည် ဝင်ရောက်ရန် လိုပါသည်။</string> <string name="device_inactive_title">စက်သည် သက်ဝင်လုပ်ဆောင်မှု မရှိပါ</string> diff --git a/android/app/src/main/res/values-nb/strings.xml b/android/app/src/main/res/values-nb/strings.xml index 3fed35b942..07d6cbd657 100644 --- a/android/app/src/main/res/values-nb/strings.xml +++ b/android/app/src/main/res/values-nb/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Viser påminnelser når tidsavbrudd for kontoen er i ferd med å inntreffe</string> <string name="account_time_notification_channel_name">Påminnelser om tidsavbrudd for konto</string> <string name="add_a_server">Legg til en server</string> - <string name="add_anyway">Legg til likevel</string> <string name="add_time_to_account">Du kan enten kjøpe kreditt på nettsiden vår eller løse inn en kupong.</string> <string name="all_applications">Alle applikasjoner</string> <string name="allow_lan_footer">Gir tilgang til andre enheter på samme nettverk for deling, utskrift osv.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">OPPRETTER SIKKER TILKOBLING</string> <string name="critical_error">Kritisk feil (krever din oppmerksomhet)</string> <string name="custom_dns_footer">Aktiver for å legge til minst én DNS-server.</string> - <string name="custom_dns_hint">Angi IP</string> <string name="custom_tunnel_host_resolution_error">Kunne ikke løse vertsnavnet til den egendefinerte serveren</string> <string name="device_inactive_description">Du har fjernet denne enheten. For å koble til igjen, må du logge inn på nytt.</string> <string name="device_inactive_title">Enheten er inaktiv</string> diff --git a/android/app/src/main/res/values-nl/strings.xml b/android/app/src/main/res/values-nl/strings.xml index 442d0de4c3..dda01f6c11 100644 --- a/android/app/src/main/res/values-nl/strings.xml +++ b/android/app/src/main/res/values-nl/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Toont herinneringen wanneer de accounttijd op het punt staat te verlopen</string> <string name="account_time_notification_channel_name">Accounttijdherinneringen</string> <string name="add_a_server">Server toevoegen</string> - <string name="add_anyway">Toch toevoegen</string> <string name="add_time_to_account">Koop krediet op onze website of wissel een voucher in.</string> <string name="all_applications">Alle toepassingen</string> <string name="allow_lan_footer">Biedt toegang tot andere apparaten op hetzelfde netwerk voor delen, afdrukken en dergelijke</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">BEVEILIGDE VERBINDING AANMAKEN</string> <string name="critical_error">Kritieke fout (uw aandacht is vereist)</string> <string name="custom_dns_footer">Schakel in om minimaal één DNS-server toe te voegen.</string> - <string name="custom_dns_hint">Voer IP-adres in</string> <string name="custom_tunnel_host_resolution_error">Kon de hostnaam van de aangepaste server niet omzetten</string> <string name="device_inactive_description">U hebt dit apparaat verwijderd. U moet zich opnieuw aanmelden om het opnieuw te verbinden.</string> <string name="device_inactive_title">Apparaat is niet actief</string> diff --git a/android/app/src/main/res/values-pl/strings.xml b/android/app/src/main/res/values-pl/strings.xml index d07c6eb5a7..2e94cb447c 100644 --- a/android/app/src/main/res/values-pl/strings.xml +++ b/android/app/src/main/res/values-pl/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Pokazuje przypomnienia, gdy kończy się czas na koncie</string> <string name="account_time_notification_channel_name">Przypomnienia o czasie na koncie</string> <string name="add_a_server">Dodaj serwer</string> - <string name="add_anyway">Mimo to dodaj</string> <string name="add_time_to_account">Doładuj w naszej witrynie internetowej lub zrealizuj kupon.</string> <string name="all_applications">Wszystkie aplikacje</string> <string name="allow_lan_footer">Umożliwia dostęp do innych urządzeń w tej samej sieci w celu udostępniania, drukowania itd.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">TWORZENIE BEZPIECZNEGO POŁĄCZENIA</string> <string name="critical_error">Błąd krytyczny (wymagana uwaga)</string> <string name="custom_dns_footer">Włącz, aby dodać co najmniej jeden serwer DNS.</string> - <string name="custom_dns_hint">Wprowadź adres IP</string> <string name="custom_tunnel_host_resolution_error">Nie można rozpoznać nazwy hosta serwera niestandardowego</string> <string name="device_inactive_description">Urządzenie usunięto. Aby połączyć się ponownie, musisz się ponownie zalogować.</string> <string name="device_inactive_title">Urządzenie nieaktywne</string> diff --git a/android/app/src/main/res/values-pt/strings.xml b/android/app/src/main/res/values-pt/strings.xml index c99e0fc70c..50f688114a 100644 --- a/android/app/src/main/res/values-pt/strings.xml +++ b/android/app/src/main/res/values-pt/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Mostra lembretes quando o tempo da conta está prestes a expirar</string> <string name="account_time_notification_channel_name">Lembretes de tempo da conta</string> <string name="add_a_server">Adicionar um servidor</string> - <string name="add_anyway">Adicionar mesmo assim</string> <string name="add_time_to_account">Compre crédito no nosso sítio da web ou reclame um voucher.</string> <string name="all_applications">Todas as aplicações</string> <string name="allow_lan_footer">Permite o acesso a outros dispositivos na mesma rede para partilha, impressão, etc.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">A CRIAR LIGAÇÃO SEGURA</string> <string name="critical_error">Erro crítico (é necessária a sua atenção)</string> <string name="custom_dns_footer">Ativar para adicionar pelo menos um servidor DNS.</string> - <string name="custom_dns_hint">Introduzir IP</string> <string name="custom_tunnel_host_resolution_error">Não foi possível resolver o nome do anfitrião do servidor personalizado</string> <string name="device_inactive_description">Removeu este dispositivo. Para voltar a ligar o dispositivo, terá de voltar a iniciar a sessão.</string> <string name="device_inactive_title">O dispositivo está desativado</string> diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index ffe73a4aae..2431264cd9 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Показывает уведомления, когда время на учетной записи скоро закончится</string> <string name="account_time_notification_channel_name">Напоминания о времени на учетной записи</string> <string name="add_a_server">Добавить сервер</string> - <string name="add_anyway">Всё равно добавить</string> <string name="add_time_to_account">Пополните баланс у нас на сайте или погасите ваучер.</string> <string name="all_applications">Все приложения</string> <string name="allow_lan_footer">Разрешить доступ к другим устройствам в той же сети для передачи данных, печати и т. д.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">СОЗДАНИЕ ЗАЩИЩЕННОГО ПОДКЛЮЧЕНИЯ</string> <string name="critical_error">Критическая ошибка (требуется ваше участие)</string> <string name="custom_dns_footer">Чтобы добавить как минимум один DNS-сервер, включите этот параметр.</string> - <string name="custom_dns_hint">Введите IP-адрес</string> <string name="custom_tunnel_host_resolution_error">Не удалось преобразовать имя узла пользовательского сервера</string> <string name="device_inactive_description">Вы удалили это устройство. Чтобы снова подключиться, нужно будет выполнить вход.</string> <string name="device_inactive_title">Устройство неактивно</string> diff --git a/android/app/src/main/res/values-sv/strings.xml b/android/app/src/main/res/values-sv/strings.xml index 116c34f7d4..f132492fb0 100644 --- a/android/app/src/main/res/values-sv/strings.xml +++ b/android/app/src/main/res/values-sv/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Visar påminnelser när kontots tidsgräns uppnås</string> <string name="account_time_notification_channel_name">Påminnelser om kontotid</string> <string name="add_a_server">Lägg till en server</string> - <string name="add_anyway">Lägg till ändå</string> <string name="add_time_to_account">Du kan antingen köpa kredit på vår webbplats eller lösa in en kupong.</string> <string name="all_applications">Alla applikationer</string> <string name="allow_lan_footer">Tillåter åtkomst till andra enheter i samma nätverk för delning, utskrift etc.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">SKAPAR SÄKER ANSLUTNING</string> <string name="critical_error">Kritiskt fel (kräver din uppmärksamhet)</string> <string name="custom_dns_footer">Aktivera för att lägga till minst en DNS-server.</string> - <string name="custom_dns_hint">Ange IP</string> <string name="custom_tunnel_host_resolution_error">Det gick inte att lösa värdnamnet för den anpassade servern</string> <string name="device_inactive_description">Du har tagit bort den här enheten. Du måste logga in igen för att återansluta.</string> <string name="device_inactive_title">Enheten är inaktiv</string> diff --git a/android/app/src/main/res/values-th/strings.xml b/android/app/src/main/res/values-th/strings.xml index 4472175d61..c3e826cc5e 100644 --- a/android/app/src/main/res/values-th/strings.xml +++ b/android/app/src/main/res/values-th/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">แสดงการแจ้งเตือน ในขณะที่เวลาบัญชีใกล้หมดอายุ</string> <string name="account_time_notification_channel_name">การแจ้งเตือนเวลาบัญชี</string> <string name="add_a_server">เพิ่มเซิร์ฟเวอร์</string> - <string name="add_anyway">เพิ่มต่อไป</string> <string name="add_time_to_account">ซื้อเครดิตบนเว็บไซต์ของเรา หรือแลกรับบัตรกำนัล</string> <string name="all_applications">แอปพลิเคชันทั้งหมด</string> <string name="allow_lan_footer">อนุญาตให้เข้าถึงอุปกรณ์อื่นๆ บนเครือข่ายเดียวกัน เพื่อแชร์ พิมพ์ ฯลฯ</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">กำลังสร้างการเชื่อมต่อที่ปลอดภัย</string> <string name="critical_error">ข้อผิดพลาดร้ายแรง (คุณจำเป็นต้องตรวจสอบ)</string> <string name="custom_dns_footer">เปิดเพื่อเพิ่มเซิร์ฟเวอร์ DNS อย่างน้อยหนึ่งรายการ</string> - <string name="custom_dns_hint">ป้อน IP</string> <string name="custom_tunnel_host_resolution_error">ไม่พบชื่อโฮสต์ของเซิร์ฟเวอร์แบบกำหนดเอง</string> <string name="device_inactive_description">คุณได้ลบอุปกรณ์เครื่องนี้แล้ว หากต้องการเชื่อมต่ออีกครั้ง คุณจะต้องเข้าสู่ระบบใหม่อีกครั้ง</string> <string name="device_inactive_title">อุปกรณ์ไม่ได้ใช้งาน</string> diff --git a/android/app/src/main/res/values-tr/strings.xml b/android/app/src/main/res/values-tr/strings.xml index 756baf5dbe..7acbbed720 100644 --- a/android/app/src/main/res/values-tr/strings.xml +++ b/android/app/src/main/res/values-tr/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">Hesap süresinin dolmak üzere olduğunu bildiren hatırlatıcıları gösterir</string> <string name="account_time_notification_channel_name">Hesap süresi hatırlatıcıları</string> <string name="add_a_server">Sunucu ekle</string> - <string name="add_anyway">Yine de ekle</string> <string name="add_time_to_account">Web sitemizden kredi satın alın veya kupon kullanın.</string> <string name="all_applications">Tüm uygulamalar</string> <string name="allow_lan_footer">Paylaşım, yazdırma vb. için aynı ağdaki diğer cihazlara erişime izin verir.</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">GÜVENLİ BAĞLANTI OLUŞTURULUYOR</string> <string name="critical_error">Kritik hata (Lütfen dikkatli olun)</string> <string name="custom_dns_footer">En az bir DNS sunucusu eklemek için etkinleştirin.</string> - <string name="custom_dns_hint">IP\'yi girin</string> <string name="custom_tunnel_host_resolution_error">Özel sunucu ana bilgisayar adı çözülemiyor</string> <string name="device_inactive_description">Bu cihazı kaldırdın. Tekrar bağlanmak için yeniden giriş yapmanız gerekecek.</string> <string name="device_inactive_title">Cihaz etkin değil</string> diff --git a/android/app/src/main/res/values-zh-rCN/strings.xml b/android/app/src/main/res/values-zh-rCN/strings.xml index fa1b258fb3..16394cc3fb 100644 --- a/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/android/app/src/main/res/values-zh-rCN/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">在帐户时间即将到期时显示提醒</string> <string name="account_time_notification_channel_name">帐户时间提醒</string> <string name="add_a_server">添加服务器</string> - <string name="add_anyway">仍然添加</string> <string name="add_time_to_account">在我们的网站上购买额度或兑换优惠券。</string> <string name="all_applications">所有应用程序</string> <string name="allow_lan_footer">允许访问同一个网络上的其他设备以进行共享和打印等。</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">正在创建安全连接</string> <string name="critical_error">严重错误(需要注意)</string> <string name="custom_dns_footer">启用以添加至少一个 DNS 服务器。</string> - <string name="custom_dns_hint">输入 IP</string> <string name="custom_tunnel_host_resolution_error">无法解析自定义服务器的主机名</string> <string name="device_inactive_description">您已移除此设备。要重新连接,您需要重新登录。</string> <string name="device_inactive_title">设备处于非活动状态</string> diff --git a/android/app/src/main/res/values-zh-rTW/strings.xml b/android/app/src/main/res/values-zh-rTW/strings.xml index 68526a45ac..6e32faf157 100644 --- a/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/android/app/src/main/res/values-zh-rTW/strings.xml @@ -8,7 +8,6 @@ <string name="account_time_notification_channel_description">在帳戶時間即將到期時顯示提醒</string> <string name="account_time_notification_channel_name">帳戶時間提醒</string> <string name="add_a_server">新增伺服器</string> - <string name="add_anyway">仍要新增</string> <string name="add_time_to_account">在我們網站上購買點數或兌換憑證。</string> <string name="all_applications">所有應用程式</string> <string name="allow_lan_footer">允許存取同一網路上的其他裝置,以進行共用、列印等。</string> @@ -43,7 +42,6 @@ <string name="creating_secure_connection">建立安全連線</string> <string name="critical_error">嚴重錯誤 (需注意)</string> <string name="custom_dns_footer">啟用以新增至少一個 DNS 伺服器。</string> - <string name="custom_dns_hint">輸入 IP</string> <string name="custom_tunnel_host_resolution_error">無法解析自訂伺服器的主機名稱</string> <string name="device_inactive_description">您已移除此裝置。若要重新連線,您需要重新登入。</string> <string name="device_inactive_title">裝置處於非活動狀態</string> diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index ddd2fb88e0..bf1608f2ee 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -11,7 +11,6 @@ <color name="white60">#99FFFFFF</color> <color name="white40">#66FFFFFF</color> <color name="white20">#33FFFFFF</color> - <color name="white10">#1AFFFFFF</color> <color name="green">#44AD4D</color> <color name="green90">#E644AD4D</color> <color name="green80">#CC44AD4D</color> diff --git a/android/app/src/main/res/values/dimensions.xml b/android/app/src/main/res/values/dimensions.xml index 4f35637a64..76fa24032d 100644 --- a/android/app/src/main/res/values/dimensions.xml +++ b/android/app/src/main/res/values/dimensions.xml @@ -23,8 +23,6 @@ <dimen name="cell_right_padding">16dp</dimen> <dimen name="cell_inner_spacing">8dp</dimen> <dimen name="cell_label_vertical_padding">14dp</dimen> - <dimen name="cell_input_width">80dp</dimen> - <dimen name="cell_input_height">34dp</dimen> <dimen name="cell_footer_top_padding">6dp</dimen> <dimen name="cell_footer_horizontal_padding">@dimen/side_margin</dimen> <dimen name="app_version_warning_icon_size">28dp</dimen> diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index f655e99901..bce6426629 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -147,11 +147,9 @@ <string name="enable">Enable</string> <string name="enable_custom_dns">Use custom DNS server</string> <string name="add_a_server">Add a server</string> - <string name="custom_dns_hint">Enter IP</string> <string name="custom_dns_footer">Enable to add at least one DNS server.</string> <string name="confirm_local_dns">The local DNS server will not work unless you enable \"Local Network Sharing\" under Preferences.</string> - <string name="add_anyway">Add anyway</string> <string name="exclude_applications">Excluded applications</string> <string name="all_applications">All applications</string> <string name="copied_to_clipboard">Copied to clipboard</string> |
