Unify interaction source in SwitchPreference
Let toggleable() & Switch share the same MutableInteractionSource.
So when user press SwitchPreference, Switch widget will also have press
effect.
This is also the same behavior of androidx.preference
Also follow best practise to use T or () -> T, instead of State<T> param
Bug: 306658346
Test: manual - with Gallery
Test: unit test
Change-Id: Ibda986fbc034b1cb379d9e7c4c26b22fbd0bc905
diff --git a/packages/SettingsLib/Spa/build.gradle.kts b/packages/SettingsLib/Spa/build.gradle.kts
index 0b7a568..1c8ddcb 100644
--- a/packages/SettingsLib/Spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/build.gradle.kts
@@ -26,7 +26,7 @@
}
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 aac0fe9..b8dfae3 100644
--- a/packages/SettingsLib/Spa/settings.gradle.kts
+++ b/packages/SettingsLib/Spa/settings.gradle.kts
@@ -26,7 +26,14 @@
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 b73bbd8..189c2dd 100644
--- a/packages/SettingsLib/Spa/spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/spa/build.gradle.kts
@@ -57,7 +57,7 @@
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 4d42fba..56d75d8 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.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 @@
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 @@
.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 081e668..194ed81 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.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 @@
@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 @@
title = title,
subTitle = {
SettingsBody(
- body = summary.value,
+ body = summary(),
maxLines = if (singleLineSummary) 1 else Int.MAX_VALUE,
)
},
@@ -66,7 +64,7 @@
SettingsTheme {
BasePreference(
title = "Screen Saver",
- summary = "Clock".toState(),
+ summary = { "Clock" },
)
}
}
@@ -77,7 +75,7 @@
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 19779f6..74f9c9d 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 @@
) {
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 @@
@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 0c16c8b..35c34d4 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 @@
) {
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 b6099e9..7ecbec7 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 @@
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 ba8c03d..f14f68c 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.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 @@
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 @@
@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 @@
title = title,
summary = summary,
modifier = modifier,
- enabled = changeable,
+ enabled = { changeable },
paddingStart = paddingStart,
paddingEnd = paddingEnd,
paddingVertical = paddingVertical,
@@ -145,10 +144,11 @@
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 @@
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 63de2c8..9a6580c 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 @@
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 0f5e935..2988be8 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 @@
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 9831b91..a0da241 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,
)
}
}