From 3452285bde34356bedaeddd749a330a044decbaa Mon Sep 17 00:00:00 2001 From: Suphon Thanakornpakapong Date: Thu, 5 Aug 2021 21:48:15 +0700 Subject: [PATCH] Make SliderPreference support int --- .../preferences/PreferenceAdapter.kt | 54 ++++++++++++++----- .../preferences/PreferenceManager.kt | 2 +- .../ui/preferences/AppDrawerPreferences.kt | 4 +- .../ui/preferences/DockPreferences.kt | 4 +- .../ui/preferences/FolderPreferences.kt | 8 +-- .../ui/preferences/HomeScreenPreferences.kt | 8 +-- .../ui/preferences/QuickstepPreferences.kt | 4 +- .../components/SliderPreference.kt | 27 ++++++++++ .../src/app/lawnchair/util/LawnchairUtils.kt | 2 +- 9 files changed, 84 insertions(+), 29 deletions(-) diff --git a/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt b/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt index b0defe4dd4..7de1f80bee 100644 --- a/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt +++ b/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt @@ -22,14 +22,24 @@ import com.android.launcher3.InvariantDeviceProfile import com.android.launcher3.LauncherAppState import kotlin.reflect.KProperty -class PreferenceAdapter( +interface PreferenceAdapter { + val state: State + fun onChange(newValue: T) + + operator fun getValue(thisObj: Any?, property: KProperty<*>): T = state.value + operator fun setValue(thisObj: Any?, property: KProperty<*>, newValue: T) { + onChange(newValue) + } +} + +class PreferenceAdapterImpl( private val get: () -> T, private val set: (T) -> Unit -) : PreferenceChangeListener { +) : PreferenceAdapter, PreferenceChangeListener { private val stateInternal = mutableStateOf(get()) - val state: State get() = stateInternal + override val state: State get() = stateInternal - fun onChange(newValue: T) { + override fun onChange(newValue: T) { set(newValue) stateInternal.value = newValue } @@ -37,22 +47,17 @@ class PreferenceAdapter( override fun onPreferenceChange() { stateInternal.value = get() } - - operator fun getValue(thisObj: Any?, property: KProperty<*>): T = stateInternal.value - operator fun setValue(thisObj: Any?, property: KProperty<*>, newValue: T) { - onChange(newValue) - } } @Composable -fun BasePreferenceManager.IdpIntPref.getAdapter(): PreferenceAdapter { +fun BasePreferenceManager.IdpIntPref.getAdapter(): PreferenceAdapter { val context = LocalContext.current val idp = remember { InvariantDeviceProfile.INSTANCE.get(context) } val defaultGrid = idp.closestProfile return getAdapter( this, - { get(defaultGrid).toFloat() }, - { newValue -> set(newValue.toInt(), defaultGrid) } + { get(defaultGrid) }, + { newValue -> set(newValue, defaultGrid) } ) } @@ -75,10 +80,33 @@ private fun getAdapter( get: () -> T, set: (T) -> Unit ): PreferenceAdapter { - val adapter = remember { PreferenceAdapter(get, set) } + val adapter = remember { PreferenceAdapterImpl(get, set) } DisposableEffect(pref) { pref.addListener(adapter) onDispose { pref.removeListener(adapter) } } return adapter } + +@Composable +fun rememberTransformAdapter( + adapter: PreferenceAdapter, + transformGet: (T) -> R, + transformSet: (R) -> T +): PreferenceAdapter { + return remember(adapter) { + TransformPreferenceAdapter(adapter, transformGet, transformSet) + } +} + +private class TransformPreferenceAdapter( + private val parent: PreferenceAdapter, + private val transformGet: (T) -> R, + private val transformSet: (R) -> T +) : PreferenceAdapter { + override val state = derivedStateOf { transformGet(parent.state.value) } + + override fun onChange(newValue: R) { + parent.onChange(transformSet(newValue)) + } +} diff --git a/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt b/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt index 08df9494ad..8c3493a16e 100644 --- a/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt +++ b/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt @@ -84,7 +84,7 @@ class PreferenceManager private constructor(private val context: Context) : Base val launcherTheme = StringPref("pref_launcherTheme", "system") val clearAllAsAction = BoolPref("pref_clearAllAsAction", false) val overrideWindowCornerRadius = BoolPref("pref_overrideWindowCornerRadius", false, recreate) - val windowCornerRadius = FloatPref("pref_windowCornerRadius", 80f, recreate) + val windowCornerRadius = IntPref("pref_windowCornerRadius", 80, recreate) val autoLaunchRoot = BoolPref("pref_autoLaunchRoot", false) val useSystemAccent = BoolPref("pref_useSystemAccent", Utilities.ATLEAST_S, recreate) val accentColor = IntPref("pref_accentColor", LAWNCHAIR_BLUE.toInt(), recreate) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/AppDrawerPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/AppDrawerPreferences.kt index 6e45e9180c..d410d07b83 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/AppDrawerPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/AppDrawerPreferences.kt @@ -67,8 +67,8 @@ fun AppDrawerPreferences() { SliderPreference( label = stringResource(id = R.string.app_drawer_columns), adapter = prefs.allAppsColumns.getAdapter(), - step = 1f, - valueRange = 3.0F..7.0F, + step = 1, + valueRange = 3..7, showDivider = false ) } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/DockPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/DockPreferences.kt index 8d42f4df48..d8c6749929 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/DockPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/DockPreferences.kt @@ -49,8 +49,8 @@ fun DockPreferences() { SliderPreference( label = stringResource(id = R.string.dock_icons), adapter = prefs.hotseatColumns.getAdapter(), - step = 1f, - valueRange = 3.0F..7.0F, + step = 1, + valueRange = 3..7, showDivider = false ) } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/FolderPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/FolderPreferences.kt index 3c88b1f107..738442d534 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/FolderPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/FolderPreferences.kt @@ -41,14 +41,14 @@ fun FolderPreferences() { SliderPreference( label = stringResource(id = R.string.max_folder_columns), adapter = prefs.folderColumns.getAdapter(), - step = 1f, - valueRange = 2.0F..5.0F + step = 1, + valueRange = 2..5 ) SliderPreference( label = stringResource(id = R.string.max_folder_rows), adapter = prefs.folderRows.getAdapter(), - step = 1f, - valueRange = 2.0F..5.0F, + step = 1, + valueRange = 2..5, showDivider = false ) } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt index 18242c2384..a6131d20a9 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt @@ -68,14 +68,14 @@ fun HomeScreenPreferences() { SliderPreference( label = stringResource(id = R.string.home_screen_columns), adapter = prefs.workspaceColumns.getAdapter(), - step = 1f, - valueRange = 3.0F..7.0F + step = 1, + valueRange = 3..7 ) SliderPreference( label = stringResource(id = R.string.home_screen_rows), adapter = prefs.workspaceRows.getAdapter(), - step = 1f, - valueRange = 3.0F..7.0F, + step = 1, + valueRange = 3..7, showDivider = false ) } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/QuickstepPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/QuickstepPreferences.kt index 97e70527c2..6b7ae1e728 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/QuickstepPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/QuickstepPreferences.kt @@ -46,8 +46,8 @@ fun QuickstepPreferences() { SliderPreference( label = stringResource(id = R.string.window_corner_radius_label), adapter = prefs.windowCornerRadius.getAdapter(), - step = 0f, - valueRange = 80f..150f, + step = 0, + valueRange = 80..150, showDivider = false ) } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/SliderPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/SliderPreference.kt index f3f688666e..f5a9c7d5de 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/SliderPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/SliderPreference.kt @@ -23,8 +23,35 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import app.lawnchair.preferences.PreferenceAdapter +import app.lawnchair.preferences.rememberTransformAdapter import kotlin.math.roundToInt +@Composable +fun SliderPreference( + label: String, + adapter: PreferenceAdapter, + valueRange: ClosedRange, + step: Int, + showAsPercentage: Boolean = false, + showDivider: Boolean = true +) { + val transformedAdapter = rememberTransformAdapter( + adapter = adapter, + transformGet = { it.toFloat() }, + transformSet = { it.roundToInt() } + ) + val start = valueRange.start.toFloat() + val endInclusive = valueRange.endInclusive.toFloat() + SliderPreference( + label = label, + adapter = transformedAdapter, + valueRange = start..endInclusive, + step = step.toFloat(), + showAsPercentage = showAsPercentage, + showDivider = showDivider + ) +} + @Composable fun SliderPreference( label: String, diff --git a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt index 79a86b0967..af8de8b60d 100644 --- a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt +++ b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt @@ -81,7 +81,7 @@ fun killLauncher() { fun getWindowCornerRadius(context: Context): Float { val prefs = PreferenceManager.getInstance(context) if (prefs.overrideWindowCornerRadius.get()) { - return prefs.windowCornerRadius.get() + return prefs.windowCornerRadius.get().toFloat() } return QuickStepContract.getWindowCornerRadius(context.resources) }