Skip to content

Commit ef7ec5e

Browse files
committed
Fix compatibility of shared preferences with previous version. Gracefully handle misplaced settings.
1 parent fc23c42 commit ef7ec5e

11 files changed

+128
-141
lines changed

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/mobile/feature/gamemenu/GameMenuCoreOptionsFragment.kt

-93
This file was deleted.

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/mobile/feature/gamemenu/coreoptions/GameMenuCoreOptionsScreen.kt

+20-10
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ import androidx.compose.ui.platform.LocalContext
1414
import androidx.compose.ui.res.stringResource
1515
import com.swordfish.lemuroid.R
1616
import com.swordfish.lemuroid.app.mobile.feature.gamemenu.GameMenuActivity
17+
import com.swordfish.lemuroid.app.shared.coreoptions.CoreOptionsPreferenceHelper
1718
import com.swordfish.lemuroid.app.shared.coreoptions.LemuroidCoreOption
1819
import com.swordfish.lemuroid.app.shared.settings.ControllerConfigsManager
1920
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsGroup
2021
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsList
22+
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsSwitch
23+
import com.swordfish.lemuroid.app.utils.android.settings.booleanPreferenceState
2124
import com.swordfish.lemuroid.app.utils.android.settings.indexPreferenceState
2225
import com.swordfish.lemuroid.lib.core.CoreVariablesManager
2326

@@ -52,16 +55,23 @@ private fun CoreOptions(
5255
}
5356

5457
for (coreOption in coreOptions) {
55-
LemuroidSettingsList(
56-
title = { Text(text = coreOption.getDisplayName(context)) },
57-
items = coreOption.getEntries(context),
58-
state =
59-
indexPreferenceState(
60-
CoreVariablesManager.computeSharedPreferenceKey(coreOption.getKey(), systemID),
61-
coreOption.getEntriesValues().first(),
62-
coreOption.getEntriesValues(),
63-
),
64-
)
58+
if (coreOption.getEntriesValues().toSet() == CoreOptionsPreferenceHelper.BOOLEAN_SET) {
59+
LemuroidSettingsSwitch(
60+
state = booleanPreferenceState(coreOption.getKey(), coreOption.getCurrentValue() == "enabled"),
61+
title = { Text(text = coreOption.getDisplayName(context)) },
62+
)
63+
} else {
64+
LemuroidSettingsList(
65+
title = { Text(text = coreOption.getDisplayName(context)) },
66+
items = coreOption.getEntries(context),
67+
state =
68+
indexPreferenceState(
69+
CoreVariablesManager.computeSharedPreferenceKey(coreOption.getKey(), systemID),
70+
coreOption.getEntriesValues().first(),
71+
coreOption.getEntriesValues(),
72+
),
73+
)
74+
}
6575
}
6676
}
6777

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/mobile/feature/settings/savesync/SaveSyncSettingsScreen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsMenuLin
1616
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsPage
1717
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsSwitch
1818
import com.swordfish.lemuroid.app.utils.android.settings.booleanPreferenceState
19-
import com.swordfish.lemuroid.app.utils.android.stringsSetPreferenceState
19+
import com.swordfish.lemuroid.app.utils.android.settings.stringsSetPreferenceState
2020

