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/ui/Switch.kt +85 −2 Original line number Diff line number Diff line Loading @@ -16,10 +16,32 @@ package com.android.settingslib.spa.widget.ui 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.Box import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Switch import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier 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 foundation.e.elib.R import kotlin.math.roundToInt import com.android.settingslib.spa.framework.util.wrapOnSwitchWithLog @Composable Loading @@ -30,14 +52,14 @@ internal fun SettingsSwitch( interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, ) { if (checked != null) { Switch( ESwitch( checked = checked, onCheckedChange = wrapOnSwitchWithLog(onCheckedChange), enabled = changeable(), interactionSource = interactionSource, ) } else { Switch( ESwitch( checked = false, onCheckedChange = null, enabled = false, Loading @@ -45,3 +67,64 @@ internal fun SettingsSwitch( ) } } @Composable fun ESwitch(checked: Boolean, onCheckedChange: ((newChecked: Boolean) -> Unit)? = null, enabled: Boolean, interactionSource: MutableInteractionSource) { 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 ) }, label = "Thumb offset" ) { state -> if (state) trackWidth - thumbSize - switchPadding else switchPadding } Box( modifier = Modifier.width(trackWidth) .height(trackHeight) .clip(RoundedCornerShape(14.dp)) .background( color = if (checked && enabled) colorResource(R.color.e_switch_track_on) else colorResource(R.color.e_switch_track_off) ) .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()) } .clip(CircleShape) .background( color = if (checked && enabled) colorResource(R.color.e_switch_thumb_on) else colorResource(R.color.e_switch_thumb_off) ) .clickable( enabled = enabled, // Handle whether switch can be clicked onClick = { onCheckedChange?.invoke(!checked) }, interactionSource = interactionSource, indication = null ) ) } } 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/ui/Switch.kt +85 −2 Original line number Diff line number Diff line Loading @@ -16,10 +16,32 @@ package com.android.settingslib.spa.widget.ui 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.Box import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Switch import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier 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 foundation.e.elib.R import kotlin.math.roundToInt import com.android.settingslib.spa.framework.util.wrapOnSwitchWithLog @Composable Loading @@ -30,14 +52,14 @@ internal fun SettingsSwitch( interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, ) { if (checked != null) { Switch( ESwitch( checked = checked, onCheckedChange = wrapOnSwitchWithLog(onCheckedChange), enabled = changeable(), interactionSource = interactionSource, ) } else { Switch( ESwitch( checked = false, onCheckedChange = null, enabled = false, Loading @@ -45,3 +67,64 @@ internal fun SettingsSwitch( ) } } @Composable fun ESwitch(checked: Boolean, onCheckedChange: ((newChecked: Boolean) -> Unit)? = null, enabled: Boolean, interactionSource: MutableInteractionSource) { 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 ) }, label = "Thumb offset" ) { state -> if (state) trackWidth - thumbSize - switchPadding else switchPadding } Box( modifier = Modifier.width(trackWidth) .height(trackHeight) .clip(RoundedCornerShape(14.dp)) .background( color = if (checked && enabled) colorResource(R.color.e_switch_track_on) else colorResource(R.color.e_switch_track_off) ) .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()) } .clip(CircleShape) .background( color = if (checked && enabled) colorResource(R.color.e_switch_thumb_on) else colorResource(R.color.e_switch_thumb_off) ) .clickable( enabled = enabled, // Handle whether switch can be clicked onClick = { onCheckedChange?.invoke(!checked) }, interactionSource = interactionSource, indication = null ) ) } }