feat: Haptic on Lawnchair settings (#6470)

* feat: Haptic on Lawnchair settings

Signed-off-by: Pun Butrach <pun.butrach@gmail.com>

* chore: Spotlessified

Signed-off-by: Pun Butrach <pun.butrach@gmail.com>

---------

Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
This commit is contained in:
Pun Butrach
2026-03-28 20:52:24 +08:00
committed by GitHub
parent cfc529d3ea
commit 3c4fff0fd4
3 changed files with 29 additions and 3 deletions
@@ -35,6 +35,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
@@ -46,6 +47,8 @@ import app.lawnchair.ui.theme.LawnchairTheme
import app.lawnchair.ui.util.preview.PreferenceGroupPreviewContainer
import app.lawnchair.ui.util.preview.PreviewLawnchair
import com.android.launcher3.R
import com.android.launcher3.util.MSDLPlayerWrapper
import com.google.android.msdl.data.model.MSDLToken
import kotlin.math.roundToInt
@Composable
@@ -112,6 +115,12 @@ private fun SliderPreference(
showUnit: String = "",
) {
var sliderValue by remember { mutableFloatStateOf(value) }
val mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(LocalContext.current)
val getAppropriateHaptic = if (step == 0f) {
MSDLToken.DRAG_INDICATOR_CONTINUOUS
} else {
MSDLToken.DRAG_INDICATOR_DISCRETE
}
DisposableEffect(value) {
sliderValue = value
@@ -156,7 +165,10 @@ private fun SliderPreference(
description = {
Slider(
value = sliderValue,
onValueChange = { newValue -> sliderValue = newValue },
onValueChange = { newValue ->
sliderValue = newValue
mMSDLPlayerWrapper.playToken(getAppropriateHaptic)
},
onValueChangeFinished = { onValueChangeFinished(sliderValue) },
valueRange = valueRange,
steps = getSteps(valueRange, step),
@@ -36,6 +36,7 @@ import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
@@ -45,6 +46,8 @@ import app.lawnchair.ui.theme.LawnchairTheme
import app.lawnchair.ui.theme.dividerColor
import app.lawnchair.ui.util.preview.PreferenceGroupPreviewContainer
import app.lawnchair.ui.util.preview.PreviewLawnchair
import com.android.launcher3.util.MSDLPlayerWrapper
import com.google.android.msdl.data.model.MSDLToken
@Composable
fun SwitchPreference(
@@ -81,6 +84,12 @@ fun SwitchPreference(
onClick: (() -> Unit)? = null,
) {
val interactionSource = remember { MutableInteractionSource() }
val mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(LocalContext.current)
val wrappedOnCheckedChange: (Boolean) -> Unit = { newValue ->
mMSDLPlayerWrapper.playToken(if (newValue) MSDLToken.SWITCH_ON else MSDLToken.SWITCH_OFF)
onCheckedChange(newValue)
}
PreferenceTemplate(
modifier = modifier.clickable(
@@ -91,7 +100,7 @@ fun SwitchPreference(
if (onClick != null) {
onClick()
} else {
onCheckedChange(!checked)
wrappedOnCheckedChange(!checked)
}
},
contentModifier = Modifier
@@ -115,7 +124,7 @@ fun SwitchPreference(
.padding(all = 16.dp)
.height(24.dp),
checked = checked,
onCheckedChange = onCheckedChange,
onCheckedChange = wrappedOnCheckedChange,
enabled = enabled,
interactionSource = interactionSource,
thumbContent = {
@@ -37,7 +37,9 @@ import app.lawnchair.util.FileAccessState
import app.lawnchair.util.isGestureNavContractCompatible
import com.android.launcher3.R
import com.android.launcher3.Utilities
import com.android.launcher3.util.MSDLPlayerWrapper
import com.android.systemui.shared.system.BlurUtils
import com.google.android.msdl.data.model.MSDLToken
@Composable
fun ExperimentalFeaturesPreferences(
@@ -45,6 +47,8 @@ fun ExperimentalFeaturesPreferences(
) {
val prefs = preferenceManager()
val prefs2 = preferenceManager2()
val mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(LocalContext.current)
PreferenceLayout(
label = stringResource(id = R.string.experimental_features_label),
backArrowVisible = !LocalIsExpandedScreen.current,
@@ -93,6 +97,7 @@ fun ExperimentalFeaturesPreferences(
Switch(
checked = enabled,
onCheckedChange = {
mMSDLPlayerWrapper.playToken(if (it) MSDLToken.SWITCH_ON else MSDLToken.SWITCH_OFF)
enableFolderIconShapeCustomizationAdapter.onChange(it)
// Clean-up when user disables folder shape customisation.
if (!it) {