From 217ceff9f709f5c2c09b79d6cc1855d3fb0e91cb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 23 Apr 2024 11:51:13 +0200 Subject: [PATCH] Handle properly the migration of DefaultSessionPreferencesStore #2742 --- .../store/DefaultSessionPreferencesStore.kt | 15 ++++--- .../store/SessionPreferencesStoreMigration.kt | 39 +++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/SessionPreferencesStoreMigration.kt diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt index 770ca699fe..05bbe9c048 100644 --- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStore.kt @@ -29,9 +29,7 @@ import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.core.SessionId import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map -import kotlinx.coroutines.runBlocking import java.io.File class DefaultSessionPreferencesStore( @@ -53,7 +51,15 @@ class DefaultSessionPreferencesStore( private val renderTypingNotificationsKey = booleanPreferencesKey("renderTypingNotifications") private val dataStoreFile = storeFile(context, sessionId) - private val store = PreferenceDataStoreFactory.create(scope = sessionCoroutineScope) { dataStoreFile } + private val store = PreferenceDataStoreFactory.create( + scope = sessionCoroutineScope, + migrations = listOf( + SessionPreferencesStoreMigration( + sharePresenceKey, + sendPublicReadReceiptsKey, + ) + ), + ) { dataStoreFile } override suspend fun setSharePresence(enabled: Boolean) { update(sharePresenceKey, enabled) @@ -65,8 +71,7 @@ class DefaultSessionPreferencesStore( } override fun isSharePresenceEnabled(): Flow { - // Migration, if sendPublicReadReceiptsKey was false, consider that sharing presence is false. - return get(sharePresenceKey) { runBlocking { isSendPublicReadReceiptsEnabled().first() } } + return get(sharePresenceKey) { true } } override suspend fun setSendPublicReadReceipts(enabled: Boolean) = update(sendPublicReadReceiptsKey, enabled) diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/SessionPreferencesStoreMigration.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/SessionPreferencesStoreMigration.kt new file mode 100644 index 0000000000..037eb5ae0c --- /dev/null +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/SessionPreferencesStoreMigration.kt @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.preferences.impl.store + +import androidx.datastore.core.DataMigration +import androidx.datastore.preferences.core.Preferences + +class SessionPreferencesStoreMigration( + private val sharePresenceKey: Preferences.Key, + private val sendPublicReadReceiptsKey: Preferences.Key, +) : DataMigration { + override suspend fun cleanUp() = Unit + + override suspend fun shouldMigrate(currentData: Preferences): Boolean { + return currentData[sharePresenceKey] == null + } + + override suspend fun migrate(currentData: Preferences): Preferences { + // If sendPublicReadReceiptsKey was false, consider that sharing presence is false. + val defaultValue = currentData[sendPublicReadReceiptsKey] ?: true + return currentData.toMutablePreferences().apply { + set(sharePresenceKey, defaultValue) + }.toPreferences() + } +}