diff options
5 files changed, 40 insertions, 13 deletions
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/PreferencePage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/PreferencePage.kt index 3077a1523d32..8a29d35ad9d9 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/PreferencePage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/PreferencePage.kt @@ -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) + } }) } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/Preference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/Preference.kt index 1a80ed20b031..0e6f53abca40 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/Preference.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/Preference.kt @@ -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 @@ -38,6 +39,14 @@ interface PreferenceModel { 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. * * Disabled [Preference] will be displayed in disabled style. @@ -61,13 +70,16 @@ interface PreferenceModel { */ @Composable fun Preference(model: PreferenceModel) { - val modifier = model.onClick?.let { onClick -> - Modifier.clickable(enabled = model.enabled.value) { onClick() } - } ?: Modifier + 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, ) } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt index 0dab0dfe1d6d..b6d6936442e7 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt @@ -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, diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Footer.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Footer.kt index 41fd03b08563..296cf3ba609f 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Footer.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Footer.kt @@ -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) } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Icon.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Icon.kt index cb08cdb20885..4f28e378e510 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Icon.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Icon.kt @@ -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, ) |