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

Commit 61a434e0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Clean up itemList" into main

parents 99545546 ca150b60
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -30,9 +30,6 @@ import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsDropdownBoxPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsDropdownCheckBoxProvider
import com.android.settingslib.spa.gallery.home.HomePageProvider
import com.android.settingslib.spa.gallery.itemList.ItemListPageProvider
import com.android.settingslib.spa.gallery.itemList.ItemOperatePageProvider
import com.android.settingslib.spa.gallery.itemList.OperateListPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsOutlinedTextFieldPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsTextFieldPasswordPageProvider
import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
@@ -67,8 +64,6 @@ import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider
enum class SettingsPageProviderEnum(val displayName: String) {
    HOME("home"),
    PREFERENCE("preference"),
    ITEM_LIST("itemList"),
    ITEM_OP_PAGE("itemOp"),

    // Add your SPPs
}
@@ -100,9 +95,6 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) {
                ChartPageProvider,
                DialogMainPageProvider,
                NavDialogProvider,
                ItemListPageProvider,
                ItemOperatePageProvider,
                OperateListPageProvider,
                EditorMainPageProvider,
                SettingsOutlinedTextFieldPageProvider,
                SettingsDropdownBoxPageProvider,
+0 −2
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
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.ArgumentPageProvider
import com.android.settingslib.spa.gallery.page.FooterPageProvider
import com.android.settingslib.spa.gallery.page.IllustrationPageProvider
@@ -56,7 +55,6 @@ object HomePageProvider : SettingsPageProvider {
    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
        return listOf(
            PreferenceMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            OperateListPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            SearchScaffoldPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            SuwScaffoldPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            SliderPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
+0 −99
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.itemList

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.core.os.bundleOf
import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.android.settingslib.spa.framework.common.EntrySearchData
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
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.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold

private const val OPERATOR_PARAM_NAME = "opParam"

object ItemListPageProvider : SettingsPageProvider {
    override val name = SettingsPageProviderEnum.ITEM_LIST.name
    override val displayName = SettingsPageProviderEnum.ITEM_LIST.displayName
    override val parameter = listOf(
        navArgument(OPERATOR_PARAM_NAME) { type = NavType.StringType },
    )

    override fun getTitle(arguments: Bundle?): String {
        val operation = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments) ?: "NULL"
        return "Operation: $operation"
    }

    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
        if (!ItemOperatePageProvider.isValidArgs(arguments)) return emptyList()
        val operation = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments)!!
        val owner = createSettingsPage(arguments)
        return listOf(
            ItemOperatePageProvider.buildInjectEntry(operation)!!.setLink(fromPage = owner).build(),
        )
    }

    fun buildInjectEntry(opParam: String): SettingsEntryBuilder? {
        val arguments = bundleOf(OPERATOR_PARAM_NAME to opParam)
        if (!ItemOperatePageProvider.isValidArgs(arguments)) return null

        return SettingsEntryBuilder.createInject(
            owner = createSettingsPage(arguments),
            label = "ItemList_$opParam",
        ).setUiLayoutFn {
            Preference(
                object : PreferenceModel {
                    override val title = opParam
                    override val onClick = navigator(
                        SettingsPageProviderEnum.ITEM_LIST.name + parameter.navLink(it)
                    )
                }
            )
        }.setSearchDataFn {
            EntrySearchData(title = "Operation: $opParam")
        }
    }

    @Composable
    override fun Page(arguments: Bundle?) {
        val title = remember { getTitle(arguments) }
        val entries = remember { buildEntry(arguments) }
        val itemList = remember {
            // Add logic to get item List during runtime.
            listOf("itemFoo", "itemBar", "itemToy")
        }
        RegularScaffold(title) {
            for (item in itemList) {
                val rtArgs = ItemOperatePageProvider.genRuntimeArguments(item)
                for (entry in entries) {
                    entry.UiLayout(rtArgs)
                }
            }
        }
    }
}
+0 −127
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.itemList

import android.os.Bundle
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.core.os.bundleOf
import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
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.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel

private const val OPERATOR_PARAM_NAME = "opParam"
private const val ITEM_NAME_PARAM_NAME = "rt_nameParam"
private val ALLOWED_OPERATOR_LIST = listOf("opDnD", "opPiP", "opInstall", "opConnect")

object ItemOperatePageProvider : SettingsPageProvider {
    override val name = SettingsPageProviderEnum.ITEM_OP_PAGE.name
    override val displayName = SettingsPageProviderEnum.ITEM_OP_PAGE.displayName
    override val parameter = listOf(
        navArgument(OPERATOR_PARAM_NAME) { type = NavType.StringType },
        navArgument(ITEM_NAME_PARAM_NAME) { type = NavType.StringType },
    )

    override fun getTitle(arguments: Bundle?): String {
        // Operation name is not a runtime parameter, which should always available
        val operation = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments) ?: "opInValid"
        // Item name is a runtime parameter, which could be missing
        val itemName = parameter.getStringArg(ITEM_NAME_PARAM_NAME, arguments) ?: "[unset]"
        return "$operation on $itemName"
    }

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

        val owner = createSettingsPage(arguments)
        val entryList = mutableListOf<SettingsEntry>()
        entryList.add(
            SettingsEntryBuilder.create("ItemName", owner)
                .setUiLayoutFn {
                    // Item name is a runtime parameter, which needs to be read inside UiLayoutFn
                    val itemName = parameter.getStringArg(ITEM_NAME_PARAM_NAME, it) ?: "NULL"
                    Preference(
                        object : PreferenceModel {
                            override val title = "Item $itemName"
                        }
                    )
                }.build()
        )

        // Operation name is not a runtime parameter, which can be read outside.
        val opName = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments)!!
        entryList.add(
            SettingsEntryBuilder.create("ItemOp", owner)
                .setUiLayoutFn {
                    var checked by rememberSaveable { mutableStateOf(false) }
                    SwitchPreference(remember {
                        object : SwitchPreferenceModel {
                            override val title = "Item operation: $opName"
                            override val checked = { checked }
                            override val onCheckedChange =
                                { newChecked: Boolean -> checked = newChecked }
                        }
                    })
                }.build(),
        )
        return entryList
    }

    fun buildInjectEntry(opParam: String): SettingsEntryBuilder? {
        val arguments = bundleOf(OPERATOR_PARAM_NAME to opParam)
        if (!isValidArgs(arguments)) return null

        return SettingsEntryBuilder.createInject(
            owner = createSettingsPage(arguments),
            label = "ItemOp_$opParam",
        ).setUiLayoutFn {
            // Item name is a runtime parameter, which needs to be read inside UiLayoutFn
            val itemName = parameter.getStringArg(ITEM_NAME_PARAM_NAME, it) ?: "NULL"
            Preference(
                object : PreferenceModel {
                    override val title = "item: $itemName"
                    override val onClick = navigator(
                        SettingsPageProviderEnum.ITEM_OP_PAGE.name + parameter.navLink(it)
                    )
                }
            )
        }
    }

    fun isValidArgs(arguments: Bundle?): Boolean {
        val opParam = parameter.getStringArg(OPERATOR_PARAM_NAME, arguments)
        return (opParam != null && ALLOWED_OPERATOR_LIST.contains(opParam))
    }

    fun genRuntimeArguments(itemName: String): Bundle {
        return bundleOf(ITEM_NAME_PARAM_NAME to itemName)
    }
}
+0 −56
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.itemList

import android.os.Bundle
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel

private const val TITLE = "Operate List Main"

object OperateListPageProvider : SettingsPageProvider {
    override val name = "OpList"
    private val owner = createSettingsPage()

    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
        return listOf(
            ItemListPageProvider.buildInjectEntry("opPiP")!!.setLink(fromPage = owner).build(),
            ItemListPageProvider.buildInjectEntry("opInstall")!!.setLink(fromPage = owner).build(),
            ItemListPageProvider.buildInjectEntry("opDnD")!!.setLink(fromPage = owner).build(),
            ItemListPageProvider.buildInjectEntry("opConnect")!!.setLink(fromPage = owner).build(),
        )
    }

    override fun getTitle(arguments: Bundle?): String {
        return TITLE
    }

    fun buildInjectEntry(): SettingsEntryBuilder {
        return SettingsEntryBuilder.createInject(owner = owner)
            .setUiLayoutFn {
                Preference(object : PreferenceModel {
                    override val title = TITLE
                    override val onClick = navigator(name)
                })
            }
    }
}