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

Commit 8dade950 authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Clean up ArgumentPageModel

Bug: 370360039
Flag: EXEMPT gallery only
Test: manual - with gallery
Change-Id: I8f90e29dc2b039b9c36fa940733cc56fd5437555
parent 611e4316
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -67,7 +67,6 @@ import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider
enum class SettingsPageProviderEnum(val displayName: String) {
    HOME("home"),
    PREFERENCE("preference"),
    ARGUMENT("argument"),
    ITEM_LIST("itemList"),
    ITEM_OP_PAGE("itemOp"),

+2 −7
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ import com.android.settingslib.spa.gallery.chart.ChartPageProvider
import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider
import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider
import com.android.settingslib.spa.gallery.itemList.OperateListPageProvider
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
@@ -58,7 +57,6 @@ object HomePageProvider : SettingsPageProvider {
        return listOf(
            PreferenceMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            OperateListPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            ArgumentPageProvider.buildInjectEntry("foo")!!.setLink(fromPage = owner).build(),
            SearchScaffoldPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            SuwScaffoldPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            SliderPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
@@ -88,12 +86,9 @@ object HomePageProvider : SettingsPageProvider {
        val entries = remember { buildEntry(arguments) }
        HomeScaffold(title) {
            for (entry in entries) {
                if (entry.owner.isCreateBy(SettingsPageProviderEnum.ARGUMENT.name)) {
                    entry.UiLayout(ArgumentPageModel.buildArgument(intParam = 0))
                } else {
                entry.UiLayout()
            }
            }
            ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = 0)
        }
    }
}
+41 −84
Original line number Diff line number Diff line
@@ -18,112 +18,69 @@ package com.android.settingslib.spa.gallery.page

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.tooling.preview.Preview
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 androidx.navigation.NavType
import androidx.navigation.navArgument
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold

object ArgumentPageProvider : SettingsPageProvider {
    // 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 displayName = SettingsPageProviderEnum.ARGUMENT.displayName
    override val parameter = ArgumentPageModel.parameter
private const val TITLE = "Sample page with arguments"
private const val STRING_PARAM_NAME = "stringParam"
private const val INT_PARAM_NAME = "intParam"

    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
        if (!ArgumentPageModel.isValidArgument(arguments)) return emptyList()
object ArgumentPageProvider : SettingsPageProvider {
    override val name = "Argument"

        val owner = createSettingsPage(arguments)
        val entryList = mutableListOf<SettingsEntry>()
        entryList.add(
            createEntry(owner, EntryEnum.STRING_PARAM)
                // Set attributes
                .setIsSearchDataDynamic(true)
                .setSearchDataFn { ArgumentPageModel.genStringParamSearchData() }
                .setUiLayoutFn {
                    // Set ui rendering
                    Preference(ArgumentPageModel.create(it).genStringParamPreferenceModel())
                }.build()
    override val parameter = listOf(
        navArgument(STRING_PARAM_NAME) { type = NavType.StringType },
        navArgument(INT_PARAM_NAME) { type = NavType.IntType },
    )

        entryList.add(
            createEntry(owner, EntryEnum.INT_PARAM)
                // Set attributes
                .setIsSearchDataDynamic(true)
                .setSearchDataFn { ArgumentPageModel.genIntParamSearchData() }
                .setUiLayoutFn {
                    // Set ui rendering
                    Preference(ArgumentPageModel.create(it).genIntParamPreferenceModel())
                }.build()
    @Composable
    override fun Page(arguments: Bundle?) {
        ArgumentPage(
            stringParam = arguments!!.getString(STRING_PARAM_NAME, "default"),
            intParam = arguments.getInt(INT_PARAM_NAME),
        )

        entryList.add(buildInjectEntry("foo")!!.setLink(fromPage = owner).build())
        entryList.add(buildInjectEntry("bar")!!.setLink(fromPage = owner).build())

        return entryList
    }

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

        return SettingsEntryBuilder.createInject(
            owner = createSettingsPage(arguments),
            label = "${name}_$stringParam",
        )
            .setSearchDataFn { ArgumentPageModel.genInjectSearchData() }
            .setUiLayoutFn {
                // Set ui rendering
                Preference(ArgumentPageModel.create(it).genInjectPreferenceModel())
            }
    @Composable
    fun EntryItem(stringParam: String, intParam: Int) {
        Preference(object : PreferenceModel {
            override val title = TITLE
            override val summary = { "$STRING_PARAM_NAME=$stringParam, $INT_PARAM_NAME=$intParam" }
            override val onClick = navigator("$name/$stringParam/$intParam")
        })
    }

    override fun getTitle(arguments: Bundle?): String {
        return ArgumentPageModel.genPageTitle()
}

@Composable
    override fun Page(arguments: Bundle?) {
        val title = remember { getTitle(arguments) }
        val entries = remember { buildEntry(arguments) }
        val rtArgNext = remember { ArgumentPageModel.buildNextArgument(arguments) }
        RegularScaffold(title) {
            for (entry in entries) {
                if (entry.toPage != null) {
                    entry.UiLayout(rtArgNext)
                } else {
                    entry.UiLayout()
                }
            }
        }
fun ArgumentPage(stringParam: String, intParam: Int) {
    RegularScaffold(title = TITLE) {
        Preference(object : PreferenceModel {
            override val title = "String param value"
            override val summary = { stringParam }
        })

        Preference(object : PreferenceModel {
            override val title = "Int param value"
            override val summary = { intParam.toString() }
        })

        ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = intParam + 1)

        ArgumentPageProvider.EntryItem(stringParam = "bar", intParam = intParam + 1)
    }
}

@Preview(showBackground = true)
@Composable
private fun ArgumentPagePreview() {
    SpaEnvironmentFactory.resetForPreview()
    SettingsTheme {
        ArgumentPageProvider.Page(
            ArgumentPageModel.buildArgument(stringParam = "foo", intParam = 0)
        )
        ArgumentPage(stringParam = "foo", intParam = 0)
    }
}
+0 −138
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.spa.gallery.page

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.android.settingslib.spa.framework.common.EntrySearchData
import com.android.settingslib.spa.framework.common.PageModel
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.compose.navigator
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 TAG = "ArgumentPageModel"

// 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 = "rt_intParam"
private val ARGUMENT_PAGE_KEYWORDS = listOf("argument keyword1", "argument keyword2")

class ArgumentPageModel : PageModel() {

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

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

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

        fun isValidArgument(arguments: Bundle?): Boolean {
            val stringParam = parameter.getStringArg(STRING_PARAM_NAME, arguments)
            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)
        }

        fun genPageTitle(): String {
            return PAGE_TITLE
        }

        @Composable
        fun create(arguments: Bundle?): ArgumentPageModel {
            val pageModel: ArgumentPageModel = viewModel(key = arguments.toString())
            pageModel.initOnce(arguments)
            return pageModel
        }
    }

    private var arguments: Bundle? = null
    private var stringParam: String? = null
    private var intParam: Int? = null

    override fun initialize(arguments: Bundle?) {
        SpaEnvironmentFactory.instance.logger.message(
            TAG, "Initialize with args " + arguments.toString()
        )
        this.arguments = arguments
        stringParam = parameter.getStringArg(STRING_PARAM_NAME, arguments)
        intParam = parameter.getIntArg(INT_PARAM_NAME, arguments)
    }

    @Composable
    fun genStringParamPreferenceModel(): PreferenceModel {
        return object : PreferenceModel {
            override val title = STRING_PARAM_TITLE
            override val summary = { stringParam!! }
        }
    }

    @Composable
    fun genIntParamPreferenceModel(): PreferenceModel {
        return object : PreferenceModel {
            override val title = INT_PARAM_TITLE
            override val summary = { intParam!!.toString() }
        }
    }

    @Composable
    fun genInjectPreferenceModel(): PreferenceModel {
        val summaryArray = listOf(
            "$STRING_PARAM_NAME=" + stringParam!!,
            "$INT_PARAM_NAME=" + intParam!!
        )
        return object : PreferenceModel {
            override val title = PAGE_TITLE
            override val summary = { summaryArray.joinToString(", ") }
            override val onClick = navigator(
                SettingsPageProviderEnum.ARGUMENT.name + parameter.navLink(arguments)
            )
        }
    }
}