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

Commit dccbbc0b authored by Zekan Qian's avatar Zekan Qian
Browse files

Add SettingsEntryRepository with some refactoring

1. Refactor SpaEnvironment, lazy init sppRepo and entryRepo
2. Add SettingsArguments with helper functions for arguments build, which is going to replace arguments in SPP
3. Add rootSettingsPages in SppRepo, which is going to replace rootPageNames (TODO).
4. Add button in HomePage to print pages & entries

Bug: 244122804
Test: manual - build Spa gallery
Change-Id: Iccc66f0cb7156c8aa2d9793e296c2a1a2b0e277a
parent 44622764
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -18,4 +18,4 @@ package com.android.settingslib.spa.gallery

import com.android.settingslib.spa.framework.BrowseActivity

class MainActivity : BrowseActivity(galleryPageProviders)
class MainActivity : BrowseActivity(SpaEnvironment.PageProviderRepository)
+37 −16
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.settingslib.spa.gallery

import com.android.settingslib.spa.framework.common.SettingsEntryRepository
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
import com.android.settingslib.spa.gallery.home.HomePageProvider
import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
@@ -28,7 +30,10 @@ import com.android.settingslib.spa.gallery.preference.SwitchPreferencePageProvid
import com.android.settingslib.spa.gallery.preference.TwoTargetSwitchPreferencePageProvider
import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider

val galleryPageProviders = SettingsPageProviderRepository(
object SpaEnvironment {
    val PageProviderRepository: SettingsPageProviderRepository by
    lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
        SettingsPageProviderRepository(
            allPagesList = listOf(
                HomePageProvider,
                PreferenceMainPageProvider,
@@ -41,7 +46,23 @@ val galleryPageProviders = SettingsPageProviderRepository(
                SettingsPagerPageProvider,
                FooterPageProvider,
            ),
    rootPages = listOf(HomePageProvider.name)
            rootPageData = listOf(
                SettingsPage(HomePageProvider.name),
                SettingsPage(
                    ArgumentPageProvider.name,
                    ArgumentPageProvider.buildArgument("foo")
                ),
                SettingsPage(
                    ArgumentPageProvider.name,
                    ArgumentPageProvider.buildArgument("bar")
                ),
            )
        )
    }

    val EntryRepository: SettingsEntryRepository by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
        SettingsEntryRepository(PageProviderRepository)
    }

    // TODO: add other environment setup here.
}
+14 −0
Original line number Diff line number Diff line
@@ -17,12 +17,15 @@
package com.android.settingslib.spa.gallery.home

import android.os.Bundle
import androidx.compose.material3.Button
import androidx.compose.material3.Text
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.SettingsPageProvider
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.R
import com.android.settingslib.spa.gallery.SpaEnvironment
import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
import com.android.settingslib.spa.gallery.page.FooterPageProvider
import com.android.settingslib.spa.gallery.page.SettingsPagerPageProvider
@@ -50,6 +53,17 @@ private fun HomePage() {
        SpinnerPageProvider.EntryItem()
        SettingsPagerPageProvider.EntryItem()
        FooterPageProvider.EntryItem()

        /**
         * A test button to generate hierarchy.
         * TODO: remove it once the content provider is ready.
         */
        Button(onClick = {
            SpaEnvironment.EntryRepository.printAllPages()
            SpaEnvironment.EntryRepository.printAllEntries()
        }) {
            Text(text = "Generate Entry")
        }
    }
}

+41 −34
Original line number Diff line number Diff line
@@ -19,16 +19,20 @@ package com.android.settingslib.spa.gallery.page
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.android.settingslib.spa.framework.common.PageArguments
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageBuilder
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsTheme
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.framework.util.normalize
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
@@ -40,22 +44,22 @@ private const val INT_PARAM_NAME = "intParam"
object ArgumentPageProvider : SettingsPageProvider {
    override val name = "Argument"

