From c0fdc36db416b12606f72897d99af654d1e6f1dd Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Tue, 1 Oct 2024 16:34:37 +0200 Subject: [PATCH] DROID-2731 Vault | Tech | Persist vault settings (#1609) --- .../core_models/settings/VaultSettings.kt | 7 +++ .../data/auth/repo/UserSettingsCache.kt | 7 +++ .../auth/repo/UserSettingsDataRepository.kt | 17 ++++++ .../domain/config/UserSettingsRepository.kt | 8 ++- .../persistence/preferences/Preferences.kt | 21 +++++++- .../repo/DefaultUserSettingsCache.kt | 54 +++++++++++++++++++ persistence/src/main/proto/preferences.proto | 9 ++++ 7 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 core-models/src/main/java/com/anytypeio/anytype/core_models/settings/VaultSettings.kt diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/settings/VaultSettings.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/settings/VaultSettings.kt new file mode 100644 index 0000000000..2bd686a851 --- /dev/null +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/settings/VaultSettings.kt @@ -0,0 +1,7 @@ +package com.anytypeio.anytype.core_models.settings + +import com.anytypeio.anytype.core_models.Id + +data class VaultSettings( + val orderOfSpaces: List = emptyList() +) \ No newline at end of file diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/UserSettingsCache.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/UserSettingsCache.kt index f69c8c102c..838c16113f 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/UserSettingsCache.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/UserSettingsCache.kt @@ -1,5 +1,6 @@ package com.anytypeio.anytype.data.auth.repo +import com.anytypeio.anytype.core_models.Account import com.anytypeio.anytype.core_models.GlobalSearchHistory import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.ThemeMode @@ -7,9 +8,15 @@ import com.anytypeio.anytype.core_models.Wallpaper import com.anytypeio.anytype.core_models.WidgetSession import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.core_models.primitives.TypeId +import com.anytypeio.anytype.core_models.settings.VaultSettings import kotlinx.coroutines.flow.Flow interface UserSettingsCache { + + suspend fun getVaultSettings(account: Account): VaultSettings + suspend fun observeVaultSettings(account: Account): Flow + suspend fun setVaultSpaceOrder(account: Account, order: List) + suspend fun setCurrentSpace(space: SpaceId) suspend fun getCurrentSpace(): SpaceId? suspend fun clearCurrentSpace() diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/UserSettingsDataRepository.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/UserSettingsDataRepository.kt index de08eb1456..b9f57d730a 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/UserSettingsDataRepository.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/UserSettingsDataRepository.kt @@ -1,5 +1,6 @@ package com.anytypeio.anytype.data.auth.repo +import com.anytypeio.anytype.core_models.Account import com.anytypeio.anytype.core_models.GlobalSearchHistory import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.ThemeMode @@ -7,6 +8,7 @@ import com.anytypeio.anytype.core_models.Wallpaper import com.anytypeio.anytype.core_models.WidgetSession import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.core_models.primitives.TypeId +import com.anytypeio.anytype.core_models.settings.VaultSettings import com.anytypeio.anytype.domain.config.UserSettingsRepository import kotlinx.coroutines.flow.Flow @@ -88,4 +90,19 @@ class UserSettingsDataRepository(private val cache: UserSettingsCache) : UserSet override suspend fun clearGlobalSearchHistory(space: SpaceId) { cache.clearGlobalSearchHistory(space) } + + override suspend fun getVaultSettings(account: Account): VaultSettings { + return cache.getVaultSettings(account) + } + + override suspend fun observeVaultSettings(account: Account): Flow { + return cache.observeVaultSettings(account) + } + + override suspend fun setVaultSpaceOrder(account: Account, order: List) { + cache.setVaultSpaceOrder( + account = account, + order = order + ) + } } \ No newline at end of file diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/config/UserSettingsRepository.kt b/domain/src/main/java/com/anytypeio/anytype/domain/config/UserSettingsRepository.kt index e901526158..2ce431160c 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/config/UserSettingsRepository.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/config/UserSettingsRepository.kt @@ -1,16 +1,22 @@ package com.anytypeio.anytype.domain.config -import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.Account import com.anytypeio.anytype.core_models.GlobalSearchHistory +import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.ThemeMode import com.anytypeio.anytype.core_models.Wallpaper import com.anytypeio.anytype.core_models.WidgetSession import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.core_models.primitives.TypeId +import com.anytypeio.anytype.core_models.settings.VaultSettings import kotlinx.coroutines.flow.Flow interface UserSettingsRepository { + suspend fun getVaultSettings(account: Account): VaultSettings + suspend fun observeVaultSettings(account: Account): Flow + suspend fun setVaultSpaceOrder(account: Account, order: List) + suspend fun setCurrentSpace(space: SpaceId) suspend fun getCurrentSpace(): SpaceId? suspend fun clearCurrentSpace() diff --git a/persistence/src/main/java/com/anytypeio/anytype/persistence/preferences/Preferences.kt b/persistence/src/main/java/com/anytypeio/anytype/persistence/preferences/Preferences.kt index b4b8ce3a89..9253716271 100644 --- a/persistence/src/main/java/com/anytypeio/anytype/persistence/preferences/Preferences.kt +++ b/persistence/src/main/java/com/anytypeio/anytype/persistence/preferences/Preferences.kt @@ -2,6 +2,7 @@ package com.anytypeio.anytype.persistence.preferences import androidx.datastore.core.Serializer import com.anytypeio.anytype.persistence.SpacePreferences +import com.anytypeio.anytype.persistence.VaultPreferences import java.io.InputStream import java.io.OutputStream @@ -20,4 +21,22 @@ object SpacePrefSerializer : Serializer { } } -const val SPACE_PREFERENCE_FILENAME = "space-preferences.pb" \ No newline at end of file +object VaultPrefsSerializer : Serializer { + override val defaultValue: VaultPreferences = VaultPreferences( + preferences = emptyMap() + ) + + override suspend fun readFrom(input: InputStream): VaultPreferences { + return VaultPreferences.ADAPTER.decode(input) + } + + override suspend fun writeTo(t: VaultPreferences, output: OutputStream) { + VaultPreferences.ADAPTER.encode( + stream = output, + value = t + ) + } +} + +const val SPACE_PREFERENCE_FILENAME = "space-preferences.pb" +const val VAULT_PREFERENCE_FILENAME = "vault-preferences.pb" \ No newline at end of file diff --git a/persistence/src/main/java/com/anytypeio/anytype/persistence/repo/DefaultUserSettingsCache.kt b/persistence/src/main/java/com/anytypeio/anytype/persistence/repo/DefaultUserSettingsCache.kt index 91fc408880..8d6285f985 100644 --- a/persistence/src/main/java/com/anytypeio/anytype/persistence/repo/DefaultUserSettingsCache.kt +++ b/persistence/src/main/java/com/anytypeio/anytype/persistence/repo/DefaultUserSettingsCache.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.SharedPreferences import androidx.datastore.core.DataStore import androidx.datastore.dataStore +import com.anytypeio.anytype.core_models.Account import com.anytypeio.anytype.core_models.GlobalSearchHistory import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.NO_VALUE @@ -12,10 +13,13 @@ import com.anytypeio.anytype.core_models.Wallpaper import com.anytypeio.anytype.core_models.WidgetSession import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.core_models.primitives.TypeId +import com.anytypeio.anytype.core_models.settings.VaultSettings import com.anytypeio.anytype.data.auth.repo.UserSettingsCache import com.anytypeio.anytype.persistence.GlobalSearchHistoryProto import com.anytypeio.anytype.persistence.SpacePreference import com.anytypeio.anytype.persistence.SpacePreferences +import com.anytypeio.anytype.persistence.VaultPreference +import com.anytypeio.anytype.persistence.VaultPreferences import com.anytypeio.anytype.persistence.common.JsonString import com.anytypeio.anytype.persistence.common.deserializeWallpaperSettings import com.anytypeio.anytype.persistence.common.serializeWallpaperSettings @@ -25,6 +29,8 @@ import com.anytypeio.anytype.persistence.model.asSettings import com.anytypeio.anytype.persistence.model.asWallpaper import com.anytypeio.anytype.persistence.preferences.SPACE_PREFERENCE_FILENAME import com.anytypeio.anytype.persistence.preferences.SpacePrefSerializer +import com.anytypeio.anytype.persistence.preferences.VAULT_PREFERENCE_FILENAME +import com.anytypeio.anytype.persistence.preferences.VaultPrefsSerializer import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map @@ -39,6 +45,11 @@ class DefaultUserSettingsCache( serializer = SpacePrefSerializer ) + private val Context.vaultPrefsStore: DataStore by dataStore( + fileName = VAULT_PREFERENCE_FILENAME, + serializer = VaultPrefsSerializer + ) + override suspend fun setCurrentSpace(space: SpaceId) { prefs.edit() .putString(CURRENT_SPACE_KEY, space.id) @@ -380,6 +391,49 @@ class DefaultUserSettingsCache( } } + override suspend fun getVaultSettings(account: Account): VaultSettings { + return context.vaultPrefsStore + .data + .map { prefs -> + VaultSettings( + orderOfSpaces = prefs.preferences.getOrDefault( + key = account.id, + defaultValue = VaultPreference() + ).orderOfSpaces + ) + } + .first() + } + + override suspend fun observeVaultSettings(account: Account): Flow { + return context.vaultPrefsStore + .data + .map { prefs -> + VaultSettings( + orderOfSpaces = prefs.preferences.getOrDefault( + key = account.id, + defaultValue = VaultPreference() + ).orderOfSpaces + ) + } + } + + override suspend fun setVaultSpaceOrder(account: Account, order: List) { + context.vaultPrefsStore.updateData { existingPreferences -> + val curr = existingPreferences.preferences.getOrDefault( + key = account.id, + defaultValue = VaultPreference() + ) + existingPreferences.copy( + preferences = existingPreferences.preferences + mapOf( + account.id to curr.copy( + orderOfSpaces = order + ) + ) + ) + } + } + companion object { const val CURRENT_SPACE_KEY = "prefs.user_settings.current_space" const val DEFAULT_OBJECT_TYPE_ID_KEY = "prefs.user_settings.default_object_type.id" diff --git a/persistence/src/main/proto/preferences.proto b/persistence/src/main/proto/preferences.proto index cfe1f585db..b5318784cf 100644 --- a/persistence/src/main/proto/preferences.proto +++ b/persistence/src/main/proto/preferences.proto @@ -8,6 +8,15 @@ message SpacePreferences { map preferences = 1; } +message VaultPreferences { + // maps account id to vault preference + map preferences = 1; +} + +message VaultPreference { + repeated string orderOfSpaces = 1; +} + message SpacePreference { optional string defaultObjectTypeKey = 1; repeated string pinnedObjectTypeIds = 2;