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

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

Merge "Better support for argument pages."

parents ea34fde7 9fa6c19e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ object SpaEnvironment {
            ),
            rootPages = listOf(
                SettingsPage.create(HomePageProvider.name)
            ) + ArgumentPageProvider.buildRootPages()
            )
        )
    }

+19 −42
Original line number Diff line number Diff line
@@ -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<SettingsEntry> {
        val owner = SettingsPage.create(name)
        val entryList = mutableListOf<SettingsEntry>()
        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()
        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()
                }
            }
        }

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

@@ -92,6 +69,6 @@ private fun HomePage() {
@Composable
private fun HomeScreenPreview() {
    SettingsTheme {
        HomePage()
        HomePageProvider.Page(null)
    }
}
+13 −23
Original line number Diff line number Diff line
@@ -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,53 +53,43 @@ 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<SettingsPage> {
        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() }
    }
}

+5 −11
Original line number Diff line number Diff line
@@ -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())
+6 −16
Original line number Diff line number Diff line
@@ -69,29 +69,19 @@ 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()
            for (entry in buildEntry(arguments)) {
                entry.UiLayout()
            }
            Footer(footerText = "Footer text always at the end of page.")
        }
    }
}

@Preview(showBackground = true)
@Composable
private fun FooterPagePreview() {
    SettingsTheme {
        FooterPage()
        FooterPageProvider.Page(null)
    }
}
Loading