2121
@Composable
2222
fun SaveSyncSettingsScreen(

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/shared/coreoptions/CoreOptionsPreferenceHelper.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import com.swordfish.lemuroid.lib.core.CoreVariablesManager
1414
import com.swordfish.lemuroid.lib.library.CoreID
1515

1616
object CoreOptionsPreferenceHelper {
17-
private val BOOLEAN_SET = setOf("enabled", "disabled")
17+
val BOOLEAN_SET = setOf("enabled", "disabled")
1818

1919
fun addPreferences(
2020
preferenceScreen: PreferenceScreen,

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/shared/game/BaseGameActivity.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,13 @@ abstract class BaseGameActivity : ImmersiveActivity() {
492492

493493
private fun getCoreOptions(): List<CoreOption> {
494494
return retroGameView?.getVariables()
495-
?.map { CoreOption.fromLibretroDroidVariable(it) } ?: listOf()
495+
?.mapNotNull {
496+
val coreOptionResult =
497+
runCatching {
498+
CoreOption.fromLibretroDroidVariable(it)
499+
}
500+
coreOptionResult.getOrNull()
501+
} ?: listOf()
496502
}
497503

498504
private fun updateCoreVariables(options: List<CoreVariable>) {

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/utils/android/PreferenceStates.kt

-16
This file was deleted.

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/utils/android/settings/States.kt

+16-9
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,22 @@ package com.swordfish.lemuroid.app.utils.android.settings
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.platform.LocalContext
55
import androidx.compose.ui.res.stringResource
6-
import com.alorma.compose.settings.storage.disk.rememberPreferenceBooleanSettingState
7-
import com.swordfish.lemuroid.app.utils.settings.rememberPreferenceIndexSettingState
6+
import com.swordfish.lemuroid.app.utils.settings.rememberSafePreferenceBooleanSettingState
7+
import com.swordfish.lemuroid.app.utils.settings.rememberSafePreferenceIndexSettingState
8+
import com.swordfish.lemuroid.app.utils.settings.rememberSafePreferenceStringsSetSettingState
89
import com.swordfish.lemuroid.lib.preferences.SharedPreferencesHelper
910

1011
@Composable
1112
fun booleanPreferenceState(
1213
id: Int,
1314
default: Boolean,
14-
) = rememberPreferenceBooleanSettingState(
15-
key = stringResource(id = id),
16-
defaultValue = default,
17-
preferences = SharedPreferencesHelper.getSharedPreferences(LocalContext.current),
18-
)
15+
) = booleanPreferenceState(stringResource(id = id), default)
1916

2017
@Composable
2118
fun booleanPreferenceState(
2219
key: String,
2320
default: Boolean,
24-
) = rememberPreferenceBooleanSettingState(
21+
) = rememberSafePreferenceBooleanSettingState(
2522
key = key,
2623
defaultValue = default,
2724
preferences = SharedPreferencesHelper.getSharedPreferences(LocalContext.current),
@@ -39,9 +36,19 @@ fun indexPreferenceState(
3936
key: String,
4037
default: String,
4138
values: List<String>,
42-
) = rememberPreferenceIndexSettingState(
39+
) = rememberSafePreferenceIndexSettingState(
4340
key = key,
4441
values = values,
4542
defaultValue = default,
4643
preferences = SharedPreferencesHelper.getSharedPreferences(LocalContext.current),
4744
)
45+
46+
@Composable
47+
fun stringsSetPreferenceState(
48+
key: String,
49+
default: Set<String>,
50+
) = rememberSafePreferenceStringsSetSettingState(
51+
key = key,
52+
defaultValue = default,
53+
preferences = SharedPreferencesHelper.getSharedPreferences(LocalContext.current),
54+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.swordfish.lemuroid.app.utils.settings
2+
3+
import android.content.SharedPreferences
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.getValue
6+
import androidx.compose.runtime.mutableStateOf
7+
import androidx.compose.runtime.remember
8+
import androidx.compose.runtime.setValue
9+
import androidx.compose.ui.platform.LocalContext
10+
import androidx.core.content.edit
11+
import androidx.preference.PreferenceManager
12+
import com.alorma.compose.settings.storage.base.SettingValueState
13+
14+
@Composable
15+
fun rememberSafePreferenceBooleanSettingState(
16+
key: String,
17+
defaultValue: Boolean,
18+
preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(LocalContext.current),
19+
): SafeBooleanPreferenceSettingValueState {
20+
return remember {
21+
SafeBooleanPreferenceSettingValueState(
22+
preferences = preferences,
23+
key = key,
24+
defaultValue = defaultValue,
25+
)
26+
}
27+
}
28+
29+
class SafeBooleanPreferenceSettingValueState(
30+
private val preferences: SharedPreferences,
31+
val key: String,
32+
val defaultValue: Boolean = false,
33+
) : SettingValueState<Boolean> {
34+
private var _value by mutableStateOf(preferences.safeGetBoolean(key, defaultValue))
35+
36+
override var value: Boolean
37+
set(value) {
38+
_value = value
39+
preferences.edit { putBoolean(key, value) }
40+
}
41+
get() = _value
42+
43+
override fun reset() {
44+
value = defaultValue
45+
}
46+
}

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/utils/settings/IndexPreferenceSettingValueState.kt lemuroid-app/src/main/java/com/swordfish/lemuroid/app/utils/settings/SafeIndexPreferenceSettingValueState.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,24 @@ import androidx.preference.PreferenceManager
1212
import com.alorma.compose.settings.storage.base.SettingValueState
1313

1414
@Composable
15-
fun rememberPreferenceIndexSettingState(
15+
fun rememberSafePreferenceIndexSettingState(
1616
key: String,
1717
values: List<String>,
1818
defaultValue: String,
1919
preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(LocalContext.current),
20-
): IndexPreferenceSettingValueState {
20+
): SafeIndexPreferenceSettingValueState {
2121
return remember {
22-
IndexPreferenceSettingValueState(preferences, key, values, defaultValue)
22+
SafeIndexPreferenceSettingValueState(preferences, key, values, defaultValue)
2323
}
2424
}
2525

26-
class IndexPreferenceSettingValueState(
26+
class SafeIndexPreferenceSettingValueState(
2727
private val preferences: SharedPreferences,
2828
val key: String,
2929
private val values: List<String>,
3030
private val defaultValue: String,
3131
) : SettingValueState<Int> {
32-
private var _value by mutableStateOf(preferences.getString(key, defaultValue))
32+
private var _value by mutableStateOf(preferences.safeGetString(key, defaultValue))
3333

3434
override var value: Int
3535
set(index) {

lemuroid-app/src/main/java/com/swordfish/lemuroid/app/utils/settings/StringsSetPreferenceSettingValueState.kt lemuroid-app/src/main/java/com/swordfish/lemuroid/app/utils/settings/SafeStringsSetPreferenceSettingValueState.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,22 @@ import androidx.preference.PreferenceManager
1212
import com.alorma.compose.settings.storage.base.SettingValueState
1313

1414
@Composable
15-
fun rememberPreferenceStringsSetSettingState(
15+
fun rememberSafePreferenceStringsSetSettingState(
1616
key: String,
1717
defaultValue: Set<String>,
1818
preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(LocalContext.current),
19-
): StringsSetPreferenceSettingValueState {
19+
): SafeStringsSetPreferenceSettingValueState {
2020
return remember {
21-
StringsSetPreferenceSettingValueState(preferences, key, defaultValue)
21+
SafeStringsSetPreferenceSettingValueState(preferences, key, defaultValue)
2222
}
2323
}
2424

25-
class StringsSetPreferenceSettingValueState(
25+
class SafeStringsSetPreferenceSettingValueState(
2626
private val preferences: SharedPreferences,
2727
val key: String,
2828
private val defaultValue: Set<String>,
2929
) : SettingValueState<Set<String>> {
30-
private var _value by mutableStateOf(preferences.getStringSet(key, defaultValue)!!)
30+
private var _value by mutableStateOf(preferences.safeGetStringSet(key, defaultValue)!!)
3131

3232
override var value: Set<String>
3333
set(index) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.swordfish.lemuroid.app.utils.settings
2+
3+
import android.content.SharedPreferences
4+
5+
fun SharedPreferences.safeGetString(
6+
key: String,
7+
defValue: String?,
8+
): String? {
9+
val result = runCatching { getString(key, defValue) }
10+
return result.getOrDefault(defValue)
11+
}
12+
13+
fun SharedPreferences.safeGetBoolean(
14+
key: String,
15+
defValue: Boolean,
16+
): Boolean {
17+
val result = runCatching { getBoolean(key, defValue) }
18+
return result.getOrDefault(defValue)
19+
}
20+
21+
fun SharedPreferences.safeGetStringSet(
22+
key: String,
23+
defValue: Set<String>?,
24+
): Set<String>? {
25+
val result = runCatching { getStringSet(key, defValue) }
26+
return result.getOrDefault(defValue)
27+
}

0 commit comments

Comments
 (0)