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,
         )
     }
 }