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

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

Add icon to Preference widget

Also,
- Fix SwitchPreference's changeable not updatable
- Use MaterialTheme.colorScheme.onSurfaceVariant as tint color for Footer icon

Bug: 235727273
Test: Manual with Gallery App
Change-Id: Ifcd33a8a9975f70ac0aea8c4869d1aa0e3b34ec2
parent 83afbf93
Loading
Loading
Loading
Loading
+13 −3
Original line number Original line Diff line number Diff line
@@ -20,13 +20,16 @@ import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
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.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
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.framework.theme.SettingsTheme
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.ui.SettingsIcon
import kotlinx.coroutines.delay
import kotlinx.coroutines.delay


object PreferencePageProvider : SettingsPageProvider {
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 {
        Preference(object : PreferenceModel {
            override val title = "Click me"
            override val title = "Click me"
            override val summary = derivedStateOf { count.toString() }
            override val summary = derivedStateOf { count.toString() }
            override val onClick: (() -> Unit) = { count++ }
            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) {
        LaunchedEffect(ticks) {
            delay(1000L)
            delay(1000L)
            ticks++
            ticks++
@@ -96,6 +103,9 @@ private fun PreferencePage() {
            override val title = "Disabled"
            override val title = "Disabled"
            override val summary = "Disabled".toState()
            override val summary = "Disabled".toState()
            override val enabled = false.toState()
            override val enabled = false.toState()
            override val icon = @Composable {
              SettingsIcon(imageVector = Icons.Outlined.DisabledByDefault)
            }
        })
        })
    }
    }
}
}
+15 −3
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settingslib.spa.widget.preference
import androidx.compose.foundation.clickable
import androidx.compose.foundation.clickable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.State
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier
import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.framework.compose.stateOf


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


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