diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/SpaEnvironment.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/SpaEnvironment.kt index 6f675a300ce3e..787d0961fb21e 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/SpaEnvironment.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/SpaEnvironment.kt @@ -52,7 +52,7 @@ object SpaEnvironment { ), rootPages = listOf( SettingsPage.create(HomePageProvider.name) - ) + ArgumentPageProvider.buildRootPages() + ) ) } 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 199a45b351089..d8ef937b50c2e 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 @@ -25,6 +25,7 @@ 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.gallery.R +import com.android.settingslib.spa.gallery.page.ArgumentPageModel import com.android.settingslib.spa.gallery.page.ArgumentPageProvider import com.android.settingslib.spa.gallery.page.FooterPageProvider import com.android.settingslib.spa.gallery.page.IllustrationPageProvider @@ -39,52 +40,28 @@ object HomePageProvider : SettingsPageProvider { override fun buildEntry(arguments: Bundle?): List { val owner = SettingsPage.create(name) - val entryList = mutableListOf() - entryList.add( - PreferenceMainPageProvider.buildInjectEntry() - .setLink(fromPage = owner).build() + return listOf( + PreferenceMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + ArgumentPageProvider.buildInjectEntry("foo")!!.setLink(fromPage = owner).build(), + SliderPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + SpinnerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + SettingsPagerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + FooterPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + IllustrationPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), ) - entryList.add( - SliderPageProvider.buildInjectEntry() - .setLink(fromPage = owner).build() - ) - entryList.add( - SpinnerPageProvider.buildInjectEntry() - .setLink(fromPage = owner).build() - ) - entryList.add( - SettingsPagerPageProvider.buildInjectEntry() - .setLink(fromPage = owner).build() - ) - entryList.add( - FooterPageProvider.buildInjectEntry() - .setLink(fromPage = owner).build() - ) - entryList.add( - IllustrationPageProvider.buildInjectEntry() - .setLink(fromPage = owner).build() - ) - - return entryList } @Composable override fun Page(arguments: Bundle?) { - HomePage() - } -} - -@Composable -private fun HomePage() { - HomeScaffold(title = stringResource(R.string.app_name)) { - PreferenceMainPageProvider.EntryItem() - ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = 0) - - SliderPageProvider.EntryItem() - SpinnerPageProvider.EntryItem() - SettingsPagerPageProvider.EntryItem() - FooterPageProvider.EntryItem() - IllustrationPageProvider.EntryItem() + HomeScaffold(title = stringResource(R.string.app_name)) { + for (entry in buildEntry(arguments)) { + if (entry.name.startsWith(ArgumentPageModel.name)) { + entry.UiLayout(ArgumentPageModel.buildArgument(intParam = 0)) + } else { + entry.UiLayout() + } + } + } } } @@ -92,6 +69,6 @@ private fun HomePage() { @Composable private fun HomeScreenPreview() { SettingsTheme { - HomePage() + HomePageProvider.Page(null) } } 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 5cce21577e437..e32de7a67d9d2 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 @@ -43,7 +43,7 @@ object ArgumentPageProvider : SettingsPageProvider { .setIsAllowSearch(true) .setUiLayoutFn { // Set ui rendering - Preference(ArgumentPageModel.create(arguments).genStringParamPreferenceModel()) + Preference(ArgumentPageModel.create(it).genStringParamPreferenceModel()) }.build() ) @@ -53,54 +53,44 @@ object ArgumentPageProvider : SettingsPageProvider { .setIsAllowSearch(true) .setUiLayoutFn { // Set ui rendering - Preference(ArgumentPageModel.create(arguments).genIntParamPreferenceModel()) + Preference(ArgumentPageModel.create(it).genIntParamPreferenceModel()) }.build() ) - val entryFoo = buildInjectEntry(ArgumentPageModel.buildNextArgument("foo", arguments)) - val entryBar = buildInjectEntry(ArgumentPageModel.buildNextArgument("bar", arguments)) - if (entryFoo != null) entryList.add(entryFoo.setLink(fromPage = owner).build()) - if (entryBar != null) entryList.add(entryBar.setLink(fromPage = owner).build()) + entryList.add(buildInjectEntry("foo")!!.setLink(fromPage = owner).build()) + entryList.add(buildInjectEntry("bar")!!.setLink(fromPage = owner).build()) return entryList } - private fun buildInjectEntry(arguments: Bundle?): SettingsEntryBuilder? { + fun buildInjectEntry(stringParam: String): SettingsEntryBuilder? { + val arguments = ArgumentPageModel.buildArgument(stringParam) if (!ArgumentPageModel.isValidArgument(arguments)) return null return SettingsEntryBuilder.createInject( - entryName = ArgumentPageModel.getInjectEntryName(arguments), + entryName = "${name}_$stringParam", owner = SettingsPage.create(name, parameter, arguments) ) // Set attributes .setIsAllowSearch(false) .setUiLayoutFn { // Set ui rendering - Preference(ArgumentPageModel.create(arguments).genInjectPreferenceModel()) + Preference(ArgumentPageModel.create(it).genInjectPreferenceModel()) } } - fun buildRootPages(): List { - return listOf( - SettingsPage.create(name, parameter, ArgumentPageModel.buildArgument("foo")), - SettingsPage.create(name, parameter, ArgumentPageModel.buildArgument("bar")), - ) - } - @Composable override fun Page(arguments: Bundle?) { RegularScaffold(title = ArgumentPageModel.create(arguments).genPageTitle()) { for (entry in buildEntry(arguments)) { - entry.uiLayout() + if (entry.name.startsWith(name)) { + entry.UiLayout(ArgumentPageModel.buildNextArgument(arguments)) + } else { + entry.UiLayout() + } } } } - - @Composable - fun EntryItem(stringParam: String, intParam: Int) { - buildInjectEntry(ArgumentPageModel.buildArgument(stringParam, intParam)) - ?.build()?.uiLayout?.let { it() } - } } @Preview(showBackground = true) 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 e27bf6dc5b334..6e86fd785a0e1 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 @@ -44,19 +44,17 @@ class ArgumentPageModel : PageModel() { navArgument(INT_PARAM_NAME) { type = NavType.IntType }, ) - fun buildArgument(stringParam: String, intParam: Int? = null): Bundle { + fun buildArgument(stringParam: String? = null, intParam: Int? = null): Bundle { val args = Bundle() - args.putString(STRING_PARAM_NAME, stringParam) + if (stringParam != null) args.putString(STRING_PARAM_NAME, stringParam) if (intParam != null) args.putInt(INT_PARAM_NAME, intParam) return args } - fun buildNextArgument(newStringParam: String, arguments: Bundle? = null): Bundle { + fun buildNextArgument(arguments: Bundle? = null): Bundle { val intParam = parameter.getIntArg(INT_PARAM_NAME, arguments) - return if (intParam == null) - buildArgument(newStringParam) - else - buildArgument(newStringParam, intParam + 1) + val nextIntParam = if (intParam != null) intParam + 1 else null + return buildArgument(intParam = nextIntParam) } fun isValidArgument(arguments: Bundle?): Boolean { @@ -64,10 +62,6 @@ class ArgumentPageModel : PageModel() { return (stringParam != null && listOf("foo", "bar").contains(stringParam)) } - fun getInjectEntryName(arguments: Bundle?): String { - return "${name}_${parameter.getStringArg(STRING_PARAM_NAME, arguments)}" - } - @Composable fun create(arguments: Bundle?): ArgumentPageModel { val pageModel: ArgumentPageModel = viewModel(key = arguments.toString()) diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPage.kt index a8225839c866c..0fc2a5f5fda8a 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/FooterPage.kt @@ -69,22 +69,12 @@ object FooterPageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - FooterPage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun FooterPage() { - RegularScaffold(title = TITLE) { - for (entry in FooterPageProvider.buildEntry(arguments = null)) { - entry.uiLayout() + RegularScaffold(title = TITLE) { + for (entry in buildEntry(arguments)) { + entry.UiLayout() + } + Footer(footerText = "Footer text always at the end of page.") } - Footer(footerText = "Footer text always at the end of page.") } } @@ -92,6 +82,6 @@ private fun FooterPage() { @Composable private fun FooterPagePreview() { SettingsTheme { - FooterPage() + FooterPageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt index 1afb7d8c1ceca..a64d4a5d3ea60 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/IllustrationPage.kt @@ -84,20 +84,10 @@ object IllustrationPageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - IllustrationPage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun IllustrationPage() { - RegularScaffold(title = TITLE) { - for (entry in IllustrationPageProvider.buildEntry(arguments = null)) { - entry.uiLayout() + RegularScaffold(title = TITLE) { + for (entry in buildEntry(arguments)) { + entry.UiLayout() + } } } } @@ -106,6 +96,6 @@ private fun IllustrationPage() { @Composable private fun IllustrationPagePreview() { SettingsTheme { - IllustrationPage() + IllustrationPageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SettingsPagerPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SettingsPagerPage.kt index ff5f71b63560d..e09ebdad7a1f0 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SettingsPagerPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SettingsPagerPage.kt @@ -48,20 +48,10 @@ object SettingsPagerPageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - SettingsPagerPage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun SettingsPagerPage() { - SettingsScaffold(title = TITLE) { - SettingsPager(listOf("Personal", "Work")) { - PlaceholderTitle("Page $it") + SettingsScaffold(title = TITLE) { + SettingsPager(listOf("Personal", "Work")) { + PlaceholderTitle("Page $it") + } } } } @@ -70,6 +60,6 @@ private fun SettingsPagerPage() { @Composable private fun SettingsPagerPagePreview() { SettingsTheme { - SettingsPagerPage() + SettingsPagerPageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt index 53eeda21b49c0..0f95bf6f32c7c 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt @@ -121,20 +121,10 @@ object SliderPageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - SliderPage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun SliderPage() { - RegularScaffold(title = TITLE) { - for (entry in SliderPageProvider.buildEntry(arguments = null)) { - entry.uiLayout() + RegularScaffold(title = TITLE) { + for (entry in buildEntry(arguments)) { + entry.UiLayout() + } } } } @@ -143,6 +133,6 @@ private fun SliderPage() { @Composable private fun SliderPagePreview() { SettingsTheme { - SliderPage() + SliderPageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt index 04f1543aa9a8a..a8e49384da970 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/MainSwitchPreferencePage.kt @@ -74,20 +74,10 @@ object MainSwitchPreferencePageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - MainSwitchPreferencePage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun MainSwitchPreferencePage() { - RegularScaffold(title = TITLE) { - for (entry in MainSwitchPreferencePageProvider.buildEntry(arguments = null)) { - entry.uiLayout() + RegularScaffold(title = TITLE) { + for (entry in buildEntry(arguments)) { + entry.UiLayout() + } } } } @@ -121,6 +111,6 @@ private fun SampleNotChangeableMainSwitchPreference() { @Composable private fun MainSwitchPreferencePagePreview() { SettingsTheme { - MainSwitchPreferencePage() + MainSwitchPreferencePageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMain.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMain.kt index 417601ed786fa..0f99c57ebcad5 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMain.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferenceMain.kt @@ -33,25 +33,16 @@ object PreferenceMainPageProvider : SettingsPageProvider { override val name = "PreferenceMain" override fun buildEntry(arguments: Bundle?): List { - val entryList = mutableListOf() - entryList.add( + return listOf( PreferencePageProvider.buildInjectEntry() - .setLink(fromPage = SettingsPage.create(name)).build() - ) - entryList.add( + .setLink(fromPage = SettingsPage.create(name)).build(), SwitchPreferencePageProvider.buildInjectEntry() - .setLink(fromPage = SettingsPage.create(name)).build() - ) - entryList.add( + .setLink(fromPage = SettingsPage.create(name)).build(), MainSwitchPreferencePageProvider.buildInjectEntry() - .setLink(fromPage = SettingsPage.create(name)).build() - ) - entryList.add( + .setLink(fromPage = SettingsPage.create(name)).build(), TwoTargetSwitchPreferencePageProvider.buildInjectEntry() - .setLink(fromPage = SettingsPage.create(name)).build() + .setLink(fromPage = SettingsPage.create(name)).build(), ) - - return entryList } fun buildInjectEntry(): SettingsEntryBuilder { @@ -67,21 +58,10 @@ object PreferenceMainPageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - PreferenceMain() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun PreferenceMain() { - RegularScaffold(title = TITLE) { - PreferencePageProvider.EntryItem() - SwitchPreferencePageProvider.EntryItem() - MainSwitchPreferencePageProvider.EntryItem() - TwoTargetSwitchPreferencePageProvider.EntryItem() + RegularScaffold(title = TITLE) { + for (entry in buildEntry(arguments)) { + entry.UiLayout() + } + } } } 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 c7547a063c285..cbd028d17cbaf 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 @@ -143,20 +143,10 @@ object PreferencePageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - PreferencePage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun PreferencePage() { - RegularScaffold(title = TITLE) { - for (entry in PreferencePageProvider.buildEntry(arguments = null)) { - entry.uiLayout() + RegularScaffold(title = TITLE) { + for (entry in buildEntry(arguments)) { + entry.UiLayout() + } } } } @@ -165,6 +155,6 @@ private fun PreferencePage() { @Composable private fun PreferencePagePreview() { SettingsTheme { - PreferencePage() + PreferencePageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePage.kt index c5d52d813b065..46b44ca9d6148 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/SwitchPreferencePage.kt @@ -90,20 +90,10 @@ object SwitchPreferencePageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - SwitchPreferencePage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun SwitchPreferencePage() { - RegularScaffold(title = TITLE) { - for (entry in SwitchPreferencePageProvider.buildEntry(arguments = null)) { - entry.uiLayout() + RegularScaffold(title = TITLE) { + for (entry in buildEntry(arguments)) { + entry.UiLayout() + } } } } @@ -168,6 +158,6 @@ private fun SampleNotChangeableSwitchPreference() { @Composable private fun SwitchPreferencePagePreview() { SettingsTheme { - SwitchPreferencePage() + SwitchPreferencePageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePage.kt index 63bb50e419b08..b991f59866eb4 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/TwoTargetSwitchPreferencePage.kt @@ -90,20 +90,10 @@ object TwoTargetSwitchPreferencePageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - TwoTargetSwitchPreferencePage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun TwoTargetSwitchPreferencePage() { - RegularScaffold(title = TITLE) { - for (entry in TwoTargetSwitchPreferencePageProvider.buildEntry(arguments = null)) { - entry.uiLayout() + RegularScaffold(title = TITLE) { + for (entry in buildEntry(arguments)) { + entry.UiLayout() + } } } } @@ -168,6 +158,6 @@ private fun SampleNotChangeableTwoTargetSwitchPreference() { @Composable private fun TwoTargetSwitchPreferencePagePreview() { SettingsTheme { - TwoTargetSwitchPreferencePage() + TwoTargetSwitchPreferencePageProvider.Page(null) } } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPage.kt index 7479d467826c2..03b72d348d407 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/ui/SpinnerPage.kt @@ -51,28 +51,20 @@ object SpinnerPageProvider : SettingsPageProvider { @Composable override fun Page(arguments: Bundle?) { - SpinnerPage() - } - - @Composable - fun EntryItem() { - buildInjectEntry().build().uiLayout.let { it() } - } -} - -@Composable -private fun SpinnerPage() { - RegularScaffold(title = TITLE) { - val selectedIndex = rememberSaveable { mutableStateOf(0) } - Spinner( - options = (1..3).map { "Option $it" }, - selectedIndex = selectedIndex.value, - setIndex = { selectedIndex.value = it }, - ) - Preference(object : PreferenceModel { - override val title = "Selected index" - override val summary = remember { derivedStateOf { selectedIndex.value.toString() } } - }) + RegularScaffold(title = TITLE) { + val selectedIndex = rememberSaveable { mutableStateOf(0) } + Spinner( + options = (1..3).map { "Option $it" }, + selectedIndex = selectedIndex.value, + setIndex = { selectedIndex.value = it }, + ) + Preference(object : PreferenceModel { + override val title = "Selected index" + override val summary = remember { + derivedStateOf { selectedIndex.value.toString() } + } + }) + } } } @@ -80,6 +72,6 @@ private fun SpinnerPage() { @Composable private fun SpinnerPagePreview() { SettingsTheme { - SpinnerPage() + SpinnerPageProvider.Page(null) } } 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 095e6833b6135..bd5aaa7e17448 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 @@ -60,6 +60,17 @@ open class DebugActivity( setTheme(R.style.Theme_SpaLib_DayNight) super.onCreate(savedInstanceState) + val packageName = browseActivityClass.packageName + val className = browseActivityClass.toString().removePrefix("class $packageName") + for (pageWithEntry in entryRepository.getAllPageWithEntry()) { + if (pageWithEntry.page.hasRuntimeParam()) continue + val route = pageWithEntry.page.buildRoute() + Log.d( + "DEBUG ACTIVITY", + "adb shell am start -n $packageName/$className -e $KEY_DESTINATION $route" + ) + } + setContent { SettingsTheme { MainContent() @@ -136,6 +147,7 @@ open class DebugActivity( Text(text = "Entry size: ${pageWithEntry.entries.size}") Preference(model = object : PreferenceModel { override val title = "open page" + override val enabled = (!pageWithEntry.page.hasRuntimeParam()).toState() override val onClick = openPage(pageWithEntry.page) }) EntryList(pageWithEntry.entries) @@ -149,6 +161,7 @@ open class DebugActivity( RegularScaffold(title = "Entry ${entry.displayName}") { Preference(model = object : PreferenceModel { override val title = "open entry" + override val enabled = (!entry.hasRuntimeParam()).toState() override val onClick = openEntry(entry) }) Text(text = entry.formatAll()) @@ -168,7 +181,8 @@ open class DebugActivity( } @Composable - private fun openPage(page: SettingsPage): () -> Unit { + private fun openPage(page: SettingsPage): (() -> Unit)? { + if (page.hasRuntimeParam()) return null val route = page.buildRoute() val context = LocalContext.current val intent = Intent(context, browseActivityClass).apply { @@ -181,7 +195,8 @@ open class DebugActivity( } @Composable - private fun openEntry(entry: SettingsEntry): () -> Unit { + private fun openEntry(entry: SettingsEntry): (() -> Unit)? { + if (entry.hasRuntimeParam()) return null val route = entry.buildRoute() val context = LocalContext.current val intent = Intent(context, browseActivityClass).apply { 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 86e75f3d018cd..b0a1cbe8c224d 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 @@ -19,9 +19,9 @@ package com.android.settingslib.spa.framework.common import android.os.Bundle import androidx.compose.runtime.Composable import androidx.navigation.NamedNavArgument +import androidx.navigation.NavType import com.android.settingslib.spa.framework.BrowseActivity import com.android.settingslib.spa.framework.util.navLink -import com.android.settingslib.spa.framework.util.normalize const val INJECT_ENTRY_NAME = "INJECT" const val ROOT_ENTRY_NAME = "ROOT" @@ -85,6 +85,10 @@ data class SettingsPage( "?${BrowseActivity.HIGHLIGHT_ENTRY_PARAM_NAME}=$highlightEntryName" return name + parameter.navLink(arguments) + highlightParam } + + fun hasRuntimeParam(): Boolean { + return parameter.hasRuntimeParam(arguments) + } } /** @@ -139,7 +143,7 @@ data class SettingsEntry( * injected entry. In the long term, we may deprecate the @Composable Page() API in SPP, and * use each entries' UI rendering function in the page instead. */ - val uiLayout: (@Composable () -> Unit) = {}, + val uiLayoutImpl: (@Composable (arguments: Bundle?) -> Unit) = {}, ) { fun formatAll(): String { val content = listOf( @@ -150,10 +154,25 @@ data class SettingsEntry( return content.joinToString("\n") } + private fun getDisplayPage(): SettingsPage { + // Display the entry on its from-page, or on its owner page if the from-page is unset. + return fromPage ?: owner + } + fun buildRoute(): String { - // Open entry in its fromPage. - val page = fromPage ?: owner - return page.buildRoute(name) + return getDisplayPage().buildRoute(name) + } + + fun hasRuntimeParam(): Boolean { + return getDisplayPage().hasRuntimeParam() + } + + @Composable + fun UiLayout(runtimeArguments: Bundle? = null) { + val arguments = Bundle() + if (owner.arguments != null) arguments.putAll(owner.arguments) + if (runtimeArguments != null) arguments.putAll(runtimeArguments) + uiLayoutImpl(arguments) } } @@ -196,7 +215,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings private var isAllowSearch: Boolean? = null private var searchDataFn: () -> SearchData? = { null } - private var uiLayoutFn: (@Composable () -> Unit) = {} + private var uiLayoutFn: (@Composable (arguments: Bundle?) -> Unit) = {} fun build(): SettingsEntry { return SettingsEntry( @@ -214,7 +233,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings // functions searchData = searchDataFn, - uiLayout = uiLayoutFn, + uiLayoutImpl = uiLayoutFn, ) } @@ -237,7 +256,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings return this } - fun setUiLayoutFn(fn: @Composable () -> Unit): SettingsEntryBuilder { + fun setUiLayoutFn(fn: @Composable (arguments: Bundle?) -> Unit): SettingsEntryBuilder { this.uiLayoutFn = fn return this } @@ -272,3 +291,33 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings private fun String.toUniqueId(): Int { return this.hashCode() } + +private fun List.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) + } + } + } + return normArgs +} + +private fun List.hasRuntimeParam(arguments: Bundle? = null): Boolean { + for (navArg in this) { + if (arguments == null || !arguments.containsKey(navArg.name)) return true + } + return false +} 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 4e768eb94e88f..aaf8107b723da 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 @@ -40,29 +40,6 @@ fun List.navLink(arguments: Bundle? = null): String { return argsArray.joinToString("") { arg -> "/$arg" } } -fun List.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) - } - } - } - return normArgs -} - fun List.getStringArg(name: String, arguments: Bundle? = null): String? { if (this.containsStringArg(name) && arguments != null) { return arguments.getString(name)