Make SliderPreference support int

This commit is contained in:
Suphon Thanakornpakapong
2021-08-05 21:48:15 +07:00
parent 79171e387d
commit 3452285bde
9 changed files with 84 additions and 29 deletions
@@ -22,14 +22,24 @@ import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.LauncherAppState
import kotlin.reflect.KProperty
class PreferenceAdapter<T>(
interface PreferenceAdapter<T> {
val state: State<T>
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<T>(
private val get: () -> T,
private val set: (T) -> Unit
) : PreferenceChangeListener {
) : PreferenceAdapter<T>, PreferenceChangeListener {
private val stateInternal = mutableStateOf(get())
val state: State<T> get() = stateInternal
override val state: State<T> get() = stateInternal
fun onChange(newValue: T) {
override fun onChange(newValue: T) {
set(newValue)
stateInternal.value = newValue
}
@@ -37,22 +47,17 @@ class PreferenceAdapter<T>(
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<Float> {
fun BasePreferenceManager.IdpIntPref.getAdapter(): PreferenceAdapter<Int> {
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 <P, T> getAdapter(
get: () -> T,
set: (T) -> Unit
): PreferenceAdapter<T> {
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 <T, R>rememberTransformAdapter(
adapter: PreferenceAdapter<T>,
transformGet: (T) -> R,
transformSet: (R) -> T
): PreferenceAdapter<R> {
return remember(adapter) {
TransformPreferenceAdapter(adapter, transformGet, transformSet)
}
}
private class TransformPreferenceAdapter<T, R>(
private val parent: PreferenceAdapter<T>,
private val transformGet: (T) -> R,
private val transformSet: (R) -> T
) : PreferenceAdapter<R> {
override val state = derivedStateOf { transformGet(parent.state.value) }
override fun onChange(newValue: R) {
parent.onChange(transformSet(newValue))
}
}
@@ -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)
@@ -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
)
}
@@ -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
)
}
@@ -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
)
}
@@ -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
)
}
@@ -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
)
}
@@ -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<Int>,
valueRange: ClosedRange<Int>,
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,
@@ -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)
}