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

Commit 4a98a1ea authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge "Add icon to Preference widget"

parents 43a2276c de6c7794
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -20,13 +20,16 @@ import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.DisabledByDefault
import androidx.compose.material.icons.outlined.TouchApp
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
@@ -36,6 +39,7 @@ import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.ui.SettingsIcon
import kotlinx.coroutines.delay

object PreferencePageProvider : SettingsPageProvider {
@@ -75,14 +79,17 @@ private fun PreferencePage() {
            }
        })

        var count by remember { mutableStateOf(0) }
        var count by rememberSaveable { mutableStateOf(0) }
        Preference(object : PreferenceModel {
            override val title = "Click me"
            override val summary = derivedStateOf { count.toString() }
            override val onClick: (() -> Unit) = { count++ }
            override val icon = @Composable {
                SettingsIcon(imageVector = Icons.Outlined.TouchApp)
            }
        })

        var ticks by remember { mutableStateOf(0) }
        var ticks by rememberSaveable { mutableStateOf(0) }
        LaunchedEffect(ticks) {
            delay(1000L)
            ticks++
@@ -96,6 +103,9 @@ private fun PreferencePage() {
            override val title = "Disabled"
            override val summary = "Disabled".toState()
            override val enabled = false.toState()
            override val icon = @Composable {
              SettingsIcon(imageVector = Icons.Outlined.DisabledByDefault)
            }
        })
    }
}
+15 −3
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settingslib.spa.widget.preference
import androidx.compose.foundation.clickable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import com.android.settingslib.spa.framework.compose.stateOf

@@ -37,6 +38,14 @@ interface PreferenceModel {
    val summary: State<String>
        get() = stateOf("")

    /**
     * The icon of this [Preference].
     *
     * Default is `null` which means no icon.
     */
    val icon: (@Composable () -> Unit)?
        get() = null

    /**
     * Indicates whether this [Preference] is enabled.
     *
@@ -61,13 +70,16 @@ interface PreferenceModel {
 */
@Composable
fun Preference(model: PreferenceModel) {
    val modifier = model.onClick?.let { onClick ->
        Modifier.clickable(enabled = model.enabled.value) { onClick() }
    val modifier = remember(model.enabled.value, model.onClick) {
      model.onClick?.let { onClick ->
        Modifier.clickable(enabled = model.enabled.value, onClick = onClick)
      } ?: Modifier
    }
    BasePreference(
        title = model.title,
        summary = model.summary,
        modifier = modifier,
        icon = model.icon,
        enabled = model.enabled,
    )
}
+1 −1
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ internal fun InternalSwitchPreference(
) {
    val checkedValue = checked.value
    val indication = LocalIndication.current
    val modifier = remember(checkedValue) {
    val modifier = remember(checkedValue, changeable.value) {
        if (checkedValue != null && onCheckedChange != null) {
            Modifier.toggleable(
                value = checkedValue,
+9 −1
Original line number Diff line number Diff line
@@ -20,8 +20,11 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Info
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
@@ -32,7 +35,12 @@ import com.android.settingslib.spa.framework.theme.SettingsTheme
fun Footer(footerText: String) {
    if (footerText.isEmpty()) return
    Column(Modifier.padding(SettingsDimension.itemPadding)) {
        SettingsIcon(imageVector = Icons.Outlined.Info, contentDescription = null)
        Icon(
            imageVector = Icons.Outlined.Info,
            contentDescription = null,
            modifier = Modifier.size(SettingsDimension.itemIconSize),
            tint = MaterialTheme.colorScheme.onSurfaceVariant,
        )
        Spacer(modifier = Modifier.height(SettingsDimension.itemPaddingVertical))
        SettingsBody(footerText)
    }
+2 −5
Original line number Diff line number Diff line
@@ -25,13 +25,10 @@ import androidx.compose.ui.graphics.vector.ImageVector
import com.android.settingslib.spa.framework.theme.SettingsDimension

@Composable
fun SettingsIcon(
    imageVector: ImageVector,
    contentDescription: String?,
) {
fun SettingsIcon(imageVector: ImageVector) {
    Icon(
        imageVector = imageVector,
        contentDescription = contentDescription,
        contentDescription = null,
        modifier = Modifier.size(SettingsDimension.itemIconSize),
        tint = MaterialTheme.colorScheme.onSurface,
    )