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

Commit 836e8703 authored by cketti's avatar cketti
Browse files

Add `CombinedSettingsUpgrader`

This allows an upgrader access to all settings of an account (account settings, server settings, folder settings, identity settings).
parent d83e2d19
Loading
Loading
Loading
Loading
+43 −8
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ internal class AccountSettingsUpgrader(
    private val latestVersion: Int = Settings.VERSION,
    private val settingsDescriptions: SettingsDescriptions = AccountSettingsDescriptions.SETTINGS,
    private val upgraders: Map<Int, SettingsUpgrader> = AccountSettingsDescriptions.UPGRADERS,
    private val combinedUpgraders: Map<Int, CombinedSettingsUpgraderFactory> = CombinedSettingsUpgraders.UPGRADERS,
) {

    fun upgrade(contentVersion: Int, account: ValidatedSettings.Account): ValidatedSettings.Account {
@@ -14,37 +15,71 @@ internal class AccountSettingsUpgrader(
            return account
        }

        val relevantCombinedUpgraderVersions = combinedUpgraders.keys.asSequence()
            .filter { it > contentVersion }
            .toSortedSet()

        var currentAccount = account
        var currentVersion = contentVersion
        for (version in relevantCombinedUpgraderVersions) {
            val toVersion = version - 1
            currentAccount = upgradeToVersion(toVersion, currentVersion, currentAccount)

            val combinedUpgrader = combinedUpgraders[version]!!.invoke()
            currentAccount = combinedUpgrader.upgrade(currentAccount)

            currentAccount = upgradeToVersion(version, toVersion, currentAccount)
            currentVersion = version
        }

        return upgradeToVersion(toVersion = latestVersion, contentVersion = currentVersion, currentAccount)
    }

    private fun upgradeToVersion(
        toVersion: Int,
        contentVersion: Int,
        account: ValidatedSettings.Account,
    ): ValidatedSettings.Account {
        return account.copy(
            settings = upgradeAccountSettings(contentVersion, account.settings),
            incoming = serverSettingsUpgrader.upgrade(contentVersion, account.incoming),
            outgoing = serverSettingsUpgrader.upgrade(contentVersion, account.outgoing),
            identities = upgradeIdentities(contentVersion, account.identities),
            folders = upgradeFolders(contentVersion, account.folders),
            settings = upgradeAccountSettings(toVersion, contentVersion, account.settings),
            incoming = serverSettingsUpgrader.upgrade(toVersion, contentVersion, account.incoming),
            outgoing = serverSettingsUpgrader.upgrade(toVersion, contentVersion, account.outgoing),
            identities = upgradeIdentities(toVersion, contentVersion, account.identities),
            folders = upgradeFolders(toVersion, contentVersion, account.folders),
        )
    }

    private fun upgradeAccountSettings(
        toVersion: Int,
        contentVersion: Int,
        settings: InternalSettingsMap,
    ): InternalSettingsMap {
        return SettingsUpgradeHelper.upgrade(contentVersion, upgraders, settingsDescriptions, settings)
        return SettingsUpgradeHelper.upgradeToVersion(
            toVersion,
            contentVersion,
            upgraders,
            settingsDescriptions,
            settings,
        )
    }

    private fun upgradeIdentities(
        toVersion: Int,
        contentVersion: Int,
        identities: List<ValidatedSettings.Identity>,
    ): List<ValidatedSettings.Identity> {
        return identities.map { identity ->
            identitySettingsUpgrader.upgrade(contentVersion, identity)
            identitySettingsUpgrader.upgrade(toVersion, contentVersion, identity)
        }
    }

    private fun upgradeFolders(
        toVersion: Int,
        contentVersion: Int,
        folders: List<ValidatedSettings.Folder>,
    ): List<ValidatedSettings.Folder> {
        return folders.map { folder ->
            folderSettingsUpgrader.upgrade(contentVersion, folder)
            folderSettingsUpgrader.upgrade(toVersion, contentVersion, folder)
        }
    }
}
+5 −0
Original line number Diff line number Diff line
package com.fsck.k9.preferences

fun interface CombinedSettingsUpgrader {
    fun upgrade(account: ValidatedSettings.Account): ValidatedSettings.Account
}
+7 −0
Original line number Diff line number Diff line
package com.fsck.k9.preferences

internal typealias CombinedSettingsUpgraderFactory = () -> CombinedSettingsUpgrader

internal object CombinedSettingsUpgraders {
    val UPGRADERS = emptyMap<Int, CombinedSettingsUpgraderFactory>()
}
+4 −4
Original line number Diff line number Diff line
package com.fsck.k9.preferences

internal class FolderSettingsUpgrader(
    private val latestVersion: Int = Settings.VERSION,
    private val settingsDescriptions: SettingsDescriptions = FolderSettingsDescriptions.SETTINGS,
    private val upgraders: Map<Int, SettingsUpgrader> = FolderSettingsDescriptions.UPGRADERS,
) {
    fun upgrade(contentVersion: Int, folder: ValidatedSettings.Folder): ValidatedSettings.Folder {
        if (contentVersion == latestVersion) {
    fun upgrade(targetVersion: Int, contentVersion: Int, folder: ValidatedSettings.Folder): ValidatedSettings.Folder {
        if (contentVersion == targetVersion) {
            return folder
        }

        val upgradedSettings = SettingsUpgradeHelper.upgrade(
        val upgradedSettings = SettingsUpgradeHelper.upgradeToVersion(
            targetVersion,
            contentVersion,
            upgraders,
            settingsDescriptions,
+8 −4
Original line number Diff line number Diff line
package com.fsck.k9.preferences

internal class IdentitySettingsUpgrader(
    private val latestVersion: Int = Settings.VERSION,
    private val settingsDescriptions: SettingsDescriptions = IdentitySettingsDescriptions.SETTINGS,
    private val upgraders: Map<Int, SettingsUpgrader> = IdentitySettingsDescriptions.UPGRADERS,
) {
    fun upgrade(contentVersion: Int, identity: ValidatedSettings.Identity): ValidatedSettings.Identity {
        if (contentVersion == latestVersion) {
    fun upgrade(
        targetVersion: Int,
        contentVersion: Int,
        identity: ValidatedSettings.Identity,
    ): ValidatedSettings.Identity {
        if (contentVersion == targetVersion) {
            return identity
        }

        val upgradedSettings = SettingsUpgradeHelper.upgrade(
        val upgradedSettings = SettingsUpgradeHelper.upgradeToVersion(
            targetVersion,
            contentVersion,
            upgraders,
            settingsDescriptions,
Loading