Merge "Add function to create SettingsPage from Spp."

This commit is contained in:
Zekan Qian
2022-10-14 05:24:30 +00:00
committed by Android (Google) Code Review
8 changed files with 42 additions and 44 deletions

View File

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

View File

@@ -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<SettingsEntry> {
val owner = createSettingsPage(SettingsPageProviderEnum.HOME)
return listOf(
PreferenceMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
ArgumentPageProvider.buildInjectEntry("foo")!!.setLink(fromPage = owner).build(),

View File

@@ -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<SettingsEntry> {
if (!ArgumentPageModel.isValidArgument(arguments)) return emptyList()
val owner = createSettingsPage(SettingsPageProviderEnum.ARGUMENT, parameter, arguments)
val owner = createSettingsPage(arguments)
val entryList = mutableListOf<SettingsEntry>()
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

View File

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

View File

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

View File

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

View File

@@ -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<NamedNavArgument> = 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 {

View File

@@ -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<NamedNavArgument>
get() = emptyList()
@@ -38,3 +42,12 @@ interface SettingsPageProvider {
fun buildEntry(arguments: Bundle?): List<SettingsEntry> = emptyList()
}
fun SettingsPageProvider.createSettingsPage(arguments: Bundle? = null): SettingsPage {
return SettingsPage.create(
name = name,
displayName = displayName,
parameter = parameter,
arguments = arguments
)
}