diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSource.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSource.kt index c958535e24..a7b1af1cdc 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSource.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSource.kt @@ -9,15 +9,20 @@ import kotlinx.coroutines.flow.Flow */ interface SettingsDiskSource { + /** + * The currently persisted app language (or `null` if not set). + */ + var appLanguage: AppLanguage? + /** * The currently persisted setting for getting login item icons (or `null` if not set). */ var isIconLoadingDisabled: Boolean? /** - * The currently persisted app language (or `null` if not set). + * Emits updates that track [isIconLoadingDisabled]. */ - var appLanguage: AppLanguage? + val isIconLoadingDisabledFlow: Flow /** * Clears all the settings data for the given user. diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceImpl.kt index d6edc33c81..e86c4c636c 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/disk/SettingsDiskSourceImpl.kt @@ -32,6 +32,9 @@ class SettingsDiskSourceImpl( private val mutablePullToRefreshEnabledFlowMap = mutableMapOf>() + private val mutableIsIconLoadingDisabledFlow = + bufferedMutableSharedFlow() + override var appLanguage: AppLanguage? get() = getString(key = APP_LANGUAGE_KEY) ?.let { storedValue -> @@ -47,12 +50,14 @@ class SettingsDiskSourceImpl( override var isIconLoadingDisabled: Boolean? get() = getBoolean(key = DISABLE_ICON_LOADING_KEY) set(value) { - putBoolean( - key = DISABLE_ICON_LOADING_KEY, - value = value, - ) + putBoolean(key = DISABLE_ICON_LOADING_KEY, value = value) + mutableIsIconLoadingDisabledFlow.tryEmit(value) } + override val isIconLoadingDisabledFlow: Flow + get() = mutableIsIconLoadingDisabledFlow + .onSubscription { emit(getBoolean(DISABLE_ICON_LOADING_KEY)) } + override fun clearData(userId: String) { storeVaultTimeoutInMinutes(userId = userId, vaultTimeoutInMinutes = null) storeVaultTimeoutAction(userId = userId, vaultTimeoutAction = null) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepository.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepository.kt index d99be678f4..3a61c1213a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepository.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepository.kt @@ -3,11 +3,13 @@ package com.x8bit.bitwarden.data.platform.repository import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction import com.x8bit.bitwarden.ui.platform.feature.settings.appearance.model.AppLanguage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow /** * Provides an API for observing and modifying settings state. */ +@Suppress("TooManyFunctions") interface SettingsRepository { /** * The [AppLanguage] for the current user. @@ -15,10 +17,15 @@ interface SettingsRepository { var appLanguage: AppLanguage /** - * Is icon loading for login items disabled. + * The current setting for getting login item icons. */ var isIconLoadingDisabled: Boolean + /** + * Emits updates that track the [isIconLoadingDisabled] value. + */ + val isIconLoadingDisabledFlow: Flow + /** * The [VaultTimeout] for the current user. */ diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt index f82c872e9c..b236efb23d 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.stateIn /** * Primary implementation of [SettingsRepository]. */ +@Suppress("TooManyFunctions") class SettingsRepositoryImpl( private val authDiskSource: AuthDiskSource, private val settingsDiskSource: SettingsDiskSource, @@ -37,6 +38,18 @@ class SettingsRepositoryImpl( settingsDiskSource.isIconLoadingDisabled = value } + override val isIconLoadingDisabledFlow: StateFlow + get() = settingsDiskSource + .isIconLoadingDisabledFlow + .map { it ?: false } + .stateIn( + scope = unconfinedScope, + started = SharingStarted.Eagerly, + initialValue = settingsDiskSource + .isIconLoadingDisabled + ?: false, + ) + override var vaultTimeout: VaultTimeout get() = activeUserId ?.let { diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeSettingsDiskSource.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeSettingsDiskSource.kt index d4a3a153b7..4ff9679cec 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeSettingsDiskSource.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/disk/util/FakeSettingsDiskSource.kt @@ -22,14 +22,29 @@ class FakeSettingsDiskSource : SettingsDiskSource { private val mutablePullToRefreshEnabledFlowMap = mutableMapOf>() + private val mutableIsIconLoadingDisabled = + bufferedMutableSharedFlow() + private val storedVaultTimeoutActions = mutableMapOf() private val storedVaultTimeoutInMinutes = mutableMapOf() private val storedPullToRefreshEnabled = mutableMapOf() + private var storedIsIconLoadingDisabled: Boolean? = null + override var appLanguage: AppLanguage? = null - override var isIconLoadingDisabled: Boolean? = null + override var isIconLoadingDisabled: Boolean? + get() = storedIsIconLoadingDisabled + set(value) { + storedIsIconLoadingDisabled = value + mutableIsIconLoadingDisabled.tryEmit(value) + } + + override val isIconLoadingDisabledFlow: Flow + get() = mutableIsIconLoadingDisabled.onSubscription { + emit(isIconLoadingDisabled) + } override fun clearData(userId: String) { storedVaultTimeoutActions.remove(userId)