Skip to content

Commit

Permalink
Fix compatibility of shared preferences with previous version. Gracef…
Browse files Browse the repository at this point in the history
…ully handle misplaced settings.
  • Loading branch information
Swordfish90 committed May 8, 2024
1 parent fc23c42 commit aadde1a
Show file tree
Hide file tree
Showing 11 changed files with 128 additions and 141 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.swordfish.lemuroid.R
import com.swordfish.lemuroid.app.mobile.feature.gamemenu.GameMenuActivity
import com.swordfish.lemuroid.app.shared.coreoptions.CoreOptionsPreferenceHelper
import com.swordfish.lemuroid.app.shared.coreoptions.LemuroidCoreOption
import com.swordfish.lemuroid.app.shared.settings.ControllerConfigsManager
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsGroup
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsList
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsSwitch
import com.swordfish.lemuroid.app.utils.android.settings.booleanPreferenceState
import com.swordfish.lemuroid.app.utils.android.settings.indexPreferenceState
import com.swordfish.lemuroid.lib.core.CoreVariablesManager

Expand Down Expand Up @@ -52,16 +55,23 @@ private fun CoreOptions(
}

for (coreOption in coreOptions) {
LemuroidSettingsList(
title = { Text(text = coreOption.getDisplayName(context)) },
items = coreOption.getEntries(context),
state =
indexPreferenceState(
CoreVariablesManager.computeSharedPreferenceKey(coreOption.getKey(), systemID),
coreOption.getEntriesValues().first(),
coreOption.getEntriesValues(),
),
)
if (coreOption.getEntriesValues().toSet() == CoreOptionsPreferenceHelper.BOOLEAN_SET) {
LemuroidSettingsSwitch(
state = booleanPreferenceState(coreOption.getKey(), coreOption.getCurrentValue() == "enabled"),
title = { Text(text = coreOption.getDisplayName(context)) },
)
} else {
LemuroidSettingsList(
title = { Text(text = coreOption.getDisplayName(context)) },
items = coreOption.getEntries(context),
state =
indexPreferenceState(
CoreVariablesManager.computeSharedPreferenceKey(coreOption.getKey(), systemID),
coreOption.getEntriesValues().first(),
coreOption.getEntriesValues(),
),
)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsMenuLin
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsPage
import com.swordfish.lemuroid.app.utils.android.settings.LemuroidSettingsSwitch
import com.swordfish.lemuroid.app.utils.android.settings.booleanPreferenceState
import com.swordfish.lemuroid.app.utils.android.stringsSetPreferenceState
import com.swordfish.lemuroid.app.utils.android.settings.stringsSetPreferenceState

@Composable
fun SaveSyncSettingsScreen(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.swordfish.lemuroid.lib.core.CoreVariablesManager
import com.swordfish.lemuroid.lib.library.CoreID

object CoreOptionsPreferenceHelper {
private val BOOLEAN_SET = setOf("enabled", "disabled")
val BOOLEAN_SET = setOf("enabled", "disabled")

fun addPreferences(
preferenceScreen: PreferenceScreen,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,13 @@ abstract class BaseGameActivity : ImmersiveActivity() {

private fun getCoreOptions(): List<CoreOption> {
return retroGameView?.getVariables()
?.map { CoreOption.fromLibretroDroidVariable(it) } ?: listOf()
?.mapNotNull {
val coreOptionResult =
runCatching {
CoreOption.fromLibretroDroidVariable(it)
}
coreOptionResult.getOrNull()
} ?: listOf()
}

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

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,22 @@ package com.swordfish.lemuroid.app.utils.android.settings
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.alorma.compose.settings.storage.disk.rememberPreferenceBooleanSettingState
import com.swordfish.lemuroid.app.utils.settings.rememberPreferenceIndexSettingState
import com.swordfish.lemuroid.app.utils.settings.rememberSafePreferenceBooleanSettingState
import com.swordfish.lemuroid.app.utils.settings.rememberSafePreferenceIndexSettingState
import com.swordfish.lemuroid.app.utils.settings.rememberSafePreferenceStringsSetSettingState
import com.swordfish.lemuroid.lib.preferences.SharedPreferencesHelper

@Composable
fun booleanPreferenceState(
id: Int,
default: Boolean,
) = rememberPreferenceBooleanSettingState(
key = stringResource(id = id),
defaultValue = default,
preferences = SharedPreferencesHelper.getSharedPreferences(LocalContext.current),
)
) = booleanPreferenceState(stringResource(id = id), default)

@Composable
fun booleanPreferenceState(
key: String,
default: Boolean,
) = rememberPreferenceBooleanSettingState(
) = rememberSafePreferenceBooleanSettingState(
key = key,
defaultValue = default,
preferences = SharedPreferencesHelper.getSharedPreferences(LocalContext.current),
Expand All @@ -39,9 +36,19 @@ fun indexPreferenceState(
key: String,
default: String,
values: List<String>,
) = rememberPreferenceIndexSettingState(
) = rememberSafePreferenceIndexSettingState(
key = key,
values = values,
defaultValue = default,
preferences = SharedPreferencesHelper.getSharedPreferences(LocalContext.current),
)

@Composable
fun stringsSetPreferenceState(
key: String,
default: Set<String>,
) = rememberSafePreferenceStringsSetSettingState(
key = key,
defaultValue = default,
preferences = SharedPreferencesHelper.getSharedPreferences(LocalContext.current),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.swordfish.lemuroid.app.utils.settings

import android.content.SharedPreferences
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import com.alorma.compose.settings.storage.base.SettingValueState

@Composable
fun rememberSafePreferenceBooleanSettingState(
key: String,
defaultValue: Boolean,
preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(LocalContext.current),
): SafeBooleanPreferenceSettingValueState {
return remember {
SafeBooleanPreferenceSettingValueState(
preferences = preferences,
key = key,
defaultValue = defaultValue,
)
}
}

class SafeBooleanPreferenceSettingValueState(
private val preferences: SharedPreferences,
val key: String,
val defaultValue: Boolean = false,
) : SettingValueState<Boolean> {
private var _value by mutableStateOf(preferences.safeGetBoolean(key, defaultValue))

override var value: Boolean
set(value) {
_value = value
preferences.edit { putBoolean(key, value) }
}
get() = _value

override fun reset() {
value = defaultValue
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,24 @@ import androidx.preference.PreferenceManager
import com.alorma.compose.settings.storage.base.SettingValueState

@Composable
fun rememberPreferenceIndexSettingState(
fun rememberSafePreferenceIndexSettingState(
key: String,
values: List<String>,
defaultValue: String,
preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(LocalContext.current),
): IndexPreferenceSettingValueState {
): SafeIndexPreferenceSettingValueState {
return remember {
IndexPreferenceSettingValueState(preferences, key, values, defaultValue)
SafeIndexPreferenceSettingValueState(preferences, key, values, defaultValue)
}
}

class IndexPreferenceSettingValueState(
class SafeIndexPreferenceSettingValueState(
private val preferences: SharedPreferences,
val key: String,
private val values: List<String>,
private val defaultValue: String,
) : SettingValueState<Int> {
private var _value by mutableStateOf(preferences.getString(key, defaultValue))
private var _value by mutableStateOf(preferences.safeGetString(key, defaultValue))

override var value: Int
set(index) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,22 @@ import androidx.preference.PreferenceManager
import com.alorma.compose.settings.storage.base.SettingValueState

@Composable
fun rememberPreferenceStringsSetSettingState(
fun rememberSafePreferenceStringsSetSettingState(
key: String,
defaultValue: Set<String>,
preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(LocalContext.current),
): StringsSetPreferenceSettingValueState {
): SafeStringsSetPreferenceSettingValueState {
return remember {
StringsSetPreferenceSettingValueState(preferences, key, defaultValue)
SafeStringsSetPreferenceSettingValueState(preferences, key, defaultValue)
}
}

class StringsSetPreferenceSettingValueState(
class SafeStringsSetPreferenceSettingValueState(
private val preferences: SharedPreferences,
val key: String,
private val defaultValue: Set<String>,
) : SettingValueState<Set<String>> {
private var _value by mutableStateOf(preferences.getStringSet(key, defaultValue)!!)
private var _value by mutableStateOf(preferences.safeGetStringSet(key, defaultValue)!!)

override var value: Set<String>
set(index) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.swordfish.lemuroid.app.utils.settings

import android.content.SharedPreferences

fun SharedPreferences.safeGetString(
key: String,
defValue: String?,
): String? {
val result = runCatching { getString(key, defValue) }
return result.getOrDefault(defValue)
}

fun SharedPreferences.safeGetBoolean(
key: String,
defValue: Boolean,
): Boolean {
val result = runCatching { getBoolean(key, defValue) }
return result.getOrDefault(defValue)
}

fun SharedPreferences.safeGetStringSet(
key: String,
defValue: Set<String>?,
): Set<String>? {
val result = runCatching { getStringSet(key, defValue) }
return result.getOrDefault(defValue)
}

0 comments on commit aadde1a

Please sign in to comment.