diff options
6 files changed, 50 insertions, 14 deletions
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt index 6a7b17ab1b27..e8d1ea2c7680 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt @@ -21,6 +21,8 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect +import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController @@ -46,12 +48,11 @@ open class BrowseActivity( @Composable private fun MainContent() { - val startDestination = - intent?.getStringExtra(KEY_START_DESTINATION) ?: sppRepository.getDefaultStartPageName() + val destination = intent?.getStringExtra(KEY_DESTINATION) val navController = rememberNavController() CompositionLocalProvider(navController.localNavController()) { - NavHost(navController, startDestination) { + NavHost(navController, sppRepository.getDefaultStartPageName()) { for (page in sppRepository.getAllProviders()) { composable( route = page.route, @@ -61,6 +62,16 @@ open class BrowseActivity( } } } + + if (!destination.isNullOrEmpty()) { + LaunchedEffect(Unit) { + navController.navigate(destination) { + popUpTo(navController.graph.findStartDestination().id) { + inclusive = true + } + } + } + } } } @@ -68,6 +79,6 @@ open class BrowseActivity( get() = name + arguments.joinToString("") { argument -> "/{${argument.name}}" } companion object { - const val KEY_START_DESTINATION = "spa:SpaActivity:startDestination" + const val KEY_DESTINATION = "spa:SpaActivity:destination" } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavControllerWrapper.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavControllerWrapper.kt index c68d5de0d7c7..32ef0bb3d19b 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavControllerWrapper.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavControllerWrapper.kt @@ -16,25 +16,35 @@ package com.android.settingslib.spa.framework.compose +import androidx.activity.OnBackPressedDispatcher +import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.compose.runtime.Composable +import androidx.compose.runtime.ProvidedValue import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.remember import androidx.navigation.NavHostController interface NavControllerWrapper { fun navigate(route: String) - fun navigateUp() + fun navigateBack() } @Composable -fun NavHostController.localNavController() = - LocalNavController provides remember { NavControllerWrapperImpl(this) } +fun NavHostController.localNavController(): ProvidedValue<NavControllerWrapper> { + val onBackPressedDispatcherOwner = LocalOnBackPressedDispatcherOwner.current + return LocalNavController provides remember { + NavControllerWrapperImpl( + navController = this, + onBackPressedDispatcher = onBackPressedDispatcherOwner?.onBackPressedDispatcher, + ) + } +} val LocalNavController = compositionLocalOf<NavControllerWrapper> { object : NavControllerWrapper { override fun navigate(route: String) {} - override fun navigateUp() {} + override fun navigateBack() {} } } @@ -46,12 +56,13 @@ fun navigator(route: String): () -> Unit { internal class NavControllerWrapperImpl( private val navController: NavHostController, + private val onBackPressedDispatcher: OnBackPressedDispatcher?, ) : NavControllerWrapper { override fun navigate(route: String) { navController.navigate(route) } - override fun navigateUp() { - navController.navigateUp() + override fun navigateBack() { + onBackPressedDispatcher?.onBackPressed() } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt index c9602543b364..b8e43609708d 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt @@ -26,13 +26,13 @@ import androidx.compose.ui.res.stringResource import com.android.settingslib.spa.framework.compose.LocalNavController @Composable -internal fun NavigateUp() { +internal fun NavigateBack() { val navController = LocalNavController.current val contentDescription = stringResource( id = androidx.appcompat.R.string.abc_action_bar_up_description, ) BackAction(contentDescription) { - navController.navigateUp() + navController.navigateBack() } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffold.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffold.kt index ee453f246623..8b530b0d7b9b 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffold.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffold.kt @@ -49,7 +49,7 @@ fun SettingsScaffold( modifier = Modifier.padding(SettingsDimension.itemPaddingAround), ) }, - navigationIcon = { NavigateUp() }, + navigationIcon = { NavigateBack() }, actions = actions, colors = settingsTopAppBarColors(), ) diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListModel.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListModel.kt index e1354bdd9871..a2848392a2f0 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListModel.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListModel.kt @@ -68,6 +68,14 @@ interface TogglePermissionAppListModelFactory { } ) } + + /** + * Gets the route to the toggle permission App List page. + * + * Expose route to enable enter from non-SPA pages. + */ + fun getRoute(permissionType: String): String = + TogglePermissionAppListPageProvider.getRoute(permissionType) } @Composable diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPage.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPage.kt index 6d00d56e6952..a4d9058fde4d 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPage.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPage.kt @@ -75,8 +75,14 @@ internal class TogglePermissionAppListPageProvider( } companion object { + /** + * Gets the route to this page. + * + * Expose route to enable enter from non-SPA pages. + */ + internal fun getRoute(permissionType: String) = "$NAME/$permissionType" @Composable - internal fun navigator(permissionType: String) = navigator(route = "$NAME/$permissionType") + internal fun navigator(permissionType: String) = navigator(route = getRoute(permissionType)) } } |