summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorsaber safavi <saber.safavi@codic.se>2023-03-17 15:15:49 +0100
committerAlbin <albin@mullvad.net>2023-03-20 16:21:29 +0100
commitf6b23f668137169f9c1cdc26c09a3dbe8fe76d0a (patch)
tree4a370485c58eab17d357c15128d7f2647f0c7b9e
parentd69c346accf92301e5c6f8db30854f2cd28113e3 (diff)
downloadmullvadvpn-f6b23f668137169f9c1cdc26c09a3dbe8fe76d0a.tar.xz
mullvadvpn-f6b23f668137169f9c1cdc26c09a3dbe8fe76d0a.zip
Migrate advanced settings fragment to use composified view
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt283
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/AddCustomDnsServerHolder.kt16
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt302
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsFooterHolder.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsItemHolder.kt6
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsServerHolder.kt30
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/EditCustomDnsServerHolder.kt89
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConfirmDnsDialogFragment.kt66
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/MtuCell.kt85
-rw-r--r--android/app/src/main/res/drawable/cell_input_background.xml5
-rw-r--r--android/app/src/main/res/drawable/cell_input_cursor.xml6
-rw-r--r--android/app/src/main/res/drawable/icon_add.xml7
-rw-r--r--android/app/src/main/res/drawable/icon_check.xml11
-rw-r--r--android/app/src/main/res/layout/add_custom_dns_server.xml31
-rw-r--r--android/app/src/main/res/layout/advanced.xml34
-rw-r--r--android/app/src/main/res/layout/advanced_header.xml32
-rw-r--r--android/app/src/main/res/layout/confirm_dns.xml31
-rw-r--r--android/app/src/main/res/layout/custom_dns_footer.xml14
-rw-r--r--android/app/src/main/res/layout/custom_dns_server.xml31
-rw-r--r--android/app/src/main/res/layout/edit_custom_dns_server.xml30
-rw-r--r--android/app/src/main/res/layout/mtu_edit_text.xml14
-rw-r--r--android/app/src/main/res/values-da/strings.xml2
-rw-r--r--android/app/src/main/res/values-de/strings.xml2
-rw-r--r--android/app/src/main/res/values-es/strings.xml2
-rw-r--r--android/app/src/main/res/values-fi/strings.xml2
-rw-r--r--android/app/src/main/res/values-fr/strings.xml2
-rw-r--r--android/app/src/main/res/values-it/strings.xml2
-rw-r--r--android/app/src/main/res/values-ja/strings.xml2
-rw-r--r--android/app/src/main/res/values-ko/strings.xml2
-rw-r--r--android/app/src/main/res/values-my/strings.xml2
-rw-r--r--android/app/src/main/res/values-nb/strings.xml2
-rw-r--r--android/app/src/main/res/values-nl/strings.xml2
-rw-r--r--android/app/src/main/res/values-pl/strings.xml2
-rw-r--r--android/app/src/main/res/values-pt/strings.xml2
-rw-r--r--android/app/src/main/res/values-ru/strings.xml2
-rw-r--r--android/app/src/main/res/values-sv/strings.xml2
-rw-r--r--android/app/src/main/res/values-th/strings.xml2
-rw-r--r--android/app/src/main/res/values-tr/strings.xml2
-rw-r--r--android/app/src/main/res/values-zh-rCN/strings.xml2
-rw-r--r--android/app/src/main/res/values-zh-rTW/strings.xml2
-rw-r--r--android/app/src/main/res/values/colors.xml1
-rw-r--r--android/app/src/main/res/values/dimensions.xml2
-rw-r--r--android/app/src/main/res/values/strings.xml2
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>