android/ui: show count of Mullvad countries, also fix navigation-related crash when adding new account

Updates tailscale/corp#18202

Signed-off-by: Percy Wegmann <percy@tailscale.com>
pull/310/head
Percy Wegmann 1 month ago committed by Percy Wegmann
parent cc244812a6
commit c59c8537cf

@ -37,7 +37,6 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument import androidx.navigation.navArgument
import androidx.navigation.navigation
import com.tailscale.ipn.Peer.RequestCodes import com.tailscale.ipn.Peer.RequestCodes
import com.tailscale.ipn.mdm.MDMSettings import com.tailscale.ipn.mdm.MDMSettings
import com.tailscale.ipn.ui.model.Ipn import com.tailscale.ipn.ui.model.Ipn
@ -74,7 +73,7 @@ import kotlinx.coroutines.launch
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private lateinit var requestVpnPermission: ActivityResultLauncher<Unit> private lateinit var requestVpnPermission: ActivityResultLauncher<Unit>
private var navController: NavHostController? = null private lateinit var navController: NavHostController
companion object { companion object {
private const val TAG = "Main Activity" private const val TAG = "Main Activity"
@ -105,7 +104,7 @@ class MainActivity : ComponentActivity() {
setContent { setContent {
AppTheme { AppTheme {
val navController = rememberNavController() navController = rememberNavController()
Surface(color = MaterialTheme.colorScheme.inverseSurface) { // Background for the letterbox Surface(color = MaterialTheme.colorScheme.inverseSurface) { // Background for the letterbox
Surface(modifier = Modifier.universalFit()) { // Letterbox for AndroidTV Surface(modifier = Modifier.universalFit()) { // Letterbox for AndroidTV
NavHost( NavHost(
@ -162,18 +161,16 @@ class MainActivity : ComponentActivity() {
composable("main") { MainView(navigation = mainViewNav) } composable("main") { MainView(navigation = mainViewNav) }
composable("settings") { SettingsView(settingsNav) } composable("settings") { SettingsView(settingsNav) }
navigation(startDestination = "list", route = "exitNodes") { composable("exitNodes") { ExitNodePicker(exitNodePickerNav) }
composable("list") { ExitNodePicker(exitNodePickerNav) } composable("mullvad") { MullvadExitNodePickerList(exitNodePickerNav) }
composable("mullvad") { MullvadExitNodePickerList(exitNodePickerNav) } composable(
composable( "mullvad/{countryCode}",
"mullvad/{countryCode}", arguments =
arguments = listOf(navArgument("countryCode") { type = NavType.StringType })) {
listOf(navArgument("countryCode") { type = NavType.StringType })) { MullvadExitNodePicker(
MullvadExitNodePicker( it.arguments!!.getString("countryCode")!!, exitNodePickerNav)
it.arguments!!.getString("countryCode")!!, exitNodePickerNav) }
} composable("runExitNode") { RunExitNodeView(exitNodePickerNav) }
composable("runExitNode") { RunExitNodeView(exitNodePickerNav) }
}
composable( composable(
"peerDetails/{nodeId}", "peerDetails/{nodeId}",
arguments = listOf(navArgument("nodeId") { type = NavType.StringType })) { arguments = listOf(navArgument("nodeId") { type = NavType.StringType })) {
@ -244,7 +241,7 @@ class MainActivity : ComponentActivity() {
override fun onNewIntent(intent: Intent?) { override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent) super.onNewIntent(intent)
if (intent?.getBooleanExtra(START_AT_ROOT, false) == true) { if (intent?.getBooleanExtra(START_AT_ROOT, false) == true) {
navController?.popBackStack(route = "main", inclusive = false) navController.popBackStack(route = "main", inclusive = false)
} }
} }

@ -66,7 +66,8 @@ fun ExitNodePicker(
if (mullvadExitNodeCount > 0) { if (mullvadExitNodeCount > 0) {
item(key = "mullvad") { item(key = "mullvad") {
Lists.SectionDivider() Lists.SectionDivider()
MullvadItem(nav, mullvadExitNodeCount, mullvadExitNodesByCountryCode.selected) MullvadItem(
nav, mullvadExitNodesByCountryCode.size, mullvadExitNodesByCountryCode.selected)
} }
} }
@ -128,7 +129,7 @@ fun MullvadItem(nav: ExitNodePickerNav, count: Int, selected: Boolean) {
}, },
supportingContent = { supportingContent = {
Text( Text(
"$count ${stringResource(R.string.exit_nodes_available)}", "$count ${stringResource(R.string.countries)}",
style = MaterialTheme.typography.bodyMedium) style = MaterialTheme.typography.bodyMedium)
}, },
trailingContent = { trailingContent = {

@ -40,7 +40,7 @@ fun MullvadExitNodePicker(
topBar = { topBar = {
Header( Header(
title = { Text("${countryCode.flag()} ${any.country}") }, title = { Text("${countryCode.flag()} ${any.country}") },
onBack = nav.onNavigateBackToExitNodes) onBack = nav.onNavigateBackToMullvad)
}) { innerPadding -> }) { innerPadding ->
LazyColumn(modifier = Modifier.padding(innerPadding)) { LazyColumn(modifier = Modifier.padding(innerPadding)) {
if (nodes.size > 1) { if (nodes.size > 1) {

@ -38,7 +38,7 @@ fun MullvadExitNodePickerList(
LoadingIndicator.Wrap { LoadingIndicator.Wrap {
Scaffold( Scaffold(
topBar = { topBar = {
Header(R.string.choose_mullvad_exit_node, onBack = nav.onNavigateBackToMullvad) Header(R.string.choose_mullvad_exit_node, onBack = nav.onNavigateBackToExitNodes)
}) { innerPadding -> }) { innerPadding ->
val mullvadExitNodes = model.mullvadExitNodesByCountryCode.collectAsState() val mullvadExitNodes = model.mullvadExitNodesByCountryCode.collectAsState()

@ -159,7 +159,7 @@
<string name="this_device_is_using_the_system_dns_resolver">This device is using the system DNS resolver.</string> <string name="this_device_is_using_the_system_dns_resolver">This device is using the system DNS resolver.</string>
<string name="not_using_tailscale_dns">Not using Tailscale DNS</string> <string name="not_using_tailscale_dns">Not using Tailscale DNS</string>
<string name="allow_lan_access">Allow LAN access</string> <string name="allow_lan_access">Allow LAN access</string>
<string name="exit_nodes_available">exit nodes available</string> <string name="countries">countries</string>
<string name="cities_available">cities available</string> <string name="cities_available">cities available</string>
<!-- Strings for MDM Settings Manifest (app_restrictions.xml) --> <!-- Strings for MDM Settings Manifest (app_restrictions.xml) -->

Loading…
Cancel
Save