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

Commit 9fa6c19e authored by Zekan Qian's avatar Zekan Qian
Browse files

Better support for argument pages.

1. Add arguments in Entry.UiLayout API for runtime parameters
2. Remove EntryItem for all pages in gallery, use entry.UiLayout instead.
3. Link argument page in gallery's home page
4. Disable "open page" / "open entry" when there is runtime parameter in DebugActivity
5. Add debug message to open all pages in SPA

Bug: 244122804
Test: manual - build Spa gallery
Change-Id: Ibd5dfe3f1d154b6464a50cc3d8ccb084d15d3bf4
parent cb867afc
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -52,7 +52,7 @@ object SpaEnvironment {
            ),
            ),
            rootPages = listOf(
            rootPages = listOf(
                SettingsPage.create(HomePageProvider.name)
                SettingsPage.create(HomePageProvider.name)
            ) + ArgumentPageProvider.buildRootPages()
            )
        )
        )
    }
    }


+19 −42
Original line number Original line 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.common.SettingsPageProvider
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.R
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.ArgumentPageProvider
import com.android.settingslib.spa.gallery.page.FooterPageProvider
import com.android.settingslib.spa.gallery.page.FooterPageProvider
import com.android.settingslib.spa.gallery.page.IllustrationPageProvider
import com.android.settingslib.spa.gallery.page.IllustrationPageProvider
@@ -39,52 +40,28 @@ object HomePageProvider : SettingsPageProvider {


    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
        val owner = SettingsPage.create(name)
        val owner = SettingsPage.create(name)
        val entryList = mutableListOf<SettingsEntry>()
        return listOf(
        entryList.add(
            PreferenceMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            PreferenceMainPageProvider.buildInjectEntry()
            ArgumentPageProvider.buildInjectEntry("foo")!!.setLink(fromPage = owner).build(),
                .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
    @Composable
    override fun Page(arguments: Bundle?) {
    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
@Composable
private fun HomeScreenPreview() {
private fun HomeScreenPreview() {
    SettingsTheme {
    SettingsTheme {
        HomePage()
        HomePageProvider.Page(null)
    }
    }
}
}
+13 −23
Original line number Original line Diff line number Diff line
@@ -43,7 +43,7 @@ object ArgumentPageProvider : SettingsPageProvider {
                .setIsAllowSearch(true)
                .setIsAllowSearch(true)
                .setUiLayoutFn {
                .setUiLayoutFn {
                    // Set ui rendering
                    // Set ui rendering
                    Preference(ArgumentPageModel.create(arguments).genStringParamPreferenceModel())
                    Preference(ArgumentPageModel.create(it).genStringParamPreferenceModel())
                }.build()
                }.build()
        )
        )


@@ -53,53 +53,43 @@ object ArgumentPageProvider : SettingsPageProvider {
                .setIsAllowSearch(true)
                .setIsAllowSearch(true)
                .setUiLayoutFn {
                .setUiLayoutFn {
                    // Set ui rendering
                    // Set ui rendering
                    Preference(ArgumentPageModel.create(arguments).genIntParamPreferenceModel())
                    Preference(ArgumentPageModel.create(it).genIntParamPreferenceModel())
                }.build()
                }.build()
        )
        )


        val entryFoo = buildInjectEntry(ArgumentPageModel.buildNextArgument("foo", arguments))
        entryList.add(buildInjectEntry("foo")!!.setLink(fromPage = owner).build())
        val entryBar = buildInjectEntry(ArgumentPageModel.buildNextArgument("bar", arguments))
        entryList.add(buildInjectEntry("bar")!!.setLink(fromPage = owner).build())
        if (entryFoo != null) entryList.add(entryFoo.setLink(fromPage = owner).build())
        if (entryBar != null) entryList.add(entryBar.setLink(fromPage = owner).build())


        return entryList
        return entryList
    }
    }


    private fun buildInjectEntry(arguments: Bundle?): SettingsEntryBuilder? {
    fun buildInjectEntry(stringParam: String): SettingsEntryBuilder? {
        val arguments = ArgumentPageModel.buildArgument(stringParam)
        if (!ArgumentPageModel.isValidArgument(arguments)) return null
        if (!ArgumentPageModel.isValidArgument(arguments)) return null


        return SettingsEntryBuilder.createInject(
        return SettingsEntryBuilder.createInject(
            entryName = ArgumentPageModel.getInjectEntryName(arguments),
            entryName = "${name}_$stringParam",
            owner = SettingsPage.create(name, parameter, arguments)
            owner = SettingsPage.create(name, parameter, arguments)
        )
        )
            // Set attributes
            // Set attributes
            .setIsAllowSearch(false)
            .setIsAllowSearch(false)
            .setUiLayoutFn {
            .setUiLayoutFn {
                // Set ui rendering
                // 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
    @Composable
    override fun Page(arguments: Bundle?) {
    override fun Page(arguments: Bundle?) {
        RegularScaffold(title = ArgumentPageModel.create(arguments).genPageTitle()) {
        RegularScaffold(title = ArgumentPageModel.create(arguments).genPageTitle()) {
            for (entry in buildEntry(arguments)) {
            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 Original line Diff line number Diff line
@@ -44,19 +44,17 @@ class ArgumentPageModel : PageModel() {
            navArgument(INT_PARAM_NAME) { type = NavType.IntType },
            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()
            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)
            if (intParam != null) args.putInt(INT_PARAM_NAME, intParam)
            return args
            return args
        }
        }


        fun buildNextArgument(newStringParam: String, arguments: Bundle? = null): Bundle {
        fun buildNextArgument(arguments: Bundle? = null): Bundle {
            val intParam = parameter.getIntArg(INT_PARAM_NAME, arguments)
            val intParam = parameter.getIntArg(INT_PARAM_NAME, arguments)
            return if (intParam == null)
            val nextIntParam = if (intParam != null) intParam + 1 else null
                buildArgument(newStringParam)
            return buildArgument(intParam = nextIntParam)
            else
                buildArgument(newStringParam, intParam + 1)
        }
        }


        fun isValidArgument(arguments: Bundle?): Boolean {
        fun isValidArgument(arguments: Bundle?): Boolean {
@@ -64,10 +62,6 @@ class ArgumentPageModel : PageModel() {
            return (stringParam != null && listOf("foo", "bar").contains(stringParam))
            return (stringParam != null && listOf("foo", "bar").contains(stringParam))
        }
        }


        fun getInjectEntryName(arguments: Bundle?): String {
            return "${name}_${parameter.getStringArg(STRING_PARAM_NAME, arguments)}"
        }

        @Composable
        @Composable
        fun create(arguments: Bundle?): ArgumentPageModel {
        fun create(arguments: Bundle?): ArgumentPageModel {
            val pageModel: ArgumentPageModel = viewModel(key = arguments.toString())
            val pageModel: ArgumentPageModel = viewModel(key = arguments.toString())
+6 −16
Original line number Original line Diff line number Diff line
@@ -69,29 +69,19 @@ object FooterPageProvider : SettingsPageProvider {


    @Composable
    @Composable
    override fun Page(arguments: Bundle?) {
    override fun Page(arguments: Bundle?) {
        FooterPage()
    }

    @Composable
    fun EntryItem() {
        buildInjectEntry().build().uiLayout.let { it() }
    }
}

@Composable
private fun FooterPage() {
        RegularScaffold(title = TITLE) {
        RegularScaffold(title = TITLE) {
        for (entry in FooterPageProvider.buildEntry(arguments = null)) {
            for (entry in buildEntry(arguments)) {
            entry.uiLayout()
                entry.UiLayout()
            }
            }
            Footer(footerText = "Footer text always at the end of page.")
            Footer(footerText = "Footer text always at the end of page.")
        }
        }
    }
    }
}


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