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

Commit 4cfb1c9b authored by Mohammed Althaf T's avatar Mohammed Althaf T 😊 Committed by Nishith Khanna
Browse files

SettingsLib: Use e switch

Change-Id: I288ba930156709ec4bee05af5280fb0f023d157e
parent 20dbc499
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",
+85 −2
Original line number Diff line number Diff line
@@ -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
@@ -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,
@@ -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
                    )
        )
    }
}