diff --git a/android/src/main/java/com/tailscale/ipn/ui/model/TailCfg.kt b/android/src/main/java/com/tailscale/ipn/ui/model/TailCfg.kt index beab06b..64df853 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/model/TailCfg.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/model/TailCfg.kt @@ -79,11 +79,14 @@ class Tailcfg { var LastSeen: Time? = null, var Online: Boolean? = null, var Capabilities: List? = null, + var CapMap: Map?>? = null, var ComputedName: String, var ComputedNameWithHost: String ) { val isAdmin: Boolean - get() = (Capabilities ?: emptyList()).contains("https://tailscale.com/cap/is-admin") + get() = + Capabilities?.contains("https://tailscale.com/cap/is-admin") == true || + CapMap?.contains("https://tailscale.com/cap/is-admin") == true // isExitNode reproduces the Go logic in local.go peerStatusFromNode val isExitNode: Boolean = @@ -110,7 +113,7 @@ class Tailcfg { val displayAddresses: List get() { var addresses = mutableListOf() - addresses.add(DisplayAddress(NameWithoutTrailingDot)) + addresses.add(DisplayAddress(nameWithoutTrailingDot)) Addresses?.let { addresses.addAll(it.map { addr -> DisplayAddress(addr) }) } return addresses } diff --git a/android/src/main/java/com/tailscale/ipn/ui/notifier/Notifier.kt b/android/src/main/java/com/tailscale/ipn/ui/notifier/Notifier.kt index ad038f7..adeafed 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/notifier/Notifier.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/notifier/Notifier.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.launch import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream +import java.nio.charset.Charset // Notifier is a wrapper around the IPN Bus notifier. It provides a way to watch // for changes in various parts of the Tailscale engine. You will typically only use @@ -67,6 +68,7 @@ object Notifier { NotifyWatchOpt.InitialState.value manager = app.watchNotifications(mask.toLong()) { notification -> + Log.d("ZZZZ", notification.toString(Charset.defaultCharset())) val notify = decoder.decodeFromStream(notification.inputStream()) notify.State?.let { state.set(Ipn.State.fromInt(it)) } notify.NetMap?.let(netmap::set) 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 ccbfe74..09c7957 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 @@ -6,8 +6,6 @@ package com.tailscale.ipn.ui.view import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.ClickableText import androidx.compose.material3.ListItem @@ -22,8 +20,8 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.withStyle -import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.tailscale.ipn.BuildConfig import com.tailscale.ipn.R @@ -56,10 +54,10 @@ fun SettingsView( onClick = viewModel.navigation.onNavigateToUserSwitcher) if (isAdmin) { - Spacer(modifier = Modifier.height(4.dp)) AdminTextView { handler.openUri(Links.ADMIN_URL) } } + Lists.SectionDivider() SettingRow(viewModel.dns) Lists.ItemDivider() @@ -68,21 +66,22 @@ fun SettingsView( Lists.ItemDivider() SettingRow(viewModel.permissions) - Lists.ItemDivider() - SettingRow(viewModel.about) + managedBy?.let { + Lists.ItemDivider() + SettingRow(it) + } - Lists.ItemDivider() + Lists.SectionDivider() SettingRow(viewModel.bugReport) + Lists.ItemDivider() + SettingRow(viewModel.about) + + // TODO: put a heading for the debug section if (BuildConfig.DEBUG) { - Lists.ItemDivider() + Lists.SectionDivider() SettingRow(viewModel.mdmDebug) } - - managedBy?.let { - Lists.ItemDivider() - SettingRow(it) - } } } } @@ -148,21 +147,26 @@ private fun NavRow(setting: Setting) { @Composable fun AdminTextView(onNavigateToAdminConsole: () -> Unit) { val adminStr = buildAnnotatedString { - withStyle(style = SpanStyle(color = MaterialTheme.colorScheme.primary)) { + withStyle(style = SpanStyle(color = MaterialTheme.colorScheme.onSurfaceVariant)) { append(stringResource(id = R.string.settings_admin_prefix)) } pushStringAnnotation(tag = "link", annotation = Links.ADMIN_URL) - withStyle(style = SpanStyle(color = Color.Blue)) { - append(stringResource(id = R.string.settings_admin_link)) - } + withStyle( + style = + SpanStyle( + color = MaterialTheme.colorScheme.onPrimaryContainer, + textDecoration = TextDecoration.Underline)) { + append(stringResource(id = R.string.settings_admin_link)) + } pop() } - Column(modifier = Modifier.padding(horizontal = 12.dp)) { - ClickableText( - text = adminStr, - style = MaterialTheme.typography.bodySmall, - onClick = { onNavigateToAdminConsole() }) - } + ListItem( + headlineContent = { + ClickableText( + text = adminStr, + style = MaterialTheme.typography.bodyMedium, + onClick = { onNavigateToAdminConsole() }) + }) } 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 73662fe..7a309e4 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 @@ -88,7 +88,7 @@ class SettingsViewModel(val navigation: SettingsNav) : IpnViewModel() { val about = Setting( - titleRes = R.string.about, + titleRes = R.string.about_tailscale, type = SettingType.NAV, onClick = { navigation.onNavigateToAbout() }, enabled = MutableStateFlow(true)) diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml index 5780d45..8594b78 100644 --- a/android/src/main/res/values/strings.xml +++ b/android/src/main/res/values/strings.xml @@ -38,9 +38,9 @@ Settings You can manage your account from the admin console.  - View admin console… - About - Bug Report + View admin console + About Tailscale + Bug report Use Tailscale DNS