diff --git a/app/src/main/java/de/jeanlucmakiola/clockula/data/prefs/SettingsPrefs.kt b/app/src/main/java/de/jeanlucmakiola/clockula/data/prefs/SettingsPrefs.kt index 40d73de..b76785b 100644 --- a/app/src/main/java/de/jeanlucmakiola/clockula/data/prefs/SettingsPrefs.kt +++ b/app/src/main/java/de/jeanlucmakiola/clockula/data/prefs/SettingsPrefs.kt @@ -1,12 +1,7 @@ package de.jeanlucmakiola.clockula.data.prefs -import androidx.datastore.preferences.core.MutablePreferences -import androidx.datastore.preferences.core.booleanPreferencesKey -import androidx.datastore.preferences.core.intPreferencesKey -import androidx.datastore.preferences.core.stringPreferencesKey import de.jeanlucmakiola.clockula.domain.ClockDefaults import de.jeanlucmakiola.clockula.domain.DismissChallenge -import de.jeanlucmakiola.clockula.domain.Zones import de.jeanlucmakiola.clockula.domain.backup.BackupSettings import de.jeanlucmakiola.clockula.domain.timer.TimerPresets import de.jeanlucmakiola.floret.prefs.Appearance @@ -14,6 +9,7 @@ import de.jeanlucmakiola.floret.prefs.AppearancePrefs import de.jeanlucmakiola.floret.prefs.PrefStore import de.jeanlucmakiola.floret.prefs.ThemeMode import de.jeanlucmakiola.floret.prefs.appearance +import de.jeanlucmakiola.floret.prefs.set import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged @@ -79,31 +75,27 @@ class SettingsPrefs @Inject constructor(private val store: PrefStore) { suspend fun currentDefaults(): ClockDefaults = defaults.first() - /** Restore every backed-up preference in one DataStore transaction. */ + /** + * Restore every backed-up preference in one DataStore transaction, each + * through its own [de.jeanlucmakiola.floret.prefs.Pref], so a restored value + * is clamped and encoded exactly as its setter would store it. + */ suspend fun applyBackup(backup: BackupSettings) { store.edit { prefs -> - // PrefStore's multi-key edit is public, while Pref.write belongs to - // floret-kit. Use the same named keys and normalisation as the - // individual ClockPrefs/TimerPrefs setters in this one transaction. - prefs[stringPreferencesKey(AppearancePrefs.themeMode.name)] = backup.themeMode.name - prefs[booleanPreferencesKey(AppearancePrefs.dynamicColor.name)] = backup.dynamicColor - prefs[intPreferencesKey(ClockPrefs.snoozeMinutes.name)] = backup.defaults.snoozeMinutes.coerceIn(1..60) - prefs[intPreferencesKey(ClockPrefs.snoozeLimit.name)] = backup.defaults.snoozeLimit.coerceIn(0..10) - prefs[booleanPreferencesKey(ClockPrefs.vibrate.name)] = backup.defaults.vibrate - prefs[intPreferencesKey(ClockPrefs.volumeRampSeconds.name)] = backup.defaults.volumeRampSeconds.coerceIn(0..60) - prefs.setNullable(ClockPrefs.alarmRingtoneUri.name, backup.defaults.alarmRingtoneUri?.trim()?.takeIf(String::isNotEmpty)) - prefs.setNullable(ClockPrefs.timerRingtoneUri.name, backup.defaults.timerRingtoneUri?.trim()?.takeIf(String::isNotEmpty)) - prefs[stringPreferencesKey(ClockPrefs.dismissChallenge.name)] = backup.defaults.dismissChallenge.name - prefs.setNullable(ClockPrefs.homeZoneId.name, backup.defaults.homeZoneId?.let(Zones::normalise)) - prefs[stringPreferencesKey(TimerPrefs.presets.name)] = TimerPresets.encode(TimerPresets.sanitise(backup.timerPresets)) + prefs[AppearancePrefs.themeMode] = backup.themeMode + prefs[AppearancePrefs.dynamicColor] = backup.dynamicColor + prefs[ClockPrefs.snoozeMinutes] = backup.defaults.snoozeMinutes + prefs[ClockPrefs.snoozeLimit] = backup.defaults.snoozeLimit + prefs[ClockPrefs.vibrate] = backup.defaults.vibrate + prefs[ClockPrefs.volumeRampSeconds] = backup.defaults.volumeRampSeconds + prefs[ClockPrefs.alarmRingtoneUri] = backup.defaults.alarmRingtoneUri + prefs[ClockPrefs.timerRingtoneUri] = backup.defaults.timerRingtoneUri + prefs[ClockPrefs.dismissChallenge] = backup.defaults.dismissChallenge + prefs[ClockPrefs.homeZoneId] = backup.defaults.homeZoneId + prefs[TimerPrefs.presets] = backup.timerPresets } } - private fun MutablePreferences.setNullable(name: String, value: String?) { - val key = stringPreferencesKey(name) - if (value == null) remove(key) else this[key] = value - } - suspend fun setSnoozeMinutes(minutes: Int) = store.set(ClockPrefs.snoozeMinutes, minutes) suspend fun setSnoozeLimit(limit: Int) = store.set(ClockPrefs.snoozeLimit, limit) diff --git a/app/src/test/java/de/jeanlucmakiola/clockula/data/prefs/SettingsPrefsTest.kt b/app/src/test/java/de/jeanlucmakiola/clockula/data/prefs/SettingsPrefsTest.kt index f3040a9..71ead3e 100644 --- a/app/src/test/java/de/jeanlucmakiola/clockula/data/prefs/SettingsPrefsTest.kt +++ b/app/src/test/java/de/jeanlucmakiola/clockula/data/prefs/SettingsPrefsTest.kt @@ -74,7 +74,7 @@ class SettingsPrefsTest { BackupSettings( themeMode = ThemeMode.DARK, dynamicColor = false, - defaults = ClockDefaults(snoozeMinutes = 99, volumeRampSeconds = 99), + defaults = ClockDefaults(snoozeMinutes = 99, volumeRampSeconds = 99, alarmRingtoneUri = " "), timerPresets = listOf(5.minutes, 1.minutes, 5.minutes), ), ) @@ -83,6 +83,7 @@ class SettingsPrefsTest { assertThat(prefs.dynamicColor.first()).isFalse() assertThat(prefs.currentDefaults().snoozeMinutes).isEqualTo(60) assertThat(prefs.currentDefaults().volumeRampSeconds).isEqualTo(60) + assertThat(prefs.currentDefaults().alarmRingtoneUri).isNull() assertThat(prefs.timerPresets.first()).containsExactly(1.minutes, 5.minutes).inOrder() } diff --git a/floret-kit b/floret-kit index 8b33635..5561dd4 160000 --- a/floret-kit +++ b/floret-kit @@ -1 +1 @@ -Subproject commit 8b33635a852d404cd72d2483dd5bdc4926f13276 +Subproject commit 5561dd43f42dcebd7260d39b4becccde797cc451