From a81a2248e5b8ee7fc4a6d309a19210dfdd34d1c6 Mon Sep 17 00:00:00 2001 From: Zekan Qian Date: Thu, 13 Oct 2022 17:08:51 +0800 Subject: [PATCH] Add function to create SettingsPage from Spp. With this function, we can get build SettingsPage in browse activity, and log page event with its pageId. Bug: 244122804 Test: manual - build Gallery Change-Id: Ib11ec0b50fa60088f75efc6f0448f4a07ca47b59 --- .../spa/gallery/GallerySpaEnvironment.kt | 19 ++----------------- .../settingslib/spa/gallery/home/HomePage.kt | 5 +++-- .../spa/gallery/page/ArgumentPage.kt | 8 ++++---- .../spa/gallery/preference/PreferenceMain.kt | 16 +++++++--------- .../spa/gallery/preference/PreferencePage.kt | 5 +++-- .../common/SettingsEntryRepository.kt | 2 +- .../spa/framework/common/SettingsPage.kt | 14 +++++++------- .../framework/common/SettingsPageProvider.kt | 17 +++++++++++++++-- 8 files changed, 42 insertions(+), 44 deletions(-) diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt index aa457fe2c8054..d154dc113d0e9 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt @@ -16,11 +16,9 @@ package com.android.settingslib.spa.gallery -import android.os.Bundle -import androidx.navigation.NamedNavArgument -import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository import com.android.settingslib.spa.framework.common.SpaEnvironment +import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider import com.android.settingslib.spa.gallery.home.HomePageProvider import com.android.settingslib.spa.gallery.page.ArgumentPageProvider @@ -49,19 +47,6 @@ enum class SettingsPageProviderEnum(val displayName: String) { // Add your SPPs } -fun createSettingsPage( - SppName: SettingsPageProviderEnum, - parameter: List = emptyList(), - arguments: Bundle? = null -): SettingsPage { - return SettingsPage.create( - name = SppName.name, - displayName = SppName.displayName, - parameter = parameter, - arguments = arguments, - ) -} - object GallerySpaEnvironment : SpaEnvironment() { override val pageProviderRepository = lazy { SettingsPageProviderRepository( @@ -82,7 +67,7 @@ object GallerySpaEnvironment : SpaEnvironment() { ActionButtonPageProvider, ), rootPages = listOf( - createSettingsPage(SettingsPageProviderEnum.HOME) + HomePageProvider.createSettingsPage(), ) ) } 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 33cd5f143733c..e40775a958134 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 @@ -22,11 +22,11 @@ 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.common.createSettingsPage import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.R import com.android.settingslib.spa.gallery.SettingsPageProviderEnum import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider -import com.android.settingslib.spa.gallery.createSettingsPage import com.android.settingslib.spa.gallery.page.ArgumentPageModel import com.android.settingslib.spa.gallery.page.ArgumentPageProvider import com.android.settingslib.spa.gallery.page.FooterPageProvider @@ -40,9 +40,10 @@ import com.android.settingslib.spa.widget.scaffold.HomeScaffold object HomePageProvider : SettingsPageProvider { override val name = SettingsPageProviderEnum.HOME.name + override val displayName = SettingsPageProviderEnum.HOME.displayName + private val owner = createSettingsPage() override fun buildEntry(arguments: Bundle?): List { - val owner = createSettingsPage(SettingsPageProviderEnum.HOME) return listOf( PreferenceMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), ArgumentPageProvider.buildInjectEntry("foo")!!.setLink(fromPage = owner).build(), 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 5031fb445e06e..82073104a3a7d 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 @@ -23,9 +23,9 @@ 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.common.createSettingsPage import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.SettingsPageProviderEnum -import com.android.settingslib.spa.gallery.createSettingsPage import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.scaffold.RegularScaffold @@ -43,13 +43,13 @@ object ArgumentPageProvider : SettingsPageProvider { } override val name = SettingsPageProviderEnum.ARGUMENT.name - + override val displayName = SettingsPageProviderEnum.ARGUMENT.displayName override val parameter = ArgumentPageModel.parameter override fun buildEntry(arguments: Bundle?): List { if (!ArgumentPageModel.isValidArgument(arguments)) return emptyList() - val owner = createSettingsPage(SettingsPageProviderEnum.ARGUMENT, parameter, arguments) + val owner = createSettingsPage(arguments) val entryList = mutableListOf() entryList.add( createEntry(owner, EntryEnum.STRING_PARAM) @@ -86,7 +86,7 @@ object ArgumentPageProvider : SettingsPageProvider { if (!ArgumentPageModel.isValidArgument(arguments)) return null return SettingsEntryBuilder.createInject( - owner = createSettingsPage(SettingsPageProviderEnum.ARGUMENT, parameter, arguments), + owner = createSettingsPage(arguments), displayName = "${name}_$stringParam", ) // Set attributes 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 0f99c57ebcad5..165eaa05c9d50 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 @@ -20,8 +20,8 @@ import android.os.Bundle import androidx.compose.runtime.Composable 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.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel @@ -31,22 +31,20 @@ private const val TITLE = "Category: Preference" object PreferenceMainPageProvider : SettingsPageProvider { override val name = "PreferenceMain" + private val owner = createSettingsPage() override fun buildEntry(arguments: Bundle?): List { return listOf( - PreferencePageProvider.buildInjectEntry() - .setLink(fromPage = SettingsPage.create(name)).build(), - SwitchPreferencePageProvider.buildInjectEntry() - .setLink(fromPage = SettingsPage.create(name)).build(), - MainSwitchPreferencePageProvider.buildInjectEntry() - .setLink(fromPage = SettingsPage.create(name)).build(), + PreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + SwitchPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + MainSwitchPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(), TwoTargetSwitchPreferencePageProvider.buildInjectEntry() - .setLink(fromPage = SettingsPage.create(name)).build(), + .setLink(fromPage = owner).build(), ) } fun buildInjectEntry(): SettingsEntryBuilder { - return SettingsEntryBuilder.createInject(owner = SettingsPage.create(name)) + return SettingsEntryBuilder.createInject(owner = owner) .setIsAllowSearch(true) .setUiLayoutFn { Preference(object : PreferenceModel { 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 f7f01eaa4a932..f19e9a3c9d75f 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,11 +30,11 @@ import com.android.settingslib.spa.framework.common.EntrySearchData 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.common.createSettingsPage import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.gallery.R 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 import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.AUTO_UPDATE_PREFERENCE_TITLE import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.DISABLE_PREFERENCE_SUMMARY @@ -66,7 +66,8 @@ object PreferencePageProvider : SettingsPageProvider { } override val name = SettingsPageProviderEnum.PREFERENCE.name - private val owner = createSettingsPage(SettingsPageProviderEnum.PREFERENCE) + override val displayName = SettingsPageProviderEnum.PREFERENCE.displayName + private val owner = createSettingsPage() private fun createEntry(entry: EntryEnum): SettingsEntryBuilder { return SettingsEntryBuilder.create(owner, entry.name, entry.displayName) diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt index ed4004f2b39cb..ea20233288b43 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt @@ -55,7 +55,7 @@ class SettingsEntryRepository(sppRepository: SettingsPageProviderRepository) { val entry = entryQueue.pop() val page = entry.toPage if (page == null || pageWithEntryMap.containsKey(page.id)) continue - val spp = sppRepository.getProviderOrNull(page.name) ?: continue + val spp = sppRepository.getProviderOrNull(page.sppName) ?: continue val newEntries = spp.buildEntry(page.arguments) pageWithEntryMap[page.id] = SettingsPageWithEntry(page, newEntries) for (newEntry in newEntries) { 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 2659c10f8edaf..e7d89066b357d 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 @@ -26,16 +26,16 @@ import com.android.settingslib.spa.framework.util.normalize * Defines data to identify a Settings page. */ data class SettingsPage( - // The unique id of this page, which is computed by name + normalized(arguments) + // The unique id of this page, which is computed by sppName + normalized(arguments) val id: String, - // The name of the page, which is used to compute the unique id, and need to be stable. - val name: String, + // The name of the page provider, who creates this page. It is used to compute the unique id. + val sppName: String, // The display name of the page, for better readability. val displayName: String, - // Defined parameters of this page. + // The parameters defined in its page provider. val parameter: List = emptyList(), // The arguments of this page. @@ -50,7 +50,7 @@ data class SettingsPage( ): SettingsPage { return SettingsPage( id = id(name, parameter, arguments), - name = name, + sppName = name, displayName = displayName ?: name, parameter = parameter, arguments = arguments @@ -70,7 +70,7 @@ data class SettingsPage( // Returns if this Settings Page is created by the given Spp. fun isCreateBy(SppName: String): Boolean { - return name == SppName + return sppName == SppName } fun formatArguments(): String { @@ -84,7 +84,7 @@ data class SettingsPage( } fun buildRoute(): String { - return name + parameter.navLink(arguments) + return sppName + parameter.navLink(arguments) } fun hasRuntimeParam(): Boolean { diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPageProvider.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPageProvider.kt index 965c2b39f4db0..e8a44119ba848 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPageProvider.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPageProvider.kt @@ -21,13 +21,17 @@ import androidx.compose.runtime.Composable import androidx.navigation.NamedNavArgument /** - * An SettingsPageProvider represent a Settings page. + * An SettingsPageProvider which is used to create Settings page instances. */ interface SettingsPageProvider { - /** The page name without arguments. */ + /** The page provider name, needs to be *unique* and *stable*. */ val name: String + /** The display name of this page provider, for better readability. */ + val displayName: String? + get() = null + /** The page parameters, default is no parameters. */ val parameter: List get() = emptyList() @@ -38,3 +42,12 @@ interface SettingsPageProvider { fun buildEntry(arguments: Bundle?): List = emptyList() } + +fun SettingsPageProvider.createSettingsPage(arguments: Bundle? = null): SettingsPage { + return SettingsPage.create( + name = name, + displayName = displayName, + parameter = parameter, + arguments = arguments + ) +}