Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3bcba3e6 authored by Zekan Qian's avatar Zekan Qian Committed by Android (Google) Code Review
Browse files

Merge "Support StaticData / SearchData in SettingsEntry."

parents 9f07f341 f839df8c
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -18,4 +18,8 @@ package com.android.settingslib.spa.gallery

import com.android.settingslib.spa.framework.DebugActivity

class GalleryDebugActivity : DebugActivity(SpaEnvironment.EntryRepository, MainActivity::class.java)
class GalleryDebugActivity : DebugActivity(
    SpaEnvironment.EntryRepository,
    MainActivity::class.java,
    "com.android.spa.gallery.provider",
)
+29 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.settingslib.spa.gallery

import android.os.Bundle
import androidx.navigation.NamedNavArgument
import com.android.settingslib.spa.framework.common.SettingsEntryRepository
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
@@ -34,6 +36,32 @@ import com.android.settingslib.spa.gallery.preference.TwoTargetSwitchPreferenceP
import com.android.settingslib.spa.gallery.ui.CategoryPageProvider
import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider

/**
 * Enum to define all SPP name here.
 * Since the SPP name would be used in log, DO NOT change it once it is set. One can still change
 * the display name for better readability if necessary.
 */
enum class SettingsPageProviderEnum(val displayName: String) {
    HOME("home"),
    PREFERENCE("preference"),
    ARGUMENT("argument"),

    // Add your SPPs
}

fun createSettingsPage(
    SppName: SettingsPageProviderEnum,
    parameter: List<NamedNavArgument> = emptyList(),
    arguments: Bundle? = null
): SettingsPage {
    return SettingsPage(
        name = SppName.name,
        displayName = SppName.displayName,
        parameter = parameter,
        arguments = arguments,
    )
}

object SpaEnvironment {
    val PageProviderRepository: SettingsPageProviderRepository by
    lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
@@ -55,7 +83,7 @@ object SpaEnvironment {
                ActionButtonPageProvider,
            ),
            rootPages = listOf(
                SettingsPage.create(HomePageProvider.name)
                createSettingsPage(SettingsPageProviderEnum.HOME)
            )
        )
    }
+12 −13
Original line number Diff line number Diff line
@@ -21,10 +21,10 @@ import androidx.compose.runtime.Composable
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.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.SettingsPageProviderEnum
import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
import com.android.settingslib.spa.gallery.page.ArgumentPageModel
import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
@@ -38,20 +38,19 @@ import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider
import com.android.settingslib.spa.widget.scaffold.HomeScaffold

object HomePageProvider : SettingsPageProvider {
    override val name = "Home"
    override val name = SettingsPageProviderEnum.HOME.name

    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
        val owner = SettingsPage.create(name)
        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(),
            CategoryPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            ActionButtonPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            PreferenceMainPageProvider.buildInjectEntry().build(),
            ArgumentPageProvider.buildInjectEntry("foo")!!.build(),
            SliderPageProvider.buildInjectEntry().build(),
            SpinnerPageProvider.buildInjectEntry().build(),
            SettingsPagerPageProvider.buildInjectEntry().build(),
            FooterPageProvider.buildInjectEntry().build(),
            IllustrationPageProvider.buildInjectEntry().build(),
            CategoryPageProvider.buildInjectEntry().build(),
            ActionButtonPageProvider.buildInjectEntry().build(),
        )
    }

@@ -59,7 +58,7 @@ object HomePageProvider : SettingsPageProvider {
    override fun Page(arguments: Bundle?) {
        HomeScaffold(title = stringResource(R.string.app_name)) {
            for (entry in buildEntry(arguments)) {
                if (entry.name.startsWith(ArgumentPageModel.name)) {
                if (entry.owner.isCreateBy(SettingsPageProviderEnum.ARGUMENT.name)) {
                    entry.UiLayout(ArgumentPageModel.buildArgument(intParam = 0))
                } else {
                    entry.UiLayout()
+24 −7
Original line number Diff line number Diff line
@@ -24,23 +24,38 @@ 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.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

object ArgumentPageProvider : SettingsPageProvider {
    override val name = ArgumentPageModel.name
    // Defines all entry name in this page.
    // Note that entry name would be used in log. DO NOT change it once it is set.
    // One can still change the display name for better readability if necessary.
    private enum class EntryEnum(val displayName: String) {
        STRING_PARAM("string_param"),
        INT_PARAM("int_param"),
    }

    private fun createEntry(owner: SettingsPage, entry: EntryEnum): SettingsEntryBuilder {
        return SettingsEntryBuilder.create(owner, entry.name, entry.displayName)
    }

    override val name = SettingsPageProviderEnum.ARGUMENT.name

    override val parameter = ArgumentPageModel.parameter

    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
        if (!ArgumentPageModel.isValidArgument(arguments)) return emptyList()

        val owner = SettingsPage.create(name, parameter, arguments)
        val owner = createSettingsPage(SettingsPageProviderEnum.ARGUMENT, parameter, arguments)
        val entryList = mutableListOf<SettingsEntry>()
        entryList.add(
            SettingsEntryBuilder.create("string_param", owner)
            createEntry(owner, EntryEnum.STRING_PARAM)
                // Set attributes
                .setIsAllowSearch(true)
                .setSearchDataFn { ArgumentPageModel.genStringParamSearchData() }
                .setUiLayoutFn {
                    // Set ui rendering
                    Preference(ArgumentPageModel.create(it).genStringParamPreferenceModel())
@@ -48,9 +63,10 @@ object ArgumentPageProvider : SettingsPageProvider {
        )

        entryList.add(
            SettingsEntryBuilder.create("int_param", owner)
            createEntry(owner, EntryEnum.INT_PARAM)
                // Set attributes
                .setIsAllowSearch(true)
                .setSearchDataFn { ArgumentPageModel.genIntParamSearchData() }
                .setUiLayoutFn {
                    // Set ui rendering
                    Preference(ArgumentPageModel.create(it).genIntParamPreferenceModel())
@@ -68,11 +84,12 @@ object ArgumentPageProvider : SettingsPageProvider {
        if (!ArgumentPageModel.isValidArgument(arguments)) return null

        return SettingsEntryBuilder.createInject(
            entryName = "${name}_$stringParam",
            owner = SettingsPage.create(name, parameter, arguments)
            owner = createSettingsPage(SettingsPageProviderEnum.ARGUMENT, parameter, arguments),
            displayName = "${name}_$stringParam",
        )
            // Set attributes
            .setIsAllowSearch(false)
            .setSearchDataFn { ArgumentPageModel.genInjectSearchData() }
            .setUiLayoutFn {
                // Set ui rendering
                Preference(ArgumentPageModel.create(it).genInjectPreferenceModel())
@@ -83,7 +100,7 @@ object ArgumentPageProvider : SettingsPageProvider {
    override fun Page(arguments: Bundle?) {
        RegularScaffold(title = ArgumentPageModel.create(arguments).genPageTitle()) {
            for (entry in buildEntry(arguments)) {
                if (entry.name.startsWith(name)) {
                if (entry.owner.isCreateBy(SettingsPageProviderEnum.ARGUMENT.name)) {
                    entry.UiLayout(ArgumentPageModel.buildNextArgument(arguments))
                } else {
                    entry.UiLayout()
+25 −6
Original line number Diff line number Diff line
@@ -23,22 +23,28 @@ import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.android.settingslib.spa.framework.BrowseActivity
import com.android.settingslib.spa.framework.common.EntrySearchData
import com.android.settingslib.spa.framework.common.PageModel
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.framework.util.getIntArg
import com.android.settingslib.spa.framework.util.getStringArg
import com.android.settingslib.spa.framework.util.navLink
import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
import com.android.settingslib.spa.widget.preference.PreferenceModel

private const val TITLE = "Sample page with arguments"
// Defines all the resources for this page.
// In real Settings App, resources data is defined in xml, rather than SPP.
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 val ARGUMENT_PAGE_KEYWORDS = listOf("argument keyword1", "argument keyword2")

class ArgumentPageModel : PageModel() {

    companion object {
        const val name = "Argument"
        val parameter = listOf(
            navArgument(STRING_PARAM_NAME) { type = NavType.StringType },
            navArgument(INT_PARAM_NAME) { type = NavType.IntType },
@@ -62,6 +68,18 @@ class ArgumentPageModel : PageModel() {
            return (stringParam != null && listOf("foo", "bar").contains(stringParam))
        }

        fun genStringParamSearchData(): EntrySearchData {
            return EntrySearchData(title = STRING_PARAM_TITLE)
        }

        fun genIntParamSearchData(): EntrySearchData {
            return EntrySearchData(title = INT_PARAM_TITLE)
        }

        fun genInjectSearchData(): EntrySearchData {
            return EntrySearchData(title = PAGE_TITLE, keyword = ARGUMENT_PAGE_KEYWORDS)
        }

        @Composable
        fun create(arguments: Bundle?): ArgumentPageModel {
            val pageModel: ArgumentPageModel = viewModel(key = arguments.toString())
@@ -70,7 +88,7 @@ class ArgumentPageModel : PageModel() {
        }
    }

    private val title = TITLE
    private val title = PAGE_TITLE
    private var arguments: Bundle? = null
    private var stringParam: String? = null
    private var intParam: Int? = null
@@ -92,7 +110,7 @@ class ArgumentPageModel : PageModel() {
    @Composable
    fun genStringParamPreferenceModel(): PreferenceModel {
        return object : PreferenceModel {
            override val title = "String param value"
            override val title = STRING_PARAM_TITLE
            override val summary = stateOf(stringParam!!)
        }
    }
@@ -100,7 +118,7 @@ class ArgumentPageModel : PageModel() {
    @Composable
    fun genIntParamPreferenceModel(): PreferenceModel {
        return object : PreferenceModel {
            override val title = "Int param value"
            override val title = INT_PARAM_TITLE
            override val summary = stateOf(intParam!!.toString())
        }
    }
@@ -114,7 +132,8 @@ class ArgumentPageModel : PageModel() {
        return object : PreferenceModel {
            override val title = genPageTitle()
            override val summary = stateOf(summaryArray.joinToString(", "))
            override val onClick = navigator(name + parameter.navLink(arguments))
            override val onClick = navigator(
                SettingsPageProviderEnum.ARGUMENT.displayName + parameter.navLink(arguments))
        }
    }
}
Loading