Loading packages/SettingsLib/Spa/spa/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ android_library { "com.google.android.material_material", "lottie_compose", "MPAndroidChart", "elib", ], kotlincflags: [ "-Xjvm-default=all", Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt +1 −3 Original line number Diff line number Diff line Loading @@ -143,9 +143,7 @@ internal fun InternalSwitchPreference( SettingsSwitch( checked = checked, changeable = { changeable }, // The onCheckedChange is handled on the whole SwitchPreference. // DO NOT set it on SettingsSwitch. onCheckedChange = null, onCheckedChange = onChangeWithLog, interactionSource = interactionSource, ) } Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt +70 −19 Original line number Diff line number Diff line Loading @@ -16,14 +16,31 @@ package com.android.settingslib.spa.widget.ui import android.widget.Switch import androidx.compose.animation.core.Spring import androidx.compose.animation.core.animateDp import androidx.compose.animation.core.spring import androidx.compose.animation.core.updateTransition import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.draw.clip import androidx.compose.ui.res.colorResource import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import com.android.settingslib.spa.framework.util.wrapOnSwitchWithLog import foundation.e.elib.R import kotlin.math.roundToInt @Composable internal fun SettingsSwitch( Loading Loading @@ -52,23 +69,57 @@ internal fun SettingsSwitch( @Composable fun ESwitch( checked: Boolean, onCheckedChange: ((Boolean) -> Unit)?, enabled: Boolean = true, interactionSource: MutableInteractionSource // Unused interactionSource, keep for consistency onCheckedChange: ((newChecked: Boolean) -> Unit)? = null, enabled: Boolean, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() } ) { AndroidView( factory = { context -> Switch(context) val thumbSize = 24.dp val trackWidth = 52.dp val trackHeight = 28.dp val switchPadding = 2.dp val transition = updateTransition(targetState = checked, label = "switch") val thumbOffsetX by transition.animateDp( transitionSpec = { spring( dampingRatio = Spring.DampingRatioNoBouncy, stiffness = Spring.StiffnessMediumLow ) }, update = { view -> view.isChecked = checked view.isEnabled = enabled view.setOnCheckedChangeListener { _, newChecked -> if (newChecked != checked && onCheckedChange != null) { onCheckedChange(newChecked) label = "Thumb offset" ) { state -> if (state) trackWidth - thumbSize - switchPadding else switchPadding } val trackColor = if (checked && enabled) colorResource(R.color.e_switch_track_on) else colorResource(R.color.e_switch_track_off) val thumbColor = if (checked && enabled) colorResource(R.color.e_switch_thumb_on) else colorResource(R.color.e_switch_thumb_off) Box( modifier = Modifier.width(trackWidth) .height(trackHeight) .clip(RoundedCornerShape(14.dp)) .background(color = trackColor) .clickable( enabled = enabled, // Handle whether switch can be clicked onClick = { onCheckedChange?.invoke(!checked) }, interactionSource = interactionSource, indication = null ) ) { Box( modifier = Modifier.size(thumbSize) .offset { IntOffset(thumbOffsetX.roundToPx(), switchPadding.toPx().roundToInt()) } }, modifier = Modifier.wrapContentWidth() .clip(CircleShape) .background(color = thumbColor) ) } } Loading
packages/SettingsLib/Spa/spa/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ android_library { "com.google.android.material_material", "lottie_compose", "MPAndroidChart", "elib", ], kotlincflags: [ "-Xjvm-default=all", Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SwitchPreference.kt +1 −3 Original line number Diff line number Diff line Loading @@ -143,9 +143,7 @@ internal fun InternalSwitchPreference( SettingsSwitch( checked = checked, changeable = { changeable }, // The onCheckedChange is handled on the whole SwitchPreference. // DO NOT set it on SettingsSwitch. onCheckedChange = null, onCheckedChange = onChangeWithLog, interactionSource = interactionSource, ) } Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Switch.kt +70 −19 Original line number Diff line number Diff line Loading @@ -16,14 +16,31 @@ package com.android.settingslib.spa.widget.ui import android.widget.Switch import androidx.compose.animation.core.Spring import androidx.compose.animation.core.animateDp import androidx.compose.animation.core.spring import androidx.compose.animation.core.updateTransition import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.draw.clip import androidx.compose.ui.res.colorResource import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import com.android.settingslib.spa.framework.util.wrapOnSwitchWithLog import foundation.e.elib.R import kotlin.math.roundToInt @Composable internal fun SettingsSwitch( Loading Loading @@ -52,23 +69,57 @@ internal fun SettingsSwitch( @Composable fun ESwitch( checked: Boolean, onCheckedChange: ((Boolean) -> Unit)?, enabled: Boolean = true, interactionSource: MutableInteractionSource // Unused interactionSource, keep for consistency onCheckedChange: ((newChecked: Boolean) -> Unit)? = null, enabled: Boolean, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() } ) { AndroidView( factory = { context -> Switch(context) val thumbSize = 24.dp val trackWidth = 52.dp val trackHeight = 28.dp val switchPadding = 2.dp val transition = updateTransition(targetState = checked, label = "switch") val thumbOffsetX by transition.animateDp( transitionSpec = { spring( dampingRatio = Spring.DampingRatioNoBouncy, stiffness = Spring.StiffnessMediumLow ) }, update = { view -> view.isChecked = checked view.isEnabled = enabled view.setOnCheckedChangeListener { _, newChecked -> if (newChecked != checked && onCheckedChange != null) { onCheckedChange(newChecked) label = "Thumb offset" ) { state -> if (state) trackWidth - thumbSize - switchPadding else switchPadding } val trackColor = if (checked && enabled) colorResource(R.color.e_switch_track_on) else colorResource(R.color.e_switch_track_off) val thumbColor = if (checked && enabled) colorResource(R.color.e_switch_thumb_on) else colorResource(R.color.e_switch_thumb_off) Box( modifier = Modifier.width(trackWidth) .height(trackHeight) .clip(RoundedCornerShape(14.dp)) .background(color = trackColor) .clickable( enabled = enabled, // Handle whether switch can be clicked onClick = { onCheckedChange?.invoke(!checked) }, interactionSource = interactionSource, indication = null ) ) { Box( modifier = Modifier.size(thumbSize) .offset { IntOffset(thumbOffsetX.roundToPx(), switchPadding.toPx().roundToInt()) } }, modifier = Modifier.wrapContentWidth() .clip(CircleShape) .background(color = thumbColor) ) } }