android/ui: use faster sliding animations for nav transitions

Updates tailscale/corp#18202

Signed-off-by: Percy Wegmann <percy@tailscale.com>
pull/267/head
Percy Wegmann 2 months ago committed by Percy Wegmann
parent 8105271d25
commit 4897f09e50

@ -16,6 +16,9 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContract import androidx.activity.result.contract.ActivityResultContract
import androidx.compose.animation.core.tween
import androidx.compose.animation.slideInHorizontally
import androidx.compose.animation.slideOutHorizontally
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavType import androidx.navigation.NavType
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
@ -69,76 +72,92 @@ class MainActivity : ComponentActivity() {
setContent { setContent {
AppTheme { AppTheme {
val navController = rememberNavController() val navController = rememberNavController()
NavHost(navController = navController, startDestination = "main") { NavHost(
val mainViewNav = navController = navController,
MainViewNavigation( startDestination = "main",
onNavigateToSettings = { navController.navigate("settings") }, enterTransition = {
onNavigateToPeerDetails = { slideInHorizontally(animationSpec = tween(150), initialOffsetX = { it })
navController.navigate("peerDetails/${it.StableID}") },
}, exitTransition = {
onNavigateToExitNodes = { navController.navigate("exitNodes") }, slideOutHorizontally(animationSpec = tween(150), targetOffsetX = { -it })
) },
popEnterTransition = {
val settingsNav = slideInHorizontally(animationSpec = tween(150), initialOffsetX = { -it })
SettingsNav( },
onNavigateToBugReport = { navController.navigate("bugReport") }, popExitTransition = {
onNavigateToAbout = { navController.navigate("about") }, slideOutHorizontally(animationSpec = tween(150), targetOffsetX = { it })
onNavigateToDNSSettings = { navController.navigate("dnsSettings") }, }) {
onNavigateToTailnetLock = { navController.navigate("tailnetLock") }, val mainViewNav =
onNavigateToMDMSettings = { navController.navigate("mdmSettings") }, MainViewNavigation(
onNavigateToManagedBy = { navController.navigate("managedBy") }, onNavigateToSettings = { navController.navigate("settings") },
onNavigateToUserSwitcher = { navController.navigate("userSwitcher") }, onNavigateToPeerDetails = {
onNavigateToPermissions = { navController.navigate("permissions") }, navController.navigate("peerDetails/${it.StableID}")
onBackPressed = { navController.popBackStack() }, },
) onNavigateToExitNodes = { navController.navigate("exitNodes") },
)
val backNav = BackNavigation(onBack = { navController.popBackStack() })
val settingsNav =
val exitNodePickerNav = SettingsNav(
ExitNodePickerNav( onNavigateToBugReport = { navController.navigate("bugReport") },
onNavigateHome = { onNavigateToAbout = { navController.navigate("about") },
navController.popBackStack(route = "main", inclusive = false) onNavigateToDNSSettings = { navController.navigate("dnsSettings") },
}, onNavigateToTailnetLock = { navController.navigate("tailnetLock") },
onNavigateBack = { navController.popBackStack() }, onNavigateToMDMSettings = { navController.navigate("mdmSettings") },
onNavigateToExitNodePicker = { navController.popBackStack() }, onNavigateToManagedBy = { navController.navigate("managedBy") },
onNavigateToMullvad = { navController.navigate("mullvad") }, onNavigateToUserSwitcher = { navController.navigate("userSwitcher") },
onNavigateToMullvadCountry = { navController.navigate("mullvad/$it") }, onNavigateToPermissions = { navController.navigate("permissions") },
onNavigateToRunAsExitNode = { navController.navigate("runExitNode") }) onBackPressed = { navController.popBackStack() },
)
composable("main") { MainView(navigation = mainViewNav) }
composable("settings") { SettingsView(settingsNav) } val backNav = BackNavigation(onBack = { navController.popBackStack() })
navigation(startDestination = "list", route = "exitNodes") {
composable("list") { ExitNodePicker(exitNodePickerNav) } val exitNodePickerNav =
composable("mullvad") { MullvadExitNodePickerList(exitNodePickerNav) } ExitNodePickerNav(
composable( onNavigateHome = {
"mullvad/{countryCode}", navController.popBackStack(route = "main", inclusive = false)
arguments = listOf(navArgument("countryCode") { type = NavType.StringType })) { },
MullvadExitNodePicker( onNavigateBack = { navController.popBackStack() },
it.arguments!!.getString("countryCode")!!, exitNodePickerNav) onNavigateToExitNodePicker = { navController.popBackStack() },
} onNavigateToMullvad = { navController.navigate("mullvad") },
composable("runExitNode") { RunExitNodeView(exitNodePickerNav) } onNavigateToMullvadCountry = { navController.navigate("mullvad/$it") },
} onNavigateToRunAsExitNode = { navController.navigate("runExitNode") })
composable(
"peerDetails/{nodeId}", composable("main") { MainView(navigation = mainViewNav) }
arguments = listOf(navArgument("nodeId") { type = NavType.StringType })) { composable("settings") { SettingsView(settingsNav) }
PeerDetails(nav = backNav, it.arguments?.getString("nodeId") ?: "") navigation(startDestination = "list", route = "exitNodes") {
composable("list") { ExitNodePicker(exitNodePickerNav) }
composable("mullvad") { MullvadExitNodePickerList(exitNodePickerNav) }
composable(
"mullvad/{countryCode}",
arguments = listOf(navArgument("countryCode") { type = NavType.StringType })) {
MullvadExitNodePicker(
it.arguments!!.getString("countryCode")!!, exitNodePickerNav)
}
composable("runExitNode") { RunExitNodeView(exitNodePickerNav) }
} }
composable("bugReport") { BugReportView(nav = backNav) } composable(
composable("dnsSettings") { DNSSettingsView(nav = backNav) } "peerDetails/{nodeId}",
composable("tailnetLock") { TailnetLockSetupView(nav = backNav) } arguments = listOf(navArgument("nodeId") { type = NavType.StringType })) {
composable("about") { AboutView(nav = backNav) } PeerDetails(nav = backNav, it.arguments?.getString("nodeId") ?: "")
composable("mdmSettings") { MDMSettingsDebugView(nav = backNav) } }
composable("managedBy") { ManagedByView(nav = backNav) } composable("bugReport") { BugReportView(nav = backNav) }
composable("userSwitcher") { composable("dnsSettings") { DNSSettingsView(nav = backNav) }
UserSwitcherView( composable("tailnetLock") { TailnetLockSetupView(nav = backNav) }
nav = backNav, composable("about") { AboutView(nav = backNav) }
onNavigateHome = { navController.popBackStack(route = "main", inclusive = false) }) composable("mdmSettings") { MDMSettingsDebugView(nav = backNav) }
} composable("managedBy") { ManagedByView(nav = backNav) }
composable("permissions") { composable("userSwitcher") {
PermissionsView(nav = backNav, openApplicationSettings = ::openApplicationSettings) UserSwitcherView(
} nav = backNav,
composable("intro") { IntroView { navController.popBackStack() } } onNavigateHome = {
} navController.popBackStack(route = "main", inclusive = false)
})
}
composable("permissions") {
PermissionsView(nav = backNav, openApplicationSettings = ::openApplicationSettings)
}
composable("intro") { IntroView { navController.popBackStack() } }
}
// Show the intro screen one time // Show the intro screen one time
if (!introScreenViewed()) { if (!introScreenViewed()) {

Loading…
Cancel
Save