From 9fa6c19e32507182025b77d06663abdf3d076906 Mon Sep 17 00:00:00 2001 From: Zekan Qian Date: Tue, 13 Sep 2022 19:06:45 +0800 Subject: [PATCH] Better support for argument pages. 1. Add arguments in Entry.UiLayout API for runtime parameters 2. Remove EntryItem for all pages in gallery, use entry.UiLayout instead. 3. Link argument page in gallery's home page 4. Disable "open page" / "open entry" when there is runtime parameter in DebugActivity 5. Add debug message to open all pages in SPA Bug: 244122804 Test: manual - build Spa gallery Change-Id: Ibd5dfe3f1d154b6464a50cc3d8ccb084d15d3bf4 --- .../settingslib/spa/gallery/SpaEnvironment.kt | 2 +- .../settingslib/spa/gallery/home/HomePage.kt | 61 ++++++----------- .../spa/gallery/page/ArgumentPage.kt | 36 ++++------ .../spa/gallery/page/ArgumentPageModel.kt | 16 ++--- .../spa/gallery/page/FooterPage.kt | 22 ++----- .../spa/gallery/page/IllustrationPage.kt | 20 ++---- .../spa/gallery/page/SettingsPagerPage.kt | 20 ++---- .../spa/gallery/page/SliderPage.kt | 20 ++---- .../preference/MainSwitchPreferencePage.kt | 20 ++---- .../spa/gallery/preference/PreferenceMain.kt | 40 +++--------- .../spa/gallery/preference/PreferencePage.kt | 20 ++---- .../preference/SwitchPreferencePage.kt | 20 ++---- .../TwoTargetSwitchPreferencePage.kt | 20 ++---- .../settingslib/spa/gallery/ui/SpinnerPage.kt | 38 +++++------ .../spa/framework/DebugActivity.kt | 19 +++++- .../spa/framework/common/SettingsEntry.kt | 65 ++++++++++++++++--- .../spa/framework/util/Parameter.kt | 23 ------- 17 files changed, 178 insertions(+), 284 deletions(-) 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)