diff --git a/android/src/main/java/com/tailscale/ipn/ui/view/DNSSettingsView.kt b/android/src/main/java/com/tailscale/ipn/ui/view/DNSSettingsView.kt index 763f1b7..7333f0c 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/view/DNSSettingsView.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/view/DNSSettingsView.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.tailscale.ipn.R import com.tailscale.ipn.ui.model.DnsType +import com.tailscale.ipn.ui.notifier.Notifier import com.tailscale.ipn.ui.util.ClipboardValueView import com.tailscale.ipn.ui.util.Lists import com.tailscale.ipn.ui.util.LoadingIndicator @@ -44,6 +45,7 @@ fun DNSSettingsView( model.dnsConfig.collectAsState().value?.Routes?.mapNotNull { entry -> entry.value?.let { resolvers -> ViewableRoute(name = entry.key, resolvers) } ?: run { null } } ?: emptyList() + val useCorpDNS = Notifier.prefs.collectAsState().value?.CorpDNS == true Scaffold(topBar = { Header(R.string.dns_settings, onBack = nav.onBack) }) { innerPadding -> LoadingIndicator.Wrap { @@ -63,8 +65,13 @@ fun DNSSettingsView( supportingContent = { Text(stringResource(state.caption)) }) Lists.ItemDivider() - - SettingRow(model.useDNSSetting) + SettingsRow.Switch( + R.string.use_ts_dns, + isOn = useCorpDNS, + onToggle = { + LoadingIndicator.start() + model.toggleCorpDNS { LoadingIndicator.stop() } + }) } if (resolvers.isNotEmpty()) { diff --git a/android/src/main/java/com/tailscale/ipn/ui/view/ExitNodePicker.kt b/android/src/main/java/com/tailscale/ipn/ui/view/ExitNodePicker.kt index 6d21c9e..27bc156 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/view/ExitNodePicker.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/view/ExitNodePicker.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel import com.tailscale.ipn.R +import com.tailscale.ipn.ui.notifier.Notifier import com.tailscale.ipn.ui.theme.disabledListItem import com.tailscale.ipn.ui.theme.listItem import com.tailscale.ipn.ui.util.Lists @@ -43,6 +44,7 @@ fun ExitNodePicker( val mullvadExitNodesByCountryCode = model.mullvadExitNodesByCountryCode.collectAsState().value val mullvadExitNodeCount = model.mullvadExitNodeCount.collectAsState().value val anyActive = model.anyActive.collectAsState() + val allowLANAccess = Notifier.prefs.collectAsState().value?.ExitNodeAllowLANAccess == true LazyColumn(modifier = Modifier.padding(innerPadding)) { item(key = "header") { @@ -71,7 +73,11 @@ fun ExitNodePicker( // TODO: make sure this actually works, and if not, leave it out for now item(key = "allowLANAccess") { Lists.SectionDivider() - SettingRow(model.allowLANAccessSetting) + + SettingsRow.Switch(R.string.allow_lan_access, isOn = allowLANAccess) { + LoadingIndicator.start() + model.toggleAllowLANAccess { LoadingIndicator.stop() } + } } } } diff --git a/android/src/main/java/com/tailscale/ipn/ui/view/SettingsView.kt b/android/src/main/java/com/tailscale/ipn/ui/view/SettingsView.kt index d667f2d..0c69b0b 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/view/SettingsView.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/view/SettingsView.kt @@ -93,7 +93,6 @@ fun SettingRow(setting: Setting) { Box { when (setting.type) { SettingType.TEXT -> TextRow(setting) - SettingType.SWITCH -> SwitchRow(setting) SettingType.NAV -> { NavRow(setting) } @@ -120,26 +119,27 @@ private fun TextRow(setting: Setting) { ) } -@Composable -private fun SwitchRow(setting: Setting) { - val enabled = setting.enabled.collectAsState().value - val swVal = setting.isOn?.collectAsState()?.value ?: false - var modifier: Modifier = Modifier - if (enabled) { - setting.onClick?.let { modifier = modifier.clickable(onClick = it) } +object SettingsRow { + @Composable + fun Switch( + titleRes: Int = 0, + title: String? = null, + isOn: Boolean, + enabled: Boolean = true, + onToggle: (Boolean) -> Unit = {} + ) { + ListItem( + colors = MaterialTheme.colorScheme.listItem, + headlineContent = { + Text( + title ?: stringResource(titleRes), + style = MaterialTheme.typography.bodyMedium, + ) + }, + trailingContent = { + TintedSwitch(checked = isOn, onCheckedChange = onToggle, enabled = enabled) + }) } - ListItem( - modifier = modifier, - colors = MaterialTheme.colorScheme.listItem, - headlineContent = { - Text( - setting.title ?: stringResource(setting.titleRes), - style = MaterialTheme.typography.bodyMedium, - ) - }, - trailingContent = { - TintedSwitch(checked = swVal, onCheckedChange = setting.onToggle, enabled = enabled) - }) } @Composable diff --git a/android/src/main/java/com/tailscale/ipn/ui/viewModel/DNSSettingsViewModel.kt b/android/src/main/java/com/tailscale/ipn/ui/viewModel/DNSSettingsViewModel.kt index db15d8a..5de4302 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/viewModel/DNSSettingsViewModel.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/viewModel/DNSSettingsViewModel.kt @@ -36,13 +36,6 @@ class DNSSettingsViewModel() : IpnViewModel() { MutableStateFlow(DNSEnablementState.NOT_RUNNING) val dnsConfig: StateFlow = MutableStateFlow(null) - val useDNSSetting = - Setting( - R.string.use_ts_dns, - type = SettingType.SWITCH, - isOn = MutableStateFlow(Notifier.prefs.value?.CorpDNS), - onToggle = { toggleCorpDNS {} }) - init { viewModelScope.launch { Notifier.netmap @@ -51,19 +44,12 @@ class DNSSettingsViewModel() : IpnViewModel() { .collect { (netmap, prefs) -> Log.d("DNSSettingsViewModel", "prefs: CorpDNS=" + prefs?.CorpDNS.toString()) prefs?.let { - useDNSSetting.isOn?.set(it.CorpDNS) - useDNSSetting.enabled.set(true) - if (it.CorpDNS) { enablementState.set(DNSEnablementState.ENABLED) } else { enablementState.set(DNSEnablementState.DISABLED) } - } - ?: run { - enablementState.set(DNSEnablementState.NOT_RUNNING) - useDNSSetting.enabled.set(false) - } + } ?: run { enablementState.set(DNSEnablementState.NOT_RUNNING) } netmap?.let { dnsConfig.set(netmap.DNS) } } } diff --git a/android/src/main/java/com/tailscale/ipn/ui/viewModel/ExitNodePickerViewModel.kt b/android/src/main/java/com/tailscale/ipn/ui/viewModel/ExitNodePickerViewModel.kt index 04c1e20..9990f02 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/viewModel/ExitNodePickerViewModel.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/viewModel/ExitNodePickerViewModel.kt @@ -6,7 +6,6 @@ package com.tailscale.ipn.ui.viewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import com.tailscale.ipn.R import com.tailscale.ipn.ui.localapi.Client import com.tailscale.ipn.ui.model.Ipn import com.tailscale.ipn.ui.model.StableNodeID @@ -57,17 +56,6 @@ class ExitNodePickerViewModel(private val nav: ExitNodePickerNav) : IpnViewModel val anyActive: StateFlow = MutableStateFlow(false) val isRunningExitNode: StateFlow = MutableStateFlow(false) - val allowLANAccessSetting = - Setting( - R.string.allow_lan_access, - type = SettingType.SWITCH, - isOn = MutableStateFlow(Notifier.prefs.value?.ExitNodeAllowLANAccess), - enabled = MutableStateFlow(true), - onToggle = { - LoadingIndicator.start() - toggleAllowLANAccess { LoadingIndicator.stop() } - }) - init { viewModelScope.launch { Notifier.netmap @@ -155,7 +143,7 @@ class ExitNodePickerViewModel(private val nav: ExitNodePickerNav) : IpnViewModel } } - private fun toggleAllowLANAccess(callback: (Result) -> Unit) { + fun toggleAllowLANAccess(callback: (Result) -> Unit) { val prefs = Notifier.prefs.value ?: run { diff --git a/android/src/main/java/com/tailscale/ipn/ui/viewModel/SettingsViewModel.kt b/android/src/main/java/com/tailscale/ipn/ui/viewModel/SettingsViewModel.kt index 5b3974b..6e69bec 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/viewModel/SettingsViewModel.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/viewModel/SettingsViewModel.kt @@ -16,7 +16,6 @@ import kotlinx.coroutines.launch enum class SettingType { NAV, - SWITCH, TEXT }