Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 73628c1e authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé Committed by GitHub
Browse files

Merge pull request #8813 from wmontwe/add-settings-change-notifier

Add settings change notifier
parents 0065813c 84c7678a
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
package com.fsck.k9.preferences

import app.k9mail.legacy.account.AccountManager
import app.k9mail.legacy.preferences.DefaultSettingsChangeBroker
import app.k9mail.legacy.preferences.GeneralSettingsManager
import app.k9mail.legacy.preferences.SettingsChangeBroker
import app.k9mail.legacy.preferences.SettingsChangePublisher
import com.fsck.k9.Preferences
import org.koin.core.qualifier.named
import org.koin.dsl.bind
import org.koin.dsl.binds
import org.koin.dsl.module

val preferencesModule = module {
@@ -24,12 +28,14 @@ val preferencesModule = module {
        RealGeneralSettingsManager(
            preferences = get(),
            coroutineScope = get(named("AppCoroutineScope")),
            changePublisher = get(),
        )
    } bind GeneralSettingsManager::class
    single {
        RealDrawerConfigManager(
            preferences = get(),
            coroutineScope = get(named("AppCoroutineScope")),
            changeBroker = get(),
        )
    } bind DrawerConfigManager::class

@@ -77,4 +83,7 @@ val preferencesModule = module {
            unifiedInboxConfigurator = get(),
        )
    }

    single { DefaultSettingsChangeBroker() }
        .binds(arrayOf(SettingsChangePublisher::class, SettingsChangeBroker::class))
}
+33 −8
Original line number Diff line number Diff line
package com.fsck.k9.preferences

import app.k9mail.feature.navigation.drawer.NavigationDrawerExternalContract.DrawerConfig
import app.k9mail.legacy.preferences.SettingsChangeBroker
import app.k9mail.legacy.preferences.SettingsChangeSubscriber
import com.fsck.k9.K9
import com.fsck.k9.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch

internal class RealDrawerConfigManager(
    private val preferences: Preferences,
    private val coroutineScope: CoroutineScope,
    private val changeBroker: SettingsChangeBroker,
) : DrawerConfigManager {
    private val drawerConfigFlow = MutableSharedFlow<DrawerConfig>(replay = 1)
    private var drawerConfig: DrawerConfig? = null

    init {
        coroutineScope.launch {
            asSettingsFlow().collect { config ->
                drawerConfigFlow.emit(config)
            }
        }
    }

    override fun save(config: DrawerConfig) {
        saveDrawerConfig(config)
@@ -22,15 +34,11 @@ internal class RealDrawerConfigManager(
    }

    private fun loadDrawerConfig(): DrawerConfig {
        val drawerConfig = DrawerConfig(
        return DrawerConfig(
            showAccountSelector = K9.isShowAccountSelector,
            showStarredCount = K9.isShowStarredCount,
            showUnifiedFolders = K9.isShowUnifiedInbox,
        )

        updateDrawerConfigFlow(drawerConfig)

        return drawerConfig
    }

    private fun updateDrawerConfigFlow(config: DrawerConfig) {
@@ -41,14 +49,31 @@ internal class RealDrawerConfigManager(

    @Synchronized
    override fun getConfig(): DrawerConfig {
        return drawerConfig ?: loadDrawerConfig().also { drawerConfig = it }
        return loadDrawerConfig().also {
            updateDrawerConfigFlow(it)
        }
    }

    override fun getConfigFlow(): Flow<DrawerConfig> {
        getConfig()
        return drawerConfigFlow.distinctUntilChanged()
    }

    private fun asSettingsFlow(): Flow<DrawerConfig> {
        return callbackFlow {
            send(loadDrawerConfig())

            val subscriber = SettingsChangeSubscriber {
                drawerConfigFlow.tryEmit(loadDrawerConfig())
            }

            changeBroker.subscribe(subscriber)

            awaitClose {
                changeBroker.unsubscribe(subscriber)
            }
        }
    }

    @Synchronized
    private fun saveDrawerConfig(config: DrawerConfig) {
        val editor = preferences.createStorageEditor()
+4 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import app.k9mail.legacy.preferences.AppTheme
import app.k9mail.legacy.preferences.BackgroundSync
import app.k9mail.legacy.preferences.GeneralSettings
import app.k9mail.legacy.preferences.GeneralSettingsManager
import app.k9mail.legacy.preferences.SettingsChangePublisher
import app.k9mail.legacy.preferences.SubTheme
import com.fsck.k9.K9
import com.fsck.k9.Preferences
@@ -30,6 +31,7 @@ import timber.log.Timber
internal class RealGeneralSettingsManager(
    private val preferences: Preferences,
    private val coroutineScope: CoroutineScope,
    private val changePublisher: SettingsChangePublisher,
    private val backgroundDispatcher: CoroutineDispatcher = Dispatchers.IO,
) : GeneralSettingsManager {
    private val settingsFlow = MutableSharedFlow<GeneralSettings>(replay = 1)
@@ -88,6 +90,8 @@ internal class RealGeneralSettingsManager(
        K9.save(editor)
        writeSettings(editor, settings)
        editor.commit()

        changePublisher.publish()
    }

    @Synchronized
+28 −0
Original line number Diff line number Diff line
package app.k9mail.legacy.preferences

class DefaultSettingsChangeBroker(
    private val subscribers: MutableSet<SettingsChangeSubscriber> = mutableSetOf(),
) : SettingsChangeBroker, SettingsChangePublisher {

    private val lock = Any()

    override fun subscribe(subscriber: SettingsChangeSubscriber) {
        synchronized(lock) {
            subscribers.add(subscriber)
        }
    }

    override fun unsubscribe(subscriber: SettingsChangeSubscriber) {
        synchronized(lock) {
            subscribers.remove(subscriber)
        }
    }

    override fun publish() {
        val currentSubscribers = synchronized(lock) { HashSet(subscribers) }

        for (subscriber in currentSubscribers) {
            subscriber.receive()
        }
    }
}
+22 −0
Original line number Diff line number Diff line
package app.k9mail.legacy.preferences

/**
 * Broker to manage subscribers and notify them about changes in the settings, when the
 * [SettingsChangePublisher] publishes a change.
 */
interface SettingsChangeBroker {

    /**
     * Subscribe to settings changes.
     *
     * @param subscriber The subscriber to be notified about settings changes.
     */
    fun subscribe(subscriber: SettingsChangeSubscriber)

    /**
     * Unsubscribe from settings changes.
     *
     * @param subscriber The subscriber that no longer wants to be notified about settings changes.
     */
    fun unsubscribe(subscriber: SettingsChangeSubscriber)
}
Loading