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

Unverified Commit 0a69c9d5 authored by Rafael Tonholo's avatar Rafael Tonholo
Browse files

refactor(storage): extract common `getEnum` logic in `K9`,...

refactor(storage): extract common `getEnum` logic in `K9`, `AccountPreferenceSerializer` and `RealGeneralSettings` to `Storage.getEnumOrDefault`
parent ce5fec09
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -77,3 +77,32 @@ interface Storage {
     */
    fun getStringOrNull(key: String): String?
}

/**
 * Returns the enum value for the given key, or the default value if the key is not found or the stored value
 * is not a valid enum constant.
 *
 * @param T The enum type.
 * @param key The key to look up.
 * @param default The default enum value to return if the key is not found or the value is invalid.
 * @return The enum value for the given key, or the default value.
 * @throws IllegalArgumentException if the stored string value does not match any of the enum constants.
 */
@Throws(IllegalArgumentException::class)
inline fun <reified T : Enum<T>> Storage.getEnumOrDefault(key: String, default: T): T =
    getStringOrNull(key)
        ?.let { value ->
            try {
                enumValueOf<T>(value)
            } catch (e: IllegalArgumentException) {
                throw IllegalArgumentException(
                    buildString {
                        append("Unable to convert stored key [$key] value [$value] ")
                        appendLine("to enum of type ${T::class.qualifiedName}.")
                        append("Valid values: ${enumValues<T>().joinToString()}")
                    },
                    e,
                )
            }
        }
        ?: default
+16 −19
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import net.thunderbird.core.android.account.QuoteStyle
import net.thunderbird.core.android.account.ShowPictures
import net.thunderbird.core.android.account.SortType
import net.thunderbird.core.preferences.Storage
import net.thunderbird.core.preferences.getEnumOrDefault
import net.thunderbird.feature.account.storage.legacy.ServerSettingsSerializer
import net.thunderbird.feature.mail.folder.api.SpecialFolderSelection
import net.thunderbird.feature.notification.NotificationLight
@@ -391,8 +392,11 @@ class AccountPreferenceSerializer(
        val accountUuid = account.uuid

        // Get the list of account UUIDs
        val uuids =
            storage.getStringOrDefault("accountUuids", "").split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
        val uuids = storage
            .getStringOrDefault("accountUuids", "")
            .split(",".toRegex())
            .dropLastWhile { it.isEmpty() }
            .toTypedArray()

        // Create a list of all account UUIDs excluding this account
        val newUuids = ArrayList<String>(uuids.size)
@@ -558,27 +562,20 @@ class AccountPreferenceSerializer(
        editor.putString("accountUuids", newAccountUuidsString)
    }

    private fun <T : Enum<T>> getEnumStringPref(storage: Storage, key: String, defaultEnum: T): T {
        val stringPref = storage.getStringOrNull(key)

        return if (stringPref == null) {
            defaultEnum
        } else {
            try {
                java.lang.Enum.valueOf<T>(defaultEnum.declaringJavaClass, stringPref)
    private inline fun <reified T : Enum<T>> getEnumStringPref(storage: Storage, key: String, defaultEnum: T): T {
        return try {
            storage.getEnumOrDefault<T>(key, defaultEnum)
        } catch (ex: IllegalArgumentException) {
            Timber.w(
                ex,
                    "Unable to convert preference key [%s] value [%s] to enum of type %s",
                "Unable to convert preference key [%s] to enum of type %s",
                key,
                    stringPref,
                defaultEnum.declaringJavaClass,
            )

            defaultEnum
        }
    }
    }

    companion object {
        const val ACCOUNT_DESCRIPTION_KEY = "description"
+3 −7
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ import net.thunderbird.core.android.account.SortType
import net.thunderbird.core.featureflag.FeatureFlagProvider
import net.thunderbird.core.featureflag.toFeatureFlagKey
import net.thunderbird.core.preferences.Storage
import net.thunderbird.core.preferences.getEnumOrDefault
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import timber.log.Timber
@@ -510,14 +511,9 @@ object K9 : KoinComponent {

    private inline fun <reified T : Enum<T>> Storage.getEnum(key: String, defaultValue: T): T {
        return try {
            val value = getStringOrNull(key)
            if (value != null) {
                enumValueOf(value)
            } else {
                defaultValue
            }
            getEnumOrDefault(key, defaultValue)
        } catch (e: Exception) {
            Timber.e("Couldn't read setting '%s'. Using default value instead.", key)
            Timber.e(e, "Couldn't read setting '%s'. Using default value instead.", key)
            defaultValue
        }
    }
+2 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ import net.thunderbird.core.preferences.GeneralSettingsManager
import net.thunderbird.core.preferences.SettingsChangePublisher
import net.thunderbird.core.preferences.Storage
import net.thunderbird.core.preferences.SubTheme
import net.thunderbird.core.preferences.getEnumOrDefault
import timber.log.Timber

/**
@@ -175,12 +176,7 @@ private fun K9.BACKGROUND_OPS.toBackgroundSync(): BackgroundSync {

private inline fun <reified T : Enum<T>> Storage.getEnum(key: String, defaultValue: T): T {
    return try {
        val value = getStringOrNull(key)
        if (value != null) {
            enumValueOf(value)
        } else {
            defaultValue
        }
        getEnumOrDefault(key, defaultValue)
    } catch (e: Exception) {
        Timber.e(e, "Couldn't read setting '%s'. Using default value instead.", key)
        defaultValue