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

Unverified Commit eff8b25a authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

Add AccountLoader

parent e9a73c90
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
package app.k9mail.feature.preview

import app.k9mail.core.common.oauth.OAuthConfigurationFactory
import app.k9mail.feature.account.common.AccountCommonExternalContract
import app.k9mail.feature.account.edit.AccountEditExternalContract
import app.k9mail.feature.account.setup.AccountSetupExternalContract
import app.k9mail.feature.account.setup.featureAccountSetupModule
@@ -23,6 +24,7 @@ val accountModule: Module = module {
    single { InMemoryAccountStore() }
        .binds(
            arrayOf(
                AccountCommonExternalContract.AccountLoader::class,
                AccountSetupExternalContract.AccountCreator::class,
                AccountEditExternalContract.AccountUpdater::class,
            ),
+23 −1
Original line number Diff line number Diff line
package app.k9mail.feature.preview.account

import app.k9mail.feature.account.common.AccountCommonExternalContract.AccountLoader
import app.k9mail.feature.account.common.domain.entity.Account
import app.k9mail.feature.account.common.domain.entity.AccountState
import app.k9mail.feature.account.common.domain.entity.AuthorizationState
import app.k9mail.feature.account.edit.AccountEditExternalContract.AccountUpdater
import app.k9mail.feature.account.edit.AccountEditExternalContract.AccountUpdater.AccountUpdaterResult
import app.k9mail.feature.account.setup.AccountSetupExternalContract.AccountCreator
@@ -8,7 +11,15 @@ import app.k9mail.feature.account.setup.AccountSetupExternalContract.AccountCrea

class InMemoryAccountStore(
    private val accountMap: MutableMap<String, Account> = mutableMapOf(),
) : AccountCreator, AccountUpdater {
) : AccountCreator, AccountUpdater, AccountLoader {

    suspend fun load(accountUuid: String): Account? {
        return accountMap[accountUuid]
    }

    override suspend fun loadAccount(accountUuid: String): AccountState? {
        return accountMap[accountUuid]?.let { mapToAccountState(it) }
    }

    override suspend fun createAccount(account: Account): AccountCreatorResult {
        accountMap[account.uuid] = account
@@ -25,4 +36,15 @@ class InMemoryAccountStore(
            AccountUpdaterResult.Success(account.uuid)
        }
    }

    private fun mapToAccountState(account: Account): AccountState {
        return AccountState(
            uuid = account.uuid,
            emailAddress = account.emailAddress,
            incomingServerSettings = account.incomingServerSettings,
            outgoingServerSettings = account.outgoingServerSettings,
            authorizationState = account.authorizationState?.let { AuthorizationState(it) },
            options = account.options,
        )
    }
}
+50 −0
Original line number Diff line number Diff line
package com.fsck.k9.account

import app.k9mail.feature.account.common.AccountCommonExternalContract
import app.k9mail.feature.account.common.domain.entity.Account
import app.k9mail.feature.account.common.domain.entity.AccountOptions
import com.fsck.k9.Preferences
import com.fsck.k9.logging.Timber
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import com.fsck.k9.Account as K9Account

class AccountLoader(
    private val preferences: Preferences,
    private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO,
) : AccountCommonExternalContract.AccountLoader {

    @Suppress("TooGenericExceptionCaught")
    override suspend fun loadAccount(accountUuid: String): AccountState? {
        return try {
            withContext(coroutineDispatcher) {
                load(accountUuid)
            }
        } catch (e: Exception) {
            Timber.e(e, "Error while loading account")

            null
        }
    }

        val existingAccount = preferences.getAccount(accountUuid)
    private fun load(accountUuid: String): AccountState? {

        return if (existingAccount != null) {
            mapToAccount(existingAccount)
        } else {
            null
        }
    }

    private fun mapToAccount(account: K9Account): AccountState {
        return AccountState(
            uuid = account.uuid,
            emailAddress = account.email,
            incomingServerSettings = account.incomingServerSettings,
            outgoingServerSettings = account.outgoingServerSettings,
            authorizationState = AuthorizationState(account.oAuthState),
        )
    }
}
+7 −0
Original line number Diff line number Diff line
package com.fsck.k9.account

import app.k9mail.feature.account.common.AccountCommonExternalContract
import app.k9mail.feature.account.edit.AccountEditExternalContract
import app.k9mail.feature.account.setup.AccountSetupExternalContract
import org.koin.android.ext.koin.androidApplication
@@ -21,6 +22,12 @@ val newAccountModule = module {
        )
    }

    factory<AccountCommonExternalContract.AccountLoader> {
        AccountLoader(
            preferences = get(),
        )
    }

    factory<AccountEditExternalContract.AccountUpdater> {
        AccountUpdater(
            preferences = get(),
+10 −0
Original line number Diff line number Diff line
package app.k9mail.feature.account.common

import app.k9mail.feature.account.common.domain.entity.AccountState

interface AccountCommonExternalContract {

    fun interface AccountLoader {
        suspend fun loadAccount(accountUuid: String): AccountState?
    }
}
Loading