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:
Chaohui Wang
2022-08-30 00:07:11 +08:00
parent cba895595e
commit f329c66868
6 changed files with 50 additions and 14 deletions

View File

@@ -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"
}
}

View File

@@ -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()
}
}

View File

@@ -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()
}
}

View File

@@ -49,7 +49,7 @@ fun SettingsScaffold(
modifier = Modifier.padding(SettingsDimension.itemPaddingAround),
)
},
navigationIcon = { NavigateUp() },
navigationIcon = { NavigateBack() },
actions = actions,
colors = settingsTopAppBarColors(),
)

View File

@@ -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

View File

@@ -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))
}
}