From 5d1545687f05fae2dfd7c2bef1e50f772d78cba7 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 1 Mar 2025 10:01:16 +0100 Subject: [PATCH] fix broken list preferences --- .../settings/preferences/ListPreference.kt | 69 +++++++++++++++++++ .../settings/preferences/SliderPreference.kt | 61 ---------------- .../settings/screens/AdvancedScreen.kt | 2 +- .../settings/screens/PreferencesScreen.kt | 6 +- 4 files changed, 73 insertions(+), 65 deletions(-) create mode 100644 app/src/main/java/helium314/keyboard/settings/preferences/ListPreference.kt diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/ListPreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/ListPreference.kt new file mode 100644 index 00000000..93e11b36 --- /dev/null +++ b/app/src/main/java/helium314/keyboard/settings/preferences/ListPreference.kt @@ -0,0 +1,69 @@ +package helium314.keyboard.settings.preferences + +import android.content.SharedPreferences +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext +import androidx.core.content.edit +import helium314.keyboard.latin.utils.prefs +import helium314.keyboard.settings.Setting +import helium314.keyboard.settings.dialogs.ListPickerDialog + +@Composable +/** [items] are displayString to value */ +fun ListPreference( + setting: Setting, + items: List>, + default: T, + onChanged: (T) -> Unit = { } +) { + var showDialog by rememberSaveable { mutableStateOf(false) } + val prefs = LocalContext.current.prefs() + val selected = items.firstOrNull { it.second == getPrefOfType(prefs, setting.key, default) } + Preference( + name = setting.title, + description = selected?.first, + onClick = { showDialog = true } + ) + if (showDialog) { + ListPickerDialog( + onDismissRequest = { showDialog = false }, + items = items, + onItemSelected = { + if (it == selected) return@ListPickerDialog + putPrefOfType(prefs, setting.key, it.second) + onChanged(it.second) + }, + selectedItem = selected, + title = { Text(setting.title) }, + getItemName = { it.first } + ) + } +} + +@Suppress("UNCHECKED_CAST") +fun getPrefOfType(prefs: SharedPreferences, key: String, default: T): T = + when (default) { + is String -> prefs.getString(key, default) + is Int -> prefs.getInt(key, default) + is Long -> prefs.getLong(key, default) + is Float -> prefs.getFloat(key, default) + is Boolean -> prefs.getBoolean(key, default) + else -> throw IllegalArgumentException("unknown type ${default.javaClass}") + } as T + +private fun putPrefOfType(prefs: SharedPreferences, key: String, value: T) = + prefs.edit { + when (value) { + is String -> putString(key, value) + is Int -> putInt(key, value) + is Long -> putLong(key, value) + is Float -> putFloat(key, value) + is Boolean -> putBoolean(key, value) + else -> throw IllegalArgumentException("unknown type ${value.javaClass}") + } + } diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt index d1e5cc47..1eae33b4 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt @@ -1,24 +1,18 @@ // SPDX-License-Identifier: GPL-3.0-only package helium314.keyboard.settings.preferences -import android.content.SharedPreferences -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.core.content.edit import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.prefs -import helium314.keyboard.settings.Setting import helium314.keyboard.settings.SettingsActivity -import helium314.keyboard.settings.dialogs.ListPickerDialog import helium314.keyboard.settings.dialogs.SliderDialog import kotlin.math.roundToInt @@ -72,58 +66,3 @@ fun SliderPreference( } ) } - -@Composable -// just in here so we can keep getPrefOfType private... rename file? -fun ListPreference( - setting: Setting, - items: List>, - default: T, - onChanged: (T) -> Unit = { } -) { - var showDialog by rememberSaveable { mutableStateOf(false) } - val prefs = LocalContext.current.prefs() - val selected = items.firstOrNull { it.second == getPrefOfType(prefs, setting.key, default) } - Preference( - name = setting.title, - description = selected?.first, - onClick = { showDialog = true } - ) - if (showDialog) { - ListPickerDialog( - onDismissRequest = { showDialog = false }, - items = items, - onItemSelected = { - if (it == selected) return@ListPickerDialog - putPrefOfType(prefs, setting.key, it.second) - onChanged(it.second) - }, - selectedItem = selected, - title = { Text(setting.title) }, - getItemName = { it.first } - ) - } -} - -@Suppress("UNCHECKED_CAST") -private fun getPrefOfType(prefs: SharedPreferences, key: String, default: T): T = - when (default) { - is String -> prefs.getString(key, default) - is Int -> prefs.getInt(key, default) - is Long -> prefs.getLong(key, default) - is Float -> prefs.getFloat(key, default) - is Boolean -> prefs.getBoolean(key, default) - else -> throw IllegalArgumentException("unknown type ${default.javaClass}") - } as T - -private fun putPrefOfType(prefs: SharedPreferences, key: String, value: T) = - prefs.edit { - when (value) { - is String -> putString(key, value) - is Int -> putInt(key, value) - is Long -> putLong(key, value) - is Float -> putFloat(key, value) - is Boolean -> putBoolean(key, value) - else -> throw IllegalArgumentException("unknown type ${value.javaClass}") - } - } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt index ec900432..a9712bb6 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt @@ -182,7 +182,7 @@ fun createAdvancedSettings(context: Context) = listOf( }, Setting(context, Settings.PREF_MORE_POPUP_KEYS, R.string.show_popup_keys_title) { val items = listOf(POPUP_KEYS_NORMAL, POPUP_KEYS_MAIN, POPUP_KEYS_MORE, POPUP_KEYS_ALL).map { setting -> - setting to stringResource(morePopupKeysResId(setting)) + stringResource(morePopupKeysResId(setting)) to setting } ListPreference(it, items, Defaults.PREF_MORE_POPUP_KEYS) { KeyboardLayoutSet.onSystemLocaleChanged() } }, diff --git a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt index b2306b17..3d20a2d7 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt @@ -125,9 +125,9 @@ fun createPreferencesSettings(context: Context) = listOf( ListPreference( it, listOf( - "internal" to stringResource(R.string.switch_language), - "input_method" to stringResource(R.string.language_switch_key_switch_input_method), - "both" to stringResource(R.string.language_switch_key_switch_both) + stringResource(R.string.switch_language) to "internal", + stringResource(R.string.language_switch_key_switch_input_method) to "input_method", + stringResource(R.string.language_switch_key_switch_both) to "both" ), Defaults.PREF_LANGUAGE_SWITCH_KEY ) { keyboardNeedsReload = true }