    override val arguments = listOf(
    override val parameter = listOf(
        navArgument(STRING_PARAM_NAME) { type = NavType.StringType },
        navArgument(INT_PARAM_NAME) { type = NavType.IntType },
    )

    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
        val pageArgs = PageArguments(ArgumentPageProvider.arguments, arguments)
        if (!pageArgs.isValid()) return emptyList()
        if (!parameter.isValid(arguments)) return emptyList()

        val owner = SettingsPageBuilder.create(name, pageArgs.normalize()).build()
        val owner = SettingsPage(name, parameter.normalize(arguments))
        val entryList = mutableListOf<SettingsEntry>()
        val stringParamEntry = SettingsEntryBuilder.create("string_param", owner)
        stringParamEntry.setUiLayoutFn {
            Preference(object : PreferenceModel {
                override val title = "String param value"
                override val summary = pageArgs.getStringArg(STRING_PARAM_NAME)!!.toState()
                override val summary =
                    parameter.getStringArg(STRING_PARAM_NAME, arguments)!!.toState()
            })
        }
        entryList.add(stringParamEntry.build())
@@ -64,13 +68,15 @@ object ArgumentPageProvider : SettingsPageProvider {
        intParamEntry.setUiLayoutFn {
            Preference(object : PreferenceModel {
                override val title = "Int param value"
                override val summary = pageArgs.getIntArg(INT_PARAM_NAME)!!.toString().toState()
                override val summary =
                    parameter.getIntArg(INT_PARAM_NAME, arguments)!!.toString().toState()
            })
        }
        entryList.add(intParamEntry.build())

        val entryFoo = buildInjectEntry(pageArgs.buildNextArg("foo"))
        val entryBar = buildInjectEntry(pageArgs.buildNextArg("bar"))
        val intParam = parameter.getIntArg(INT_PARAM_NAME, arguments)
        val entryFoo = buildInjectEntry(buildNextArgument("foo", intParam))
        val entryBar = buildInjectEntry(buildNextArgument("bar", intParam))
        if (entryFoo != null) entryList.add(entryFoo.setLink(fromPage = owner).build())
        if (entryBar != null) entryList.add(entryBar.setLink(fromPage = owner).build())

@@ -78,21 +84,21 @@ object ArgumentPageProvider : SettingsPageProvider {
    }

    private fun buildInjectEntry(arguments: Bundle?): SettingsEntryBuilder? {
        val pageArgs = PageArguments(ArgumentPageProvider.arguments, arguments)
        if (!pageArgs.isValid()) return null
        if (!parameter.isValid(arguments)) return null

        val seBuilder = SettingsEntryBuilder.createLinkTo("injection", name, pageArgs.normalize())
        val seBuilder =
            SettingsEntryBuilder.createInject(name, parameter.normalize(arguments))
        seBuilder.setIsAllowSearch(false)

        seBuilder.setUiLayoutFn {
            val summaryArray = listOf(
                "$STRING_PARAM_NAME=" + pageArgs.getStringArg(STRING_PARAM_NAME)!!,
                "$INT_PARAM_NAME=" + pageArgs.getIntArg(INT_PARAM_NAME)!!
                "$STRING_PARAM_NAME=" + parameter.getStringArg(STRING_PARAM_NAME, arguments)!!,
                "$INT_PARAM_NAME=" + parameter.getIntArg(INT_PARAM_NAME, arguments)!!
            )
            Preference(object : PreferenceModel {
                override val title = TITLE
                override val summary = summaryArray.joinToString(", ").toState()
                override val onClick = navigator(name + pageArgs.navLink())
                override val onClick = navigator(name + parameter.navLink(arguments))
            })
        }

@@ -112,32 +118,33 @@ object ArgumentPageProvider : SettingsPageProvider {
    fun EntryItem(stringParam: String, intParam: Int) {
        buildInjectEntry(buildArgument(stringParam, intParam))?.build()?.uiLayout?.let { it() }
    }

    fun buildArgument(stringParam: String, intParam: Int? = null): Bundle {
        val args = Bundle()
        args.putString(STRING_PARAM_NAME, stringParam)
        if (intParam != null) args.putInt(INT_PARAM_NAME, intParam)
        return args
    }

    private fun buildNextArgument(stringParam: String, intParam: Int? = null): Bundle {
        return if (intParam == null)
            buildArgument(stringParam)
        else
            buildArgument(stringParam, intParam + 1)
    }
}

@Preview(showBackground = true)
@Composable
private fun ArgumentPagePreview() {
    SettingsTheme {
        ArgumentPageProvider.Page(buildArgument(stringParam = "foo", intParam = 0))
        ArgumentPageProvider.Page(
            ArgumentPageProvider.buildArgument(stringParam = "foo", intParam = 0)
        )
    }
}

private fun PageArguments.isValid(): Boolean {
    val stringParam = getStringArg(STRING_PARAM_NAME)
private fun List<NamedNavArgument>.isValid(arguments: Bundle?): Boolean {
    val stringParam = getStringArg(STRING_PARAM_NAME, arguments)
    return (stringParam != null && listOf("foo", "bar").contains(stringParam))
}

private fun PageArguments.buildNextArg(stringParam: String): Bundle {
    val intParam = getIntArg(INT_PARAM_NAME)
    return if (intParam == null)
        buildArgument(stringParam)
    else
        buildArgument(stringParam, intParam + 1)
}

private fun buildArgument(stringParam: String, intParam: Int? = null): Bundle {
    val args = Bundle()
    args.putString(STRING_PARAM_NAME, stringParam)
    if (intParam != null) args.putInt(INT_PARAM_NAME, intParam)
    return args
}
+3 −6
Original line number Diff line number Diff line
@@ -27,10 +27,10 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.android.settingslib.spa.R
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
import com.android.settingslib.spa.framework.compose.localNavController
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.framework.util.navRoute

open class BrowseActivity(
    private val sppRepository: SettingsPageProviderRepository,
@@ -55,8 +55,8 @@ open class BrowseActivity(
            NavHost(navController, sppRepository.getDefaultStartPageName()) {
                for (page in sppRepository.getAllProviders()) {
                    composable(
                        route = page.route,
                        arguments = page.arguments,
                        route = page.name + page.parameter.navRoute(),
                        arguments = page.parameter,
                    ) { navBackStackEntry ->
                        page.Page(navBackStackEntry.arguments)
                    }
@@ -75,9 +75,6 @@ open class BrowseActivity(
        }
    }

    private val SettingsPageProvider.route: String
        get() = name + arguments.joinToString("") { argument -> "/{${argument.name}}" }

    companion object {
        const val KEY_DESTINATION = "spa:SpaActivity:destination"
    }
Loading