diff --git a/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt b/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt index 822adcb61f..0831609e4f 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt +++ b/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt @@ -17,50 +17,62 @@ package im.vector.app.features.debug.features import android.content.Context -import android.content.SharedPreferences +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.MutablePreferences +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore import im.vector.app.features.DefaultVectorFeatures import im.vector.app.features.VectorFeatures +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.runBlocking import kotlin.reflect.KClass +private val Context.dataStore: DataStore by preferencesDataStore(name = "debug_features") + class DebugVectorFeatures( context: Context, private val vectorFeatures: DefaultVectorFeatures ) : VectorFeatures { - private val featurePrefs = context.getSharedPreferences("debug-features", Context.MODE_PRIVATE) + private val dataStore = context.dataStore override fun loginVersion(): VectorFeatures.LoginVersion { - return featurePrefs.readEnum() ?: vectorFeatures.loginVersion() + return readPreferences().getEnum() ?: vectorFeatures.loginVersion() } - fun > hasEnumOverride(type: KClass): Boolean { - return featurePrefs.containsEnum(type) - } + fun > hasEnumOverride(type: KClass) = readPreferences().containsEnum(type) fun > overrideEnum(value: T?, type: KClass) { if (value == null) { - featurePrefs.removeEnum(type) + updatePreferences { it.removeEnum(type) } } else { - featurePrefs.putEnum(value, type) + updatePreferences { it.putEnum(value, type) } } } + + private fun readPreferences() = runBlocking { dataStore.data.first() } + + private fun updatePreferences(block: (MutablePreferences) -> Unit) = runBlocking { + dataStore.edit { block(it) } + } } -private fun > SharedPreferences.removeEnum(type: KClass) { - edit().remove("enum-${type.simpleName}").apply() +private fun > MutablePreferences.removeEnum(type: KClass) { + remove(enumPreferencesKey(type)) } -private fun > SharedPreferences.containsEnum(type: KClass): Boolean { - return contains("enum-${type.simpleName}") +private fun > Preferences.containsEnum(type: KClass) = contains(enumPreferencesKey(type)) + +private fun > MutablePreferences.putEnum(value: T, type: KClass) { + this[enumPreferencesKey(type)] = value.name } -private inline fun > SharedPreferences.readEnum(): T? { - val value = T::class.simpleName - return getString("enum-$value", null)?.let { enumValueOf(it) } +private inline fun > Preferences.getEnum(): T? { + return get(enumPreferencesKey())?.let { enumValueOf(it) } } -private fun > SharedPreferences.putEnum(value: T, type: KClass) { - edit() - .putString("enum-${type.simpleName}", value.name) - .apply() -} +private inline fun > enumPreferencesKey() = enumPreferencesKey(T::class) + +private fun > enumPreferencesKey(type: KClass) = stringPreferencesKey("enum-${type.simpleName}")