summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Zekan Qian <pierreqian@google.com> 2022-09-30 11:44:40 +0800
committer Zekan Qian <pierreqian@google.com> 2022-10-09 13:49:07 +0800
commit18a595d08eb2d9dc083a38451e44d8941d9dc679 (patch)
tree996650b13012a94f3ead88ddfe73b63bf04aa065
parent8dce333cca797d90af8bb7acc3d952ccb68cc937 (diff)
Improve runtime parameter support.
1. Define runtime parameter as prefixed by "rt_" 2. Move entry highlight parameter into intent as Extra, instead of a runtime parameter. Bug: 244122804 Test: manual - build Gallery Change-Id: Ic8945d32868173f30c31afd5fe54b2ba12fad6e4
-rw-r--r--packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt15
-rw-r--r--packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt15
-rw-r--r--packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt2
-rw-r--r--packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt4
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt26
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/DebugActivity.kt8
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/EntryProvider.kt2
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt15
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt52
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/NavControllerWrapper.kt10
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/Parameter.kt54
-rw-r--r--packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt4
12 files changed, 85 insertions, 122 deletions
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt
index c68e918eb449..33cd5f143733 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/home/HomePage.kt
@@ -18,14 +18,11 @@ package com.android.settingslib.spa.gallery.home
import android.os.Bundle
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.framework.util.getRuntimeArguments
-import com.android.settingslib.spa.framework.util.mergeArguments
import com.android.settingslib.spa.gallery.R
import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
@@ -61,20 +58,12 @@ object HomePageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
- val globalRuntimeArgs = remember { getRuntimeArguments(arguments) }
HomeScaffold(title = stringResource(R.string.app_name)) {
for (entry in buildEntry(arguments)) {
if (entry.owner.isCreateBy(SettingsPageProviderEnum.ARGUMENT.name)) {
- entry.UiLayout(
- mergeArguments(
- listOf(
- globalRuntimeArgs,
- ArgumentPageModel.buildArgument(intParam = 0)
- )
- )
- )
+ entry.UiLayout(ArgumentPageModel.buildArgument(intParam = 0))
} else {
- entry.UiLayout(globalRuntimeArgs)
+ entry.UiLayout()
}
}
}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt
index 9bf7ad8fb8f7..4ce6225b0e9d 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPage.kt
@@ -18,15 +18,12 @@ package com.android.settingslib.spa.gallery.page
import android.os.Bundle
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.framework.util.getRuntimeArguments
-import com.android.settingslib.spa.framework.util.mergeArguments
import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
import com.android.settingslib.spa.gallery.createSettingsPage
import com.android.settingslib.spa.widget.preference.Preference
@@ -101,20 +98,12 @@ object ArgumentPageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
- val globalRuntimeArgs = remember { getRuntimeArguments(arguments) }
RegularScaffold(title = ArgumentPageModel.create(arguments).genPageTitle()) {
for (entry in buildEntry(arguments)) {
if (entry.toPage != null) {
- entry.UiLayout(
- mergeArguments(
- listOf(
- globalRuntimeArgs,
- ArgumentPageModel.buildNextArgument(arguments)
- )
- )
- )
+ entry.UiLayout(ArgumentPageModel.buildNextArgument(arguments))
} else {
- entry.UiLayout(globalRuntimeArgs)
+ entry.UiLayout()
}
}
}
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt
index ee2bde4c2edb..107d3f316c23 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt
@@ -38,7 +38,7 @@ private const val PAGE_TITLE = "Sample page with arguments"
private const val STRING_PARAM_TITLE = "String param value"
private const val INT_PARAM_TITLE = "Int param value"
private const val STRING_PARAM_NAME = "stringParam"
-private const val INT_PARAM_NAME = "intParam"
+private const val INT_PARAM_NAME = "rt_intParam"
private val ARGUMENT_PAGE_KEYWORDS = listOf("argument keyword1", "argument keyword2")
class ArgumentPageModel : PageModel() {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt
index e3416c6f14ca..af30e79f45b5 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt
@@ -30,7 +30,6 @@ import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.theme.SettingsTheme
-import com.android.settingslib.spa.framework.util.getRuntimeArguments
import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
import com.android.settingslib.spa.gallery.createSettingsPage
import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.ASYNC_PREFERENCE_TITLE
@@ -178,10 +177,9 @@ object PreferencePageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
- val globalRuntimeArgs = remember { getRuntimeArguments(arguments) }
RegularScaffold(title = PAGE_TITLE) {
for (entry in buildEntry(arguments)) {
- entry.UiLayout(globalRuntimeArgs)
+ entry.UiLayout()
}
}
}
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 138ea02b04d1..0452fccf3e3d 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
@@ -25,13 +25,13 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.navigation.NavGraph.Companion.findStartDestination
-import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
-import androidx.navigation.navArgument
import com.android.settingslib.spa.R
import com.android.settingslib.spa.framework.common.SpaEnvironment
+import com.android.settingslib.spa.framework.compose.LocalNavController
+import com.android.settingslib.spa.framework.compose.NavControllerWrapperImpl
import com.android.settingslib.spa.framework.compose.localNavController
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.framework.util.navRoute
@@ -70,31 +70,29 @@ open class BrowseActivity(spaEnvironment: SpaEnvironment) : ComponentActivity()
composable(NULL_PAGE_NAME) {}
for (page in sppRepository.getAllProviders()) {
composable(
- route = page.name + page.parameter.navRoute() +
- "?$HIGHLIGHT_ENTRY_PARAM_NAME={$HIGHLIGHT_ENTRY_PARAM_NAME}",
- arguments = page.parameter + listOf(
- // add optional parameters
- navArgument(HIGHLIGHT_ENTRY_PARAM_NAME) { defaultValue = "null" }
- ),
- ) { navBackStackEntry ->
- page.Page(navBackStackEntry.arguments)
+ route = page.name + page.parameter.navRoute(),
+ arguments = page.parameter,
+ ) { navBackStackEntry -> page.Page(navBackStackEntry.arguments)
}
}
}
+ InitialDestinationNavigator()
}
-
- InitialDestinationNavigator(navController)
}
@Composable
- private fun InitialDestinationNavigator(navController: NavHostController) {
+ private fun InitialDestinationNavigator() {
val destinationNavigated = rememberSaveable { mutableStateOf(false) }
if (destinationNavigated.value) return
destinationNavigated.value = true
+ val controller = LocalNavController.current as NavControllerWrapperImpl
LaunchedEffect(Unit) {
val destination =
intent?.getStringExtra(KEY_DESTINATION) ?: sppRepository.getDefaultStartPage()
+ val highlightEntryId = intent?.getStringExtra(KEY_HIGHLIGHT_ENTRY)
if (destination.isNotEmpty()) {
+ controller.highlightId = highlightEntryId
+ val navController = controller.navController
navController.navigate(destination) {
popUpTo(navController.graph.findStartDestination().id) {
inclusive = true
@@ -106,6 +104,6 @@ open class BrowseActivity(spaEnvironment: SpaEnvironment) : ComponentActivity()
companion object {
const val KEY_DESTINATION = "spaActivityDestination"
- const val HIGHLIGHT_ENTRY_PARAM_NAME = "highlightEntry"
+ const val KEY_HIGHLIGHT_ENTRY = "highlightEntry"
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/DebugActivity.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/DebugActivity.kt
index 85fc366dd3f5..147eae1de834 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/DebugActivity.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/DebugActivity.kt
@@ -34,6 +34,7 @@ import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.android.settingslib.spa.R
import com.android.settingslib.spa.framework.BrowseActivity.Companion.KEY_DESTINATION
+import com.android.settingslib.spa.framework.BrowseActivity.Companion.KEY_HIGHLIGHT_ENTRY
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SpaEnvironment
@@ -190,7 +191,7 @@ open class DebugActivity(private val spaEnvironment: SpaEnvironment) : Component
RegularScaffold(title = "Entry - ${entry.displayTitle()}") {
Preference(model = object : PreferenceModel {
override val title = "open entry"
- override val enabled = (!entry.hasRuntimeParam()).toState()
+ override val enabled = (!entry.containerPage().hasRuntimeParam()).toState()
override val onClick = openEntry(entry)
})
Text(text = entryContent)
@@ -225,11 +226,12 @@ open class DebugActivity(private val spaEnvironment: SpaEnvironment) : Component
@Composable
private fun openEntry(entry: SettingsEntry): (() -> Unit)? {
- if (entry.hasRuntimeParam()) return null
+ if (entry.containerPage().hasRuntimeParam()) return null
val context = LocalContext.current
- val route = entry.buildRoute()
+ val route = entry.containerPage().buildRoute()
val intent = Intent(context, spaEnvironment.browseActivityClass).apply {
putExtra(KEY_DESTINATION, route)
+ putExtra(KEY_HIGHLIGHT_ENTRY, entry.id)
}
return {
Log.d("DEBUG ACTIVITY", "Open entry: $route")
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/EntryProvider.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/EntryProvider.kt
index f0ec83b42498..852643f2ab89 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/EntryProvider.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/EntryProvider.kt
@@ -208,7 +208,7 @@ open class EntryProvider(spaEnvironment: SpaEnvironment) : ContentProvider() {
cursor.newRow()
.add(ColumnEnum.ENTRY_ID.id, entry.id)
.add(ColumnEnum.ENTRY_NAME.id, entry.displayName)
- .add(ColumnEnum.ENTRY_ROUTE.id, entry.buildRoute())
+ .add(ColumnEnum.ENTRY_ROUTE.id, entry.containerPage().buildRoute())
.add(ColumnEnum.ENTRY_TITLE.id, searchData?.title ?: "")
.add(
ColumnEnum.ENTRY_SEARCH_KEYWORD.id,
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt
index 81d0bffca643..e727af4387fa 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt
@@ -23,7 +23,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.platform.LocalContext
-import com.android.settingslib.spa.framework.BrowseActivity.Companion.HIGHLIGHT_ENTRY_PARAM_NAME
+import com.android.settingslib.spa.framework.compose.LocalNavController
const val INJECT_ENTRY_NAME = "INJECT"
const val ROOT_ENTRY_NAME = "ROOT"
@@ -90,20 +90,12 @@ data class SettingsEntry(
return "${owner.displayName}:$displayName"
}
- private fun containerPage(): SettingsPage {
+ fun containerPage(): SettingsPage {
// The Container page of the entry, which is the from-page or
// the owner-page if from-page is unset.
return fromPage ?: owner
}
- fun buildRoute(): String {
- return containerPage().buildRoute(id)
- }
-
- fun hasRuntimeParam(): Boolean {
- return containerPage().hasRuntimeParam()
- }
-
private fun fullArgument(runtimeArguments: Bundle? = null): Bundle {
val arguments = Bundle()
if (owner.arguments != null) arguments.putAll(owner.arguments)
@@ -119,8 +111,9 @@ data class SettingsEntry(
@Composable
fun UiLayout(runtimeArguments: Bundle? = null) {
val context = LocalContext.current
+ val controller = LocalNavController.current
val highlight = rememberSaveable {
- mutableStateOf(runtimeArguments?.getString(HIGHLIGHT_ENTRY_PARAM_NAME) == id)
+ mutableStateOf(controller.highlightEntryId == id)
}
if (highlight.value) {
highlight.value = false
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt
index 0c301b937cce..2659c10f8eda 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt
@@ -18,9 +18,9 @@ package com.android.settingslib.spa.framework.common
import android.os.Bundle
import androidx.navigation.NamedNavArgument
-import androidx.navigation.NavType
-import com.android.settingslib.spa.framework.BrowseActivity
+import com.android.settingslib.spa.framework.util.isRuntimeParam
import com.android.settingslib.spa.framework.util.navLink
+import com.android.settingslib.spa.framework.util.normalize
/**
* Defines data to identify a Settings page.
@@ -74,57 +74,25 @@ data class SettingsPage(
}
fun formatArguments(): String {
- val normalizedArguments = parameter.normalize(arguments)
- if (normalizedArguments == null || normalizedArguments.isEmpty) return "[No arguments]"
- return normalizedArguments.toString().removeRange(0, 6)
+ val normArguments = parameter.normalize(arguments)
+ if (normArguments == null || normArguments.isEmpty) return "[No arguments]"
+ return normArguments.toString().removeRange(0, 6)
}
fun formatDisplayTitle(): String {
return "$displayName ${formatArguments()}"
}
- fun buildRoute(highlightEntryId: String? = null): String {
- val highlightParam =
- if (highlightEntryId == null)
- ""
- else
- "?${BrowseActivity.HIGHLIGHT_ENTRY_PARAM_NAME}=$highlightEntryId"
- return name + parameter.navLink(arguments) + highlightParam
+ fun buildRoute(): String {
+ return name + parameter.navLink(arguments)
}
fun hasRuntimeParam(): Boolean {
- return parameter.hasRuntimeParam(arguments)
- }
-}
-
-private fun List<NamedNavArgument>.normalize(arguments: Bundle? = null): Bundle? {
- if (this.isEmpty()) return null
- val normArgs = Bundle()
- for (navArg in this) {
- when (navArg.argument.type) {
- NavType.StringType -> {
- val value = arguments?.getString(navArg.name)
- if (value != null)
- normArgs.putString(navArg.name, value)
- else
- normArgs.putString("unset_" + navArg.name, null)
- }
- NavType.IntType -> {
- if (arguments != null && arguments.containsKey(navArg.name))
- normArgs.putInt(navArg.name, arguments.getInt(navArg.name))
- else
- normArgs.putString("unset_" + navArg.name, null)
- }
+ for (navArg in parameter) {
+ if (navArg.isRuntimeParam()) return true
}
+ return false
}
- return normArgs
-}
-
-private fun List<NamedNavArgument>.hasRuntimeParam(arguments: Bundle? = null): Boolean {
- for (navArg in this) {
- if (arguments == null || !arguments.containsKey(navArg.name)) return true
- }
- return false
}
fun String.toHashId(): String {
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 13a2cc9d252c..382c498ca5b2 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
@@ -27,6 +27,9 @@ import androidx.navigation.NavHostController
interface NavControllerWrapper {
fun navigate(route: String)
fun navigateBack()
+
+ val highlightEntryId: String?
+ get() = null
}
@Composable
@@ -56,9 +59,11 @@ fun navigator(route: String?): () -> Unit {
}
internal class NavControllerWrapperImpl(
- private val navController: NavHostController,
+ val navController: NavHostController,
private val onBackPressedDispatcher: OnBackPressedDispatcher?,
) : NavControllerWrapper {
+ var highlightId: String? = null
+
override fun navigate(route: String) {
navController.navigate(route)
}
@@ -66,4 +71,7 @@ internal class NavControllerWrapperImpl(
override fun navigateBack() {
onBackPressedDispatcher?.onBackPressed()
}
+
+ override val highlightEntryId: String?
+ get() = highlightId
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/Parameter.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/Parameter.kt
index 452f76abb984..f10d3b097fc8 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/Parameter.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/Parameter.kt
@@ -19,7 +19,10 @@ package com.android.settingslib.spa.framework.util
import android.os.Bundle
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavType
-import com.android.settingslib.spa.framework.BrowseActivity
+
+const val RUNTIME_PARAM_PREFIX = "rt_"
+const val UNSET_PARAM_PREFIX = "unset_"
+const val UNSET_PARAM_VALUE = "[unset]"
fun List<NamedNavArgument>.navRoute(): String {
return this.joinToString("") { argument -> "/{${argument.name}}" }
@@ -29,7 +32,7 @@ fun List<NamedNavArgument>.navLink(arguments: Bundle? = null): String {
val argsArray = mutableListOf<String>()
for (navArg in this) {
if (arguments == null || !arguments.containsKey(navArg.name)) {
- argsArray.add("[rt]")
+ argsArray.add(UNSET_PARAM_VALUE)
continue
}
when (navArg.argument.type) {
@@ -44,6 +47,35 @@ fun List<NamedNavArgument>.navLink(arguments: Bundle? = null): String {
return argsArray.joinToString("") { arg -> "/$arg" }
}
+fun List<NamedNavArgument>.normalize(arguments: Bundle? = null): Bundle? {
+ if (this.isEmpty()) return null
+ val normArgs = Bundle()
+ for (navArg in this) {
+ // Erase value of runtime parameters.
+ if (navArg.isRuntimeParam()) {
+ normArgs.putString(navArg.name, null)
+ continue
+ }
+
+ when (navArg.argument.type) {
+ NavType.StringType -> {
+ val value = arguments?.getString(navArg.name)
+ if (value != null)
+ normArgs.putString(navArg.name, value)
+ else
+ normArgs.putString(UNSET_PARAM_PREFIX + navArg.name, null)
+ }
+ NavType.IntType -> {
+ if (arguments != null && arguments.containsKey(navArg.name))
+ normArgs.putInt(navArg.name, arguments.getInt(navArg.name))
+ else
+ normArgs.putString(UNSET_PARAM_PREFIX + navArg.name, null)
+ }
+ }
+ }
+ return normArgs
+}
+
fun List<NamedNavArgument>.getStringArg(name: String, arguments: Bundle? = null): String? {
if (this.containsStringArg(name) && arguments != null) {
return arguments.getString(name)
@@ -72,20 +104,6 @@ fun List<NamedNavArgument>.containsIntArg(name: String): Boolean {
return false
}
-fun getRuntimeArguments(arguments: Bundle? = null): Bundle {
- val res = Bundle()
- val highlightEntry = arguments?.getString(BrowseActivity.HIGHLIGHT_ENTRY_PARAM_NAME)
- if (highlightEntry != null) {
- res.putString(BrowseActivity.HIGHLIGHT_ENTRY_PARAM_NAME, highlightEntry)
- }
- // Append more general runtime arguments here
- return res
-}
-
-fun mergeArguments(argsList: List<Bundle?>): Bundle {
- val res = Bundle()
- for (args in argsList) {
- if (args != null) res.putAll(args)
- }
- return res
+fun NamedNavArgument.isRuntimeParam(): Boolean {
+ return this.name.startsWith(RUNTIME_PARAM_PREFIX)
}
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt
index e8b046aa4860..de5a4a2e28db 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt
@@ -46,8 +46,8 @@ import kotlinx.coroutines.Dispatchers
private const val ENTRY_NAME = "AllowControl"
private const val PERMISSION = "permission"
-private const val PACKAGE_NAME = "packageName"
-private const val USER_ID = "userId"
+private const val PACKAGE_NAME = "rt_packageName"
+private const val USER_ID = "rt_userId"
private const val PAGE_NAME = "TogglePermissionAppInfoPage"
private val PAGE_PARAMETER = listOf(
navArgument(PERMISSION) { type = NavType.StringType },