Loading app-feature-preview/src/main/java/app/k9mail/feature/preview/FeatureModule.kt +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 Loading @@ -23,6 +24,7 @@ val accountModule: Module = module { single { InMemoryAccountStore() } .binds( arrayOf( AccountCommonExternalContract.AccountLoader::class, AccountSetupExternalContract.AccountCreator::class, AccountEditExternalContract.AccountUpdater::class, ), Loading app-feature-preview/src/main/java/app/k9mail/feature/preview/account/InMemoryAccountStore.kt +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 Loading @@ -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 Loading @@ -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, ) } } app/k9mail/src/main/java/com/fsck/k9/account/AccountLoader.kt 0 → 100644 +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), ) } } app/k9mail/src/main/java/com/fsck/k9/account/AccountModule.kt +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 Loading @@ -21,6 +22,12 @@ val newAccountModule = module { ) } factory<AccountCommonExternalContract.AccountLoader> { AccountLoader( preferences = get(), ) } factory<AccountEditExternalContract.AccountUpdater> { AccountUpdater( preferences = get(), Loading feature/account/common/src/main/kotlin/app/k9mail/feature/account/common/AccountCommonExternalContract.kt 0 → 100644 +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
app-feature-preview/src/main/java/app/k9mail/feature/preview/FeatureModule.kt +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 Loading @@ -23,6 +24,7 @@ val accountModule: Module = module { single { InMemoryAccountStore() } .binds( arrayOf( AccountCommonExternalContract.AccountLoader::class, AccountSetupExternalContract.AccountCreator::class, AccountEditExternalContract.AccountUpdater::class, ), Loading
app-feature-preview/src/main/java/app/k9mail/feature/preview/account/InMemoryAccountStore.kt +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 Loading @@ -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 Loading @@ -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, ) } }
app/k9mail/src/main/java/com/fsck/k9/account/AccountLoader.kt 0 → 100644 +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), ) } }
app/k9mail/src/main/java/com/fsck/k9/account/AccountModule.kt +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 Loading @@ -21,6 +22,12 @@ val newAccountModule = module { ) } factory<AccountCommonExternalContract.AccountLoader> { AccountLoader( preferences = get(), ) } factory<AccountEditExternalContract.AccountUpdater> { AccountUpdater( preferences = get(), Loading
feature/account/common/src/main/kotlin/app/k9mail/feature/account/common/AccountCommonExternalContract.kt 0 → 100644 +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? } }