From 6b507e0b02a0e9eb5f06f2b48af44f05f55afb75 Mon Sep 17 00:00:00 2001 From: shamim-emon Date: Mon, 1 Dec 2025 02:32:13 +0600 Subject: [PATCH 1/2] refactor: injected StoragePersister in PreferenceManager implementation --- ...efaultDebuggingSettingsPreferenceManager.kt | 5 ++++- ...aultDisplayCoreSettingsPreferenceManager.kt | 5 ++++- ...ultDisplayInboxSettingsPreferenceManager.kt | 5 ++++- ...aultDisplayMiscSettingsPreferenceManager.kt | 5 ++++- ...ltDisplayVisualSettingsPreferenceManager.kt | 5 ++++- ...aultInteractionSettingsPreferenceManager.kt | 6 +++++- .../DefaultNetworkSettingsPreferenceManager.kt | 5 ++++- .../DefaultNotificationPreferenceManager.kt | 5 ++++- .../DefaultPrivacySettingsPreferenceManager.kt | 5 ++++- .../java/com/fsck/k9/preferences/KoinModule.kt | 18 +++++++++--------- 10 files changed, 46 insertions(+), 18 deletions(-) diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/debugging/DefaultDebuggingSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/debugging/DefaultDebuggingSettingsPreferenceManager.kt index dec5ed7ef98..258a5ef6ab4 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/debugging/DefaultDebuggingSettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/debugging/DefaultDebuggingSettingsPreferenceManager.kt @@ -16,12 +16,13 @@ import net.thunderbird.core.logging.LogLevelManager import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister private const val TAG = "DefaultDebuggingSettingsPreferenceManager" class DefaultDebuggingSettingsPreferenceManager( private val logger: Logger, - private val storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val logLevelManager: LogLevelManager, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, @@ -30,6 +31,8 @@ class DefaultDebuggingSettingsPreferenceManager( ) : DebuggingSettingsPreferenceManager { private val configState: MutableStateFlow = MutableStateFlow(value = loadConfig()) private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() override fun getConfig(): DebuggingSettings = configState.value override fun getConfigFlow(): Flow = configState diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DefaultDisplayCoreSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DefaultDisplayCoreSettingsPreferenceManager.kt index 0bd2c3e4797..a8bcda29690 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DefaultDisplayCoreSettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/coreSettings/DefaultDisplayCoreSettingsPreferenceManager.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.sync.withLock import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister import net.thunderbird.core.preference.storage.getEnumOrDefault import net.thunderbird.core.preference.storage.putEnum @@ -20,7 +21,7 @@ private const val TAG = "DefaultDisplayCoreSettingsPreferenceManager" class DefaultDisplayCoreSettingsPreferenceManager( private val logger: Logger, - private val storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private var scope: CoroutineScope = CoroutineScope(SupervisorJob()), @@ -28,6 +29,8 @@ class DefaultDisplayCoreSettingsPreferenceManager( private val configState: MutableStateFlow = MutableStateFlow(value = loadConfig()) private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() override fun getConfig(): DisplayCoreSettings = configState.value diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DefaultDisplayInboxSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DefaultDisplayInboxSettingsPreferenceManager.kt index 525a1e04718..62ac95ceb8e 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DefaultDisplayInboxSettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/inboxSettings/DefaultDisplayInboxSettingsPreferenceManager.kt @@ -13,12 +13,13 @@ import kotlinx.coroutines.sync.withLock import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister private const val TAG = "DefaultDisplayInboxSettingsPreferenceManager" class DefaultDisplayInboxSettingsPreferenceManager( private val logger: Logger, - private val storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private var scope: CoroutineScope = CoroutineScope(SupervisorJob()), @@ -26,6 +27,8 @@ class DefaultDisplayInboxSettingsPreferenceManager( private val configState: MutableStateFlow = MutableStateFlow(value = loadConfig()) private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() override fun getConfig(): DisplayInboxSettings = configState.value diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/miscSettings/DefaultDisplayMiscSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/miscSettings/DefaultDisplayMiscSettingsPreferenceManager.kt index 95b67aa04cc..052d8e0b4a4 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/miscSettings/DefaultDisplayMiscSettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/miscSettings/DefaultDisplayMiscSettingsPreferenceManager.kt @@ -13,18 +13,21 @@ import kotlinx.coroutines.sync.withLock import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister private const val TAG = "DefaultDisplayMiscSettingsPreferenceManager" class DefaultDisplayMiscSettingsPreferenceManager( private val logger: Logger, - private val storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private var scope: CoroutineScope = CoroutineScope(SupervisorJob()), ) : DisplayMiscSettingsPreferenceManager { private val configState: MutableStateFlow = MutableStateFlow(value = loadConfig()) private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() override fun save(config: DisplayMiscSettings) { logger.debug(TAG) { "save() called with: config = $config" } writeConfig(config) diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/DefaultDisplayVisualSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/DefaultDisplayVisualSettingsPreferenceManager.kt index e3890d9f4d9..37a322ee604 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/DefaultDisplayVisualSettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/DefaultDisplayVisualSettingsPreferenceManager.kt @@ -18,6 +18,7 @@ import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.display.visualSettings.message.list.MessageListPreferencesManager import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister import net.thunderbird.core.preference.storage.getEnumOrDefault import net.thunderbird.core.preference.storage.putEnum @@ -25,7 +26,7 @@ private const val TAG = "DefaultDisplayVisualSettingsPreferenceManager" class DefaultDisplayVisualSettingsPreferenceManager( private val logger: Logger, - private val storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val messageListPreferences: MessageListPreferencesManager, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, @@ -39,6 +40,8 @@ class DefaultDisplayVisualSettingsPreferenceManager( config.copy(messageListSettings = messageListConfig) }.stateIn(scope = scope, started = SharingStarted.Eagerly, initialValue = internalConfigState.value) private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() override fun save(config: DisplayVisualSettings) { logger.debug(TAG) { "save() called with: config = $config" } diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/interaction/DefaultInteractionSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/interaction/DefaultInteractionSettingsPreferenceManager.kt index 97d1c64517f..ff1b2620256 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/interaction/DefaultInteractionSettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/interaction/DefaultInteractionSettingsPreferenceManager.kt @@ -14,6 +14,7 @@ import net.thunderbird.core.common.action.SwipeActions import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister import net.thunderbird.core.preference.storage.getEnumOrDefault import net.thunderbird.core.preference.storage.putEnum @@ -21,7 +22,7 @@ private const val TAG = "DefaultInteractionSettingsPreferenceManager" class DefaultInteractionSettingsPreferenceManager( private val logger: Logger, - private val storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private var scope: CoroutineScope = CoroutineScope(SupervisorJob()), @@ -29,6 +30,9 @@ class DefaultInteractionSettingsPreferenceManager( private val configState: MutableStateFlow = MutableStateFlow(value = loadConfig()) private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() + override fun getConfig(): InteractionSettings = configState.value override fun getConfigFlow(): Flow = configState diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/network/DefaultNetworkSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/network/DefaultNetworkSettingsPreferenceManager.kt index 40984b16f01..2f47d06de08 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/network/DefaultNetworkSettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/network/DefaultNetworkSettingsPreferenceManager.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.sync.withLock import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister import net.thunderbird.core.preference.storage.getEnumOrDefault import net.thunderbird.core.preference.storage.putEnum @@ -20,13 +21,15 @@ private const val TAG = "DefaultNetworkSettingsPreferenceManager" class DefaultNetworkSettingsPreferenceManager( private val logger: Logger, - private val storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private var scope: CoroutineScope = CoroutineScope(SupervisorJob()), ) : NetworkSettingsPreferenceManager { private val configState: MutableStateFlow = MutableStateFlow(value = loadConfig()) private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() override fun getConfig(): NetworkSettings = configState.value override fun getConfigFlow(): Flow = configState diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/notification/DefaultNotificationPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/notification/DefaultNotificationPreferenceManager.kt index 96121c53ab3..f23e9694bd3 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/notification/DefaultNotificationPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/notification/DefaultNotificationPreferenceManager.kt @@ -13,17 +13,20 @@ import kotlinx.coroutines.sync.withLock import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister private const val TAG = "DefaultNotificationPreferenceManager" class DefaultNotificationPreferenceManager( private val logger: Logger, - storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private var scope: CoroutineScope = CoroutineScope(SupervisorJob()), ) : NotificationPreferenceManager { private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() private val configState = MutableStateFlow( value = NotificationPreference( isQuietTimeEnabled = storage.getBoolean( diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/privacy/DefaultPrivacySettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/privacy/DefaultPrivacySettingsPreferenceManager.kt index 689adf13e1f..51bbcd0c568 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/privacy/DefaultPrivacySettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/privacy/DefaultPrivacySettingsPreferenceManager.kt @@ -13,18 +13,21 @@ import kotlinx.coroutines.sync.withLock import net.thunderbird.core.logging.Logger import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor +import net.thunderbird.core.preference.storage.StoragePersister private const val TAG = "DefaultPrivacySettingsPreferenceManager" class DefaultPrivacySettingsPreferenceManager( private val logger: Logger, - private val storage: Storage, + private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private var scope: CoroutineScope = CoroutineScope(SupervisorJob()), ) : PrivacySettingsPreferenceManager { private val configState: MutableStateFlow = MutableStateFlow(value = loadConfig()) private val mutex = Mutex() + private val storage: Storage + get() = storagePersister.loadValues() override fun getConfig(): PrivacySettings = configState.value override fun getConfigFlow(): Flow = configState diff --git a/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt b/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt index 450f1ef2b3d..361304bec2d 100644 --- a/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt +++ b/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt @@ -52,35 +52,35 @@ val preferencesModule = module { single { DefaultPrivacySettingsPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), ) } single { DefaultNotificationPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), ) } single { DefaultDisplayCoreSettingsPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), ) } single { DefaultDisplayInboxSettingsPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), ) } single { DefaultDisplayVisualSettingsPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), messageListPreferences = get(), ) @@ -88,14 +88,14 @@ val preferencesModule = module { single { DefaultDisplayMiscSettingsPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), ) } single { DefaultInteractionSettingsPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), ) } @@ -118,14 +118,14 @@ val preferencesModule = module { single { DefaultNetworkSettingsPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), ) } single { DefaultDebuggingSettingsPreferenceManager( logger = get(), - storage = get().storage, + storagePersister = get(), storageEditor = get().createStorageEditor(), logLevelManager = get(), platformConfigProvider = get(), From 21dfb280db39090ec107f253a002befe4686f7af Mon Sep 17 00:00:00 2001 From: shamim-emon Date: Sat, 6 Dec 2025 01:22:50 +0600 Subject: [PATCH 2/2] fix: importing settings causes loss of the expected imported values --- ...DefaultDisplayVisualSettingsPreferenceManager.kt | 13 ++++++++++++- .../main/java/com/fsck/k9/preferences/KoinModule.kt | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/DefaultDisplayVisualSettingsPreferenceManager.kt b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/DefaultDisplayVisualSettingsPreferenceManager.kt index 37a322ee604..cbd2049ba38 100644 --- a/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/DefaultDisplayVisualSettingsPreferenceManager.kt +++ b/core/preference/impl/src/commonMain/kotlin/net/thunderbird/core/preference/display/visualSettings/DefaultDisplayVisualSettingsPreferenceManager.kt @@ -15,6 +15,8 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import net.thunderbird.core.logging.Logger +import net.thunderbird.core.preference.PreferenceChangeBroker +import net.thunderbird.core.preference.PreferenceChangeSubscriber import net.thunderbird.core.preference.display.visualSettings.message.list.MessageListPreferencesManager import net.thunderbird.core.preference.storage.Storage import net.thunderbird.core.preference.storage.StorageEditor @@ -28,10 +30,15 @@ class DefaultDisplayVisualSettingsPreferenceManager( private val logger: Logger, private val storagePersister: StoragePersister, private val storageEditor: StorageEditor, + preferenceChangeBroker: PreferenceChangeBroker, private val messageListPreferences: MessageListPreferencesManager, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, private val scope: CoroutineScope = CoroutineScope(SupervisorJob()), -) : DisplayVisualSettingsPreferenceManager { +) : DisplayVisualSettingsPreferenceManager, PreferenceChangeSubscriber { + + init { + preferenceChangeBroker.subscribe(this) + } private val internalConfigState = MutableStateFlow(value = loadConfig()) private val configState: StateFlow = combine( internalConfigState, @@ -95,4 +102,8 @@ class DefaultDisplayVisualSettingsPreferenceManager( override fun getConfig() = configState.value override fun getConfigFlow(): Flow = configState + + override fun receive() { + internalConfigState.update { loadConfig() } + } } diff --git a/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt b/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt index 361304bec2d..8a8eac287df 100644 --- a/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt +++ b/legacy/core/src/main/java/com/fsck/k9/preferences/KoinModule.kt @@ -83,6 +83,7 @@ val preferencesModule = module { storagePersister = get(), storageEditor = get().createStorageEditor(), messageListPreferences = get(), + preferenceChangeBroker = get(), ) } single {