android/ui: reflect latest state of allow LAN access setting

Updates tailscale/corp#18983

Signed-off-by: Percy Wegmann <percy@tailscale.com>
ox/allow_lan_access_toggle
Percy Wegmann 2 years ago
parent 71f03cf0d2
commit 273baa4022
No known key found for this signature in database
GPG Key ID: 29D8CDEB4C13D48B

@ -21,6 +21,7 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.tailscale.ipn.R import com.tailscale.ipn.R
import com.tailscale.ipn.ui.model.DnsType 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.ClipboardValueView
import com.tailscale.ipn.ui.util.Lists import com.tailscale.ipn.ui.util.Lists
import com.tailscale.ipn.ui.util.LoadingIndicator import com.tailscale.ipn.ui.util.LoadingIndicator
@ -44,6 +45,7 @@ fun DNSSettingsView(
model.dnsConfig.collectAsState().value?.Routes?.mapNotNull { entry -> model.dnsConfig.collectAsState().value?.Routes?.mapNotNull { entry ->
entry.value?.let { resolvers -> ViewableRoute(name = entry.key, resolvers) } ?: run { null } entry.value?.let { resolvers -> ViewableRoute(name = entry.key, resolvers) } ?: run { null }
} ?: emptyList() } ?: emptyList()
val useCorpDNS = Notifier.prefs.collectAsState().value?.CorpDNS == true
Scaffold(topBar = { Header(R.string.dns_settings, onBack = nav.onBack) }) { innerPadding -> Scaffold(topBar = { Header(R.string.dns_settings, onBack = nav.onBack) }) { innerPadding ->
LoadingIndicator.Wrap { LoadingIndicator.Wrap {
@ -63,8 +65,13 @@ fun DNSSettingsView(
supportingContent = { Text(stringResource(state.caption)) }) supportingContent = { Text(stringResource(state.caption)) })
Lists.ItemDivider() Lists.ItemDivider()
SettingsRow.Switch(
SettingRow(model.useDNSSetting) R.string.use_ts_dns,
isOn = useCorpDNS,
onToggle = {
LoadingIndicator.start()
model.toggleCorpDNS { LoadingIndicator.stop() }
})
} }
if (resolvers.isNotEmpty()) { if (resolvers.isNotEmpty()) {

@ -21,6 +21,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.tailscale.ipn.R 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.disabledListItem
import com.tailscale.ipn.ui.theme.listItem import com.tailscale.ipn.ui.theme.listItem
import com.tailscale.ipn.ui.util.Lists import com.tailscale.ipn.ui.util.Lists
@ -43,6 +44,7 @@ fun ExitNodePicker(
val mullvadExitNodesByCountryCode = model.mullvadExitNodesByCountryCode.collectAsState().value val mullvadExitNodesByCountryCode = model.mullvadExitNodesByCountryCode.collectAsState().value
val mullvadExitNodeCount = model.mullvadExitNodeCount.collectAsState().value val mullvadExitNodeCount = model.mullvadExitNodeCount.collectAsState().value
val anyActive = model.anyActive.collectAsState() val anyActive = model.anyActive.collectAsState()
val allowLANAccess = Notifier.prefs.collectAsState().value?.ExitNodeAllowLANAccess == true
LazyColumn(modifier = Modifier.padding(innerPadding)) { LazyColumn(modifier = Modifier.padding(innerPadding)) {
item(key = "header") { item(key = "header") {
@ -71,7 +73,11 @@ fun ExitNodePicker(
// TODO: make sure this actually works, and if not, leave it out for now // TODO: make sure this actually works, and if not, leave it out for now
item(key = "allowLANAccess") { item(key = "allowLANAccess") {
Lists.SectionDivider() Lists.SectionDivider()
SettingRow(model.allowLANAccessSetting)
SettingsRow.Switch(R.string.allow_lan_access, isOn = allowLANAccess) {
LoadingIndicator.start()
model.toggleAllowLANAccess { LoadingIndicator.stop() }
}
} }
} }
} }

@ -93,7 +93,6 @@ fun SettingRow(setting: Setting) {
Box { Box {
when (setting.type) { when (setting.type) {
SettingType.TEXT -> TextRow(setting) SettingType.TEXT -> TextRow(setting)
SettingType.SWITCH -> SwitchRow(setting)
SettingType.NAV -> { SettingType.NAV -> {
NavRow(setting) NavRow(setting)
} }
@ -120,26 +119,27 @@ private fun TextRow(setting: Setting) {
) )
} }
@Composable object SettingsRow {
private fun SwitchRow(setting: Setting) { @Composable
val enabled = setting.enabled.collectAsState().value fun Switch(
val swVal = setting.isOn?.collectAsState()?.value ?: false titleRes: Int = 0,
var modifier: Modifier = Modifier title: String? = null,
if (enabled) { isOn: Boolean,
setting.onClick?.let { modifier = modifier.clickable(onClick = it) } 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 @Composable

@ -36,13 +36,6 @@ class DNSSettingsViewModel() : IpnViewModel() {
MutableStateFlow(DNSEnablementState.NOT_RUNNING) MutableStateFlow(DNSEnablementState.NOT_RUNNING)
val dnsConfig: StateFlow<Tailcfg.DNSConfig?> = MutableStateFlow(null) val dnsConfig: StateFlow<Tailcfg.DNSConfig?> = MutableStateFlow(null)
val useDNSSetting =
Setting(
R.string.use_ts_dns,
type = SettingType.SWITCH,
isOn = MutableStateFlow(Notifier.prefs.value?.CorpDNS),
onToggle = { toggleCorpDNS {} })
init { init {
viewModelScope.launch { viewModelScope.launch {
Notifier.netmap Notifier.netmap
@ -51,19 +44,12 @@ class DNSSettingsViewModel() : IpnViewModel() {
.collect { (netmap, prefs) -> .collect { (netmap, prefs) ->
Log.d("DNSSettingsViewModel", "prefs: CorpDNS=" + prefs?.CorpDNS.toString()) Log.d("DNSSettingsViewModel", "prefs: CorpDNS=" + prefs?.CorpDNS.toString())
prefs?.let { prefs?.let {
useDNSSetting.isOn?.set(it.CorpDNS)
useDNSSetting.enabled.set(true)
if (it.CorpDNS) { if (it.CorpDNS) {
enablementState.set(DNSEnablementState.ENABLED) enablementState.set(DNSEnablementState.ENABLED)
} else { } else {
enablementState.set(DNSEnablementState.DISABLED) enablementState.set(DNSEnablementState.DISABLED)
} }
} } ?: run { enablementState.set(DNSEnablementState.NOT_RUNNING) }
?: run {
enablementState.set(DNSEnablementState.NOT_RUNNING)
useDNSSetting.enabled.set(false)
}
netmap?.let { dnsConfig.set(netmap.DNS) } netmap?.let { dnsConfig.set(netmap.DNS) }
} }
} }

@ -6,7 +6,6 @@ package com.tailscale.ipn.ui.viewModel
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.tailscale.ipn.R
import com.tailscale.ipn.ui.localapi.Client import com.tailscale.ipn.ui.localapi.Client
import com.tailscale.ipn.ui.model.Ipn import com.tailscale.ipn.ui.model.Ipn
import com.tailscale.ipn.ui.model.StableNodeID import com.tailscale.ipn.ui.model.StableNodeID
@ -57,17 +56,6 @@ class ExitNodePickerViewModel(private val nav: ExitNodePickerNav) : IpnViewModel
val anyActive: StateFlow<Boolean> = MutableStateFlow(false) val anyActive: StateFlow<Boolean> = MutableStateFlow(false)
val isRunningExitNode: StateFlow<Boolean> = MutableStateFlow(false) val isRunningExitNode: StateFlow<Boolean> = 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 { init {
viewModelScope.launch { viewModelScope.launch {
Notifier.netmap Notifier.netmap
@ -155,7 +143,7 @@ class ExitNodePickerViewModel(private val nav: ExitNodePickerNav) : IpnViewModel
} }
} }
private fun toggleAllowLANAccess(callback: (Result<Ipn.Prefs>) -> Unit) { fun toggleAllowLANAccess(callback: (Result<Ipn.Prefs>) -> Unit) {
val prefs = val prefs =
Notifier.prefs.value Notifier.prefs.value
?: run { ?: run {

@ -16,7 +16,6 @@ import kotlinx.coroutines.launch
enum class SettingType { enum class SettingType {
NAV, NAV,
SWITCH,
TEXT TEXT
} }

Loading…
Cancel
Save