Support navigate with param to SpaActivity
NavHost only support start destination without params. So do a navController navigate instead. Also, - Expose TogglePermissionAppList's route for Settings use. Bug: 235727273 Test: Manual test with Gallery & Settings app Change-Id: I6f6973371fe9e24958e5f2b733ce074bbb593460
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ fun SettingsScaffold(
|
||||
modifier = Modifier.padding(SettingsDimension.itemPaddingAround),
|
||||
)
|
||||
},
|
||||
navigationIcon = { NavigateUp() },
|
||||
navigationIcon = { NavigateBack() },
|
||||
actions = actions,
|
||||
colors = settingsTopAppBarColors(),
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user