Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce55d5df authored by Mohammed Althaf T's avatar Mohammed Althaf T 😊
Browse files

Merge branch '2821-u-eswitch' into 'v1-u'

base: Create Eswitch with compose

See merge request e/os/android_frameworks_base!247
parents 5e8aae2a 442c522e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ android_library {
        "com.google.android.material_material",
        "lottie_compose",
        "MPAndroidChart",
        "elib",
    ],
    kotlincflags: [
        "-Xjvm-default=all",
+1 −3
Original line number Diff line number Diff line
@@ -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,
        )
    }
+70 −19
Original line number Diff line number Diff line
@@ -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(
@@ -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)
        )
    }
}