diff --git a/packages/SettingsLib/Spa/build.gradle.kts b/packages/SettingsLib/Spa/build.gradle.kts index 0b7a568dd2f246b8705aace3a7a3d584641dc197..1c8ddcb431d2e30550cb0e3ff0acd3e6d19357a0 100644 --- a/packages/SettingsLib/Spa/build.gradle.kts +++ b/packages/SettingsLib/Spa/build.gradle.kts @@ -26,7 +26,7 @@ plugins { } allprojects { - extra["jetpackComposeVersion"] = "1.6.0-alpha07" + extra["jetpackComposeVersion"] = "1.6.0-alpha08" } subprojects { diff --git a/packages/SettingsLib/Spa/settings.gradle.kts b/packages/SettingsLib/Spa/settings.gradle.kts index aac0fe97f793d538feea9ac94996ac81fb42e58a..b8dfae39dfdc2d6287500971e025751b112c6553 100644 --- a/packages/SettingsLib/Spa/settings.gradle.kts +++ b/packages/SettingsLib/Spa/settings.gradle.kts @@ -26,7 +26,14 @@ dependencyResolutionManagement { rulesMode.set(RulesMode.FAIL_ON_PROJECT_RULES) repositories { - google() + google { + content { + includeGroupAndSubgroups("com.google") + includeGroupAndSubgroups("com.android") + includeGroupAndSubgroups("android") + includeGroupAndSubgroups("androidx") + } + } mavenCentral() maven { url = uri("https://jitpack.io") diff --git a/packages/SettingsLib/Spa/spa/build.gradle.kts b/packages/SettingsLib/Spa/spa/build.gradle.kts index b73bbd8b80e1e7738a982f203a196c1718395308..189c2dd4af1f44307fedb0e44fd05afc78b00789 100644 --- a/packages/SettingsLib/Spa/spa/build.gradle.kts +++ b/packages/SettingsLib/Spa/spa/build.gradle.kts @@ -57,7 +57,7 @@ dependencies { api("androidx.slice:slice-builders:1.1.0-alpha02") api("androidx.slice:slice-core:1.1.0-alpha02") api("androidx.slice:slice-view:1.1.0-alpha02") - api("androidx.compose.material3:material3:1.2.0-alpha09") + api("androidx.compose.material3:material3:1.2.0-alpha10") api("androidx.compose.material:material-icons-extended:$jetpackComposeVersion") api("androidx.compose.runtime:runtime-livedata:$jetpackComposeVersion") api("androidx.compose.ui:ui-tooling-preview:$jetpackComposeVersion") diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt index 4d42fbae24fd82b4714a33c831a7b7d72a15e105..56d75d8bee4b661022a84b5559c9745daa066781 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BaseLayout.kt @@ -26,13 +26,11 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsOpacity.alphaForEnabled import com.android.settingslib.spa.framework.theme.SettingsTheme @@ -44,7 +42,7 @@ internal fun BaseLayout( subTitle: @Composable () -> Unit, modifier: Modifier = Modifier, icon: (@Composable () -> Unit)? = null, - enabled: State<Boolean> = true.toState(), + enabled: () -> Boolean = { true }, paddingStart: Dp = SettingsDimension.itemPaddingStart, paddingEnd: Dp = SettingsDimension.itemPaddingEnd, paddingVertical: Dp = SettingsDimension.itemPaddingVertical, @@ -56,7 +54,7 @@ internal fun BaseLayout( .padding(end = paddingEnd), verticalAlignment = Alignment.CenterVertically, ) { - val alphaModifier = Modifier.alphaForEnabled(enabled.value) + val alphaModifier = Modifier.alphaForEnabled(enabled()) BaseIcon(icon, alphaModifier, paddingStart) Titles( title = title, diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BasePreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BasePreference.kt index 081e6680c48939991426b5ef365a17cccbdea556..194ed81df0eed7d3c99eebcb18a00aaf955a2e9e 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BasePreference.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/BasePreference.kt @@ -20,11 +20,9 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.BatteryChargingFull import androidx.compose.material3.Icon import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.widget.ui.SettingsBody @@ -32,11 +30,11 @@ import com.android.settingslib.spa.widget.ui.SettingsBody @Composable internal fun BasePreference( title: String, - summary: State<String>, + summary: () -> String, modifier: Modifier = Modifier, singleLineSummary: Boolean = false, icon: @Composable (() -> Unit)? = null, - enabled: State<Boolean> = true.toState(), + enabled: () -> Boolean = { true }, paddingStart: Dp = SettingsDimension.itemPaddingStart, paddingEnd: Dp = SettingsDimension.itemPaddingEnd, paddingVertical: Dp = SettingsDimension.itemPaddingVertical, @@ -46,7 +44,7 @@ internal fun BasePreference( title = title, subTitle = { SettingsBody( - body = summary.value, + body = summary(), maxLines = if (singleLineSummary) 1 else Int.MAX_VALUE, ) }, @@ -66,7 +64,7 @@ private fun BasePreferencePreview() { SettingsTheme { BasePreference( title = "Screen Saver", - summary = "Clock".toState(), + summary = { "Clock" }, ) } } @@ -77,7 +75,7 @@ private fun BasePreferenceIconPreview() { SettingsTheme { BasePreference( title = "Screen Saver", - summary = "Clock".toState(), + summary = { "Clock" }, icon = { Icon(imageVector = Icons.Outlined.BatteryChargingFull, contentDescription = null) }, diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ListPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ListPreference.kt index 19779f67ca4890d5454b4da14a5db2d681032df4..74f9c9d0f9e27fb4458881ec142ef36efe6eba2b 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ListPreference.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/ListPreference.kt @@ -89,7 +89,7 @@ fun ListPreference(model: ListPreferenceModel) { ) { Column(modifier = Modifier.selectableGroup()) { for (option in model.options) { - Radio(option, model.selectedId, model.enabled) { + Radio(option, model.selectedId.intValue, model.enabled.value) { dialogOpened = false model.onIdSelected(it) } @@ -113,12 +113,11 @@ fun ListPreference(model: ListPreferenceModel) { @Composable private fun Radio( option: ListPreferenceOption, - selectedId: IntState, - enabledState: State<Boolean>, + selectedId: Int, + enabled: Boolean, onIdSelected: (id: Int) -> Unit, ) { - val selected = option.id == selectedId.intValue - val enabled = enabledState.value + val selected = option.id == selectedId Row( modifier = Modifier .fillMaxWidth() diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/MainSwitchPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/MainSwitchPreference.kt index 0c16c8bc7229068d6c507de58e37ad28aedb5d0a..35c34d4e8de961fdea5307d8671c3b044c74193d 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/MainSwitchPreference.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/MainSwitchPreference.kt @@ -43,8 +43,8 @@ fun MainSwitchPreference(model: SwitchPreferenceModel) { ) { InternalSwitchPreference( title = model.title, - checked = model.checked, - changeable = model.changeable, + checked = model.checked.value, + changeable = model.changeable.value, onCheckedChange = model.onCheckedChange, paddingStart = 20.dp, paddingEnd = 20.dp, 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 b6099e99c529897d2276a7df3b8c99560deb1caa..7ecbec7ce0b434ffa1eabe45f7bc1e1c9527e727 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 @@ -119,11 +119,11 @@ fun Preference( EntryHighlight { BasePreference( title = model.title, - summary = model.summary, + summary = { model.summary.value }, singleLineSummary = singleLineSummary, modifier = modifier, icon = model.icon, - enabled = model.enabled, + enabled = { model.enabled.value }, ) } } 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 ba8c03d9438d6fc1325bbd09ab361b0af2557391..f14f68ce74c0b0b7e8517589c41fa24f98227a91 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 @@ -32,7 +32,6 @@ import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import com.android.settingslib.spa.framework.compose.stateOf -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.framework.util.EntryHighlight @@ -96,10 +95,10 @@ fun SwitchPreference(model: SwitchPreferenceModel) { EntryHighlight { InternalSwitchPreference( title = model.title, - summary = model.summary, + summary = { model.summary.value }, icon = model.icon, - checked = model.checked, - changeable = model.changeable, + checked = model.checked.value, + changeable = model.changeable.value, onCheckedChange = model.onCheckedChange, ) } @@ -108,25 +107,25 @@ fun SwitchPreference(model: SwitchPreferenceModel) { @Composable internal fun InternalSwitchPreference( title: String, - summary: State<String> = "".toState(), + summary: () -> String = { "" }, icon: @Composable (() -> Unit)? = null, - checked: State<Boolean?>, - changeable: State<Boolean> = true.toState(), + checked: Boolean?, + changeable: Boolean = true, paddingStart: Dp = SettingsDimension.itemPaddingStart, paddingEnd: Dp = SettingsDimension.itemPaddingEnd, paddingVertical: Dp = SettingsDimension.itemPaddingVertical, onCheckedChange: ((newChecked: Boolean) -> Unit)?, ) { - val checkedValue = checked.value val indication = LocalIndication.current val onChangeWithLog = wrapOnSwitchWithLog(onCheckedChange) - val modifier = remember(checkedValue, changeable.value) { - if (checkedValue != null && onChangeWithLog != null) { + val interactionSource = remember { MutableInteractionSource() } + val modifier = remember(checked, changeable) { + if (checked != null && onChangeWithLog != null) { Modifier.toggleable( - value = checkedValue, - interactionSource = MutableInteractionSource(), + value = checked, + interactionSource = interactionSource, indication = indication, - enabled = changeable.value, + enabled = changeable, role = Role.Switch, onValueChange = onChangeWithLog, ) @@ -136,7 +135,7 @@ internal fun InternalSwitchPreference( title = title, summary = summary, modifier = modifier, - enabled = changeable, + enabled = { changeable }, paddingStart = paddingStart, paddingEnd = paddingEnd, paddingVertical = paddingVertical, @@ -145,10 +144,11 @@ internal fun InternalSwitchPreference( Spacer(Modifier.width(SettingsDimension.itemPaddingEnd)) SettingsSwitch( checked = checked, - changeable = changeable, + changeable = { changeable }, // The onCheckedChange is handled on the whole SwitchPreference. // DO NOT set it on SettingsSwitch. onCheckedChange = null, + interactionSource = interactionSource, ) } } @@ -160,19 +160,19 @@ private fun SwitchPreferencePreview() { Column { InternalSwitchPreference( title = "Use Dark theme", - checked = true.toState(), + checked = true, onCheckedChange = {}, ) InternalSwitchPreference( title = "Use Dark theme", - summary = "Summary".toState(), - checked = false.toState(), + summary = { "Summary" }, + checked = false, onCheckedChange = {}, ) InternalSwitchPreference( title = "Use Dark theme", - summary = "Summary".toState(), - checked = true.toState(), + summary = { "Summary" }, + checked = true, onCheckedChange = {}, icon = @Composable { SettingsIcon(imageVector = Icons.Outlined.AirplanemodeActive) diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt index 63de2c821154c92204e40e719c6afc741b9a0e88..9a6580c852a67a14a46de2665bd3618f789a344b 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt @@ -34,8 +34,8 @@ fun TwoTargetSwitchPreference( icon = icon, ) { SettingsSwitch( - checked = model.checked, - changeable = model.changeable, + checked = model.checked.value, + changeable = { model.changeable.value }, onCheckedChange = model.onCheckedChange, ) } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/ProgressBar.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/ProgressBar.kt index 0f5e935d6edca0442301d569c795f319930995dc..2988be84b476e776188ca8f630986bd1d8a7d473 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/ProgressBar.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/ProgressBar.kt @@ -95,8 +95,8 @@ private fun DrawScope.drawLinearBarTrack( fun CircularProgressBar(progress: Float, radius: Float = 40f) { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { CircularProgressIndicator( - progress = progress, - modifier = Modifier.size(radius.dp, radius.dp) + progress = { progress }, + modifier = Modifier.size(radius.dp, radius.dp), ) } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt index 9831b918894b53d21f4c87b4743b21664fc7f3d5..a0da2418acbcc9ed3952d2b6d024dfa60c27a8dd 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt @@ -16,29 +16,32 @@ package com.android.settingslib.spa.widget.ui +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.material3.Switch import androidx.compose.runtime.Composable -import androidx.compose.runtime.State +import androidx.compose.runtime.remember import com.android.settingslib.spa.framework.util.wrapOnSwitchWithLog @Composable -fun SettingsSwitch( - checked: State<Boolean?>, - changeable: State<Boolean>, +internal fun SettingsSwitch( + checked: Boolean?, + changeable: () -> Boolean, onCheckedChange: ((newChecked: Boolean) -> Unit)? = null, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, ) { - val checkedValue = checked.value - if (checkedValue != null) { + if (checked != null) { Switch( - checked = checkedValue, + checked = checked, onCheckedChange = wrapOnSwitchWithLog(onCheckedChange), - enabled = changeable.value, + enabled = changeable(), + interactionSource = interactionSource, ) } else { Switch( checked = false, onCheckedChange = null, enabled = false, + interactionSource = interactionSource, ) } }