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

Commit e67edacd authored by Chaohui Wang's avatar Chaohui Wang
Browse files

[Spa] New ListPreference

When disabled, the radio item in opened dialog will also disabled.

Bug: 304952402
Test: manual with Gallery
Test: unit test
Change-Id: I9682dfac314ea02c345bf79103d77d946e996fd4
parent 7c10e57c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.settingslib.spa.gallery.page.LoadingBarPageProvider
import com.android.settingslib.spa.gallery.page.ProgressBarPageProvider
import com.android.settingslib.spa.gallery.page.SettingsPagerPageProvider
import com.android.settingslib.spa.gallery.page.SliderPageProvider
import com.android.settingslib.spa.gallery.preference.ListPreferencePageProvider
import com.android.settingslib.spa.gallery.preference.MainSwitchPreferencePageProvider
import com.android.settingslib.spa.gallery.preference.PreferenceMainPageProvider
import com.android.settingslib.spa.gallery.preference.PreferencePageProvider
@@ -74,6 +75,7 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) {
                PreferencePageProvider,
                SwitchPreferencePageProvider,
                MainSwitchPreferencePageProvider,
                ListPreferencePageProvider,
                TwoTargetSwitchPreferencePageProvider,
                ArgumentPageProvider,
                SliderPageProvider,
+120 −0
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.preference

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
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.theme.SettingsTheme
import com.android.settingslib.spa.widget.preference.ListPreference
import com.android.settingslib.spa.widget.preference.ListPreferenceModel
import com.android.settingslib.spa.widget.preference.ListPreferenceOption
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.flow

private const val TITLE = "Sample ListPreference"

object ListPreferencePageProvider : SettingsPageProvider {
    override val name = "ListPreference"
    private val owner = createSettingsPage()

    override fun buildEntry(arguments: Bundle?) = listOf(
        SettingsEntryBuilder.create("ListPreference", owner)
            .setUiLayoutFn {
                SampleListPreference()
            }.build(),
        SettingsEntryBuilder.create("ListPreference not changeable", owner)
            .setUiLayoutFn {
                SampleNotChangeableListPreference()
            }.build(),
    )

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

    override fun getTitle(arguments: Bundle?) = TITLE
}

@Composable
private fun SampleListPreference() {
    val selectedId = rememberSaveable { mutableIntStateOf(1) }
    ListPreference(remember {
        object : ListPreferenceModel {
            override val title = "Preferred network type"
            override val options = listOf(
                ListPreferenceOption(id = 1, text = "5G (recommended)"),
                ListPreferenceOption(id = 2, text = "LTE"),
                ListPreferenceOption(id = 3, text = "3G"),
            )
            override val selectedId = selectedId
            override val onIdSelected: (id: Int) -> Unit = { selectedId.intValue = it }
        }
    })
}

@Composable
private fun SampleNotChangeableListPreference() {
    val selectedId = rememberSaveable { mutableIntStateOf(1) }
    val enableFlow = flow {
        var enabled = true
        while (true) {
            delay(3.seconds)
            enabled = !enabled
            emit(enabled)
        }
    }
    val enabled = enableFlow.collectAsStateWithLifecycle(initialValue = true)
    ListPreference(remember {
        object : ListPreferenceModel {
            override val title = "Preferred network type"
            override val enabled = enabled
            override val options = listOf(
                ListPreferenceOption(id = 1, text = "5G (recommended)"),
                ListPreferenceOption(id = 2, text = "LTE"),
                ListPreferenceOption(id = 3, text = "3G"),
            )
            override val selectedId = selectedId
            override val onIdSelected: (id: Int) -> Unit = { selectedId.intValue = it }
        }
    })
}

@Preview
@Composable
private fun ListPreferencePagePreview() {
    SettingsTheme {
        ListPreferencePageProvider.Page(null)
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ object PreferenceMainPageProvider : SettingsPageProvider {
            PreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            SwitchPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            MainSwitchPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            ListPreferencePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            TwoTargetSwitchPreferencePageProvider.buildInjectEntry()
                .setLink(fromPage = owner).build(),
        )
+11 −1
Original line number Diff line number Diff line
@@ -40,8 +40,18 @@ object SettingsDimension {
    /** The size when app icon is displayed in App info page. */
    val appIconInfoSize = 48.dp

    /** The vertical padding for buttons. */
    val buttonPaddingVertical = 12.dp

    /** The [PaddingValues] for buttons. */
    val buttonPadding = PaddingValues(horizontal = itemPaddingEnd, vertical = 12.dp)
    val buttonPadding = PaddingValues(horizontal = itemPaddingEnd, vertical = buttonPaddingVertical)

    /** The horizontal padding for dialog items. */
    val dialogItemPaddingHorizontal = itemPaddingStart

    /** The [PaddingValues] for dialog items. */
    val dialogItemPadding =
        PaddingValues(horizontal = dialogItemPaddingHorizontal, vertical = buttonPaddingVertical)

    /** The sizes info of illustration widget. */
    val illustrationMaxWidth = 412.dp
+5 −0
Original line number Diff line number Diff line
@@ -16,10 +16,15 @@

package com.android.settingslib.spa.framework.theme

import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha

object SettingsOpacity {
    const val Full = 1f
    const val Disabled = 0.38f
    const val Divider = 0.2f
    const val SurfaceTone = 0.14f
    const val Hint = 0.9f

    fun Modifier.alphaForEnabled(enabled: Boolean) = alpha(if (enabled) Full else Disabled)
}
Loading