Loading core/ui/compose/testing/src/main/kotlin/app/k9mail/core/ui/compose/testing/mvi/MviTurbineExtension.kt +5 −1 Original line number Diff line number Diff line Loading @@ -78,4 +78,8 @@ fun <T, STATE, EFFECT> assertThatAndMviTurbinesConsumed( data class MviTurbines<STATE, EFFECT>( val stateTurbine: ReceiveTurbine<STATE>, val effectTurbine: ReceiveTurbine<EFFECT>, ) ) { suspend fun awaitStateItem() = stateTurbine.awaitItem() suspend fun awaitEffectItem() = effectTurbine.awaitItem() } feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/data/AuthorizationStateRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ import app.k9mail.feature.account.oauth.domain.DomainContract import app.k9mail.feature.account.oauth.domain.entity.AuthorizationState class AuthorizationStateRepository : DomainContract.AuthorizationStateRepository { override suspend fun isAuthorized(authorizationState: AuthorizationState): Boolean { override fun isAuthorized(authorizationState: AuthorizationState): Boolean { val authState = authorizationState.toAuthState() return authState.isAuthorized Loading feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/domain/DomainContract.kt +2 −2 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ interface DomainContract { ): AuthorizationResult } interface AuthorizationStateRepository { suspend fun isAuthorized(authorizationState: AuthorizationState): Boolean fun interface AuthorizationStateRepository { fun isAuthorized(authorizationState: AuthorizationState): Boolean } } feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/ui/DummyAccountOAuthViewModel.kt→feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/ui/preview/PreviewAccountOAuthViewModel.kt +6 −3 Original line number Diff line number Diff line package app.k9mail.feature.account.oauth.ui package app.k9mail.feature.account.oauth.ui.preview import app.k9mail.core.ui.compose.common.mvi.BaseViewModel import app.k9mail.feature.account.oauth.ui.AccountOAuthContract // Only used by @DevicePreviews functions class DummyAccountOAuthViewModel : /** * Only for previewing the UI. */ class PreviewAccountOAuthViewModel : BaseViewModel<AccountOAuthContract.State, AccountOAuthContract.Event, AccountOAuthContract.Effect>( AccountOAuthContract.State(), ), Loading feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/AccountSetupModule.kt +29 −32 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import app.k9mail.autodiscovery.api.AutoDiscoveryService import app.k9mail.autodiscovery.service.RealAutoDiscoveryService import app.k9mail.core.common.coreCommonModule import app.k9mail.feature.account.oauth.featureAccountOAuthModule import app.k9mail.feature.account.setup.data.InMemoryAccountSetupStateRepository import app.k9mail.feature.account.setup.domain.DomainContract import app.k9mail.feature.account.setup.domain.usecase.CreateAccount import app.k9mail.feature.account.setup.domain.usecase.GetAutoDiscovery Loading @@ -21,9 +22,7 @@ import app.k9mail.feature.account.setup.ui.options.AccountOptionsViewModel import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigContract import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigValidator import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigViewModel import app.k9mail.feature.account.setup.ui.validation.AccountValidationContract import app.k9mail.feature.account.setup.ui.validation.AccountValidationViewModel import app.k9mail.feature.account.setup.ui.validation.InMemoryAuthStateStorage import com.fsck.k9.mail.oauth.AuthStateStorage import com.fsck.k9.mail.store.imap.ImapServerSettingsValidator import com.fsck.k9.mail.store.pop3.Pop3ServerSettingsValidator Loading @@ -31,8 +30,8 @@ import com.fsck.k9.mail.transport.smtp.SmtpServerSettingsValidator import okhttp3.OkHttpClient import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.core.module.Module import org.koin.core.parameter.parametersOf import org.koin.core.qualifier.named import org.koin.dsl.binds import org.koin.dsl.module val featureAccountSetupModule: Module = module { Loading @@ -55,9 +54,13 @@ val featureAccountSetupModule: Module = module { ) } factory<DomainContract.UseCase.ValidateServerSettings> { (authStateStorage: AuthStateStorage) -> single { InMemoryAccountSetupStateRepository() }.binds(arrayOf(DomainContract.AccountSetupStateRepository::class, AuthStateStorage::class)) factory<DomainContract.UseCase.ValidateServerSettings> { ValidateServerSettings( authStateStorage = authStateStorage, authStateStorage = get(), imapValidator = ImapServerSettingsValidator( trustedSocketFactory = get(), oAuth2TokenProviderFactory = get(), Loading Loading @@ -85,59 +88,53 @@ val featureAccountSetupModule: Module = module { factory<AccountOptionsContract.Validator> { AccountOptionsValidator() } viewModel { val authStateStorage = InMemoryAuthStateStorage() AccountSetupViewModel( createAccount = get(), autoDiscoveryViewModel = get(), incomingViewModel = get(), incomingValidationViewModel = get(named(NAME_INCOMING_VALIDATION)) { parametersOf(authStateStorage) }, outgoingViewModel = get(), outgoingValidationViewModel = get(named(NAME_OUTGOING_VALIDATION)) { parametersOf(authStateStorage) }, optionsViewModel = get(), authStateStorage = authStateStorage, accountSetupStateRepository = get(), ) } factory<AccountAutoDiscoveryContract.ViewModel> { viewModel { AccountAutoDiscoveryViewModel( validator = get(), getAutoDiscovery = get(), accountSetupStateRepository = get(), oAuthViewModel = get(), ) } factory<AccountIncomingConfigContract.ViewModel> { viewModel { AccountIncomingConfigViewModel( validator = get(), accountSetupStateRepository = get(), ) } factory<AccountValidationContract.ViewModel>(named(NAME_INCOMING_VALIDATION)) { (authStateStorage: AuthStateStorage) -> viewModel(named(NAME_INCOMING_VALIDATION)) { AccountValidationViewModel( validateServerSettings = get { parametersOf(authStateStorage) }, initialState = AccountValidationContract.State( validateServerSettings = get(), accountSetupStateRepository = get(), authorizationStateRepository = get(), oAuthViewModel = get(), isIncomingValidation = true, ), ) } factory<AccountOutgoingConfigContract.ViewModel> { viewModel { AccountOutgoingConfigViewModel( validator = get(), accountSetupStateRepository = get(), ) } factory<AccountValidationContract.ViewModel>(named(NAME_OUTGOING_VALIDATION)) { (authStateStorage: AuthStateStorage) -> viewModel(named(NAME_OUTGOING_VALIDATION)) { AccountValidationViewModel( validateServerSettings = get { parametersOf(authStateStorage) }, initialState = AccountValidationContract.State( validateServerSettings = get(), accountSetupStateRepository = get(), authorizationStateRepository = get(), oAuthViewModel = get(), isIncomingValidation = false, ), ) } factory<AccountOptionsContract.ViewModel> { viewModel { AccountOptionsViewModel( validator = get(), accountSetupStateRepository = get(), ) } } Loading Loading
core/ui/compose/testing/src/main/kotlin/app/k9mail/core/ui/compose/testing/mvi/MviTurbineExtension.kt +5 −1 Original line number Diff line number Diff line Loading @@ -78,4 +78,8 @@ fun <T, STATE, EFFECT> assertThatAndMviTurbinesConsumed( data class MviTurbines<STATE, EFFECT>( val stateTurbine: ReceiveTurbine<STATE>, val effectTurbine: ReceiveTurbine<EFFECT>, ) ) { suspend fun awaitStateItem() = stateTurbine.awaitItem() suspend fun awaitEffectItem() = effectTurbine.awaitItem() }
feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/data/AuthorizationStateRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ import app.k9mail.feature.account.oauth.domain.DomainContract import app.k9mail.feature.account.oauth.domain.entity.AuthorizationState class AuthorizationStateRepository : DomainContract.AuthorizationStateRepository { override suspend fun isAuthorized(authorizationState: AuthorizationState): Boolean { override fun isAuthorized(authorizationState: AuthorizationState): Boolean { val authState = authorizationState.toAuthState() return authState.isAuthorized Loading
feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/domain/DomainContract.kt +2 −2 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ interface DomainContract { ): AuthorizationResult } interface AuthorizationStateRepository { suspend fun isAuthorized(authorizationState: AuthorizationState): Boolean fun interface AuthorizationStateRepository { fun isAuthorized(authorizationState: AuthorizationState): Boolean } }
feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/ui/DummyAccountOAuthViewModel.kt→feature/account/oauth/src/main/kotlin/app/k9mail/feature/account/oauth/ui/preview/PreviewAccountOAuthViewModel.kt +6 −3 Original line number Diff line number Diff line package app.k9mail.feature.account.oauth.ui package app.k9mail.feature.account.oauth.ui.preview import app.k9mail.core.ui.compose.common.mvi.BaseViewModel import app.k9mail.feature.account.oauth.ui.AccountOAuthContract // Only used by @DevicePreviews functions class DummyAccountOAuthViewModel : /** * Only for previewing the UI. */ class PreviewAccountOAuthViewModel : BaseViewModel<AccountOAuthContract.State, AccountOAuthContract.Event, AccountOAuthContract.Effect>( AccountOAuthContract.State(), ), Loading
feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/AccountSetupModule.kt +29 −32 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import app.k9mail.autodiscovery.api.AutoDiscoveryService import app.k9mail.autodiscovery.service.RealAutoDiscoveryService import app.k9mail.core.common.coreCommonModule import app.k9mail.feature.account.oauth.featureAccountOAuthModule import app.k9mail.feature.account.setup.data.InMemoryAccountSetupStateRepository import app.k9mail.feature.account.setup.domain.DomainContract import app.k9mail.feature.account.setup.domain.usecase.CreateAccount import app.k9mail.feature.account.setup.domain.usecase.GetAutoDiscovery Loading @@ -21,9 +22,7 @@ import app.k9mail.feature.account.setup.ui.options.AccountOptionsViewModel import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigContract import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigValidator import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigViewModel import app.k9mail.feature.account.setup.ui.validation.AccountValidationContract import app.k9mail.feature.account.setup.ui.validation.AccountValidationViewModel import app.k9mail.feature.account.setup.ui.validation.InMemoryAuthStateStorage import com.fsck.k9.mail.oauth.AuthStateStorage import com.fsck.k9.mail.store.imap.ImapServerSettingsValidator import com.fsck.k9.mail.store.pop3.Pop3ServerSettingsValidator Loading @@ -31,8 +30,8 @@ import com.fsck.k9.mail.transport.smtp.SmtpServerSettingsValidator import okhttp3.OkHttpClient import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.core.module.Module import org.koin.core.parameter.parametersOf import org.koin.core.qualifier.named import org.koin.dsl.binds import org.koin.dsl.module val featureAccountSetupModule: Module = module { Loading @@ -55,9 +54,13 @@ val featureAccountSetupModule: Module = module { ) } factory<DomainContract.UseCase.ValidateServerSettings> { (authStateStorage: AuthStateStorage) -> single { InMemoryAccountSetupStateRepository() }.binds(arrayOf(DomainContract.AccountSetupStateRepository::class, AuthStateStorage::class)) factory<DomainContract.UseCase.ValidateServerSettings> { ValidateServerSettings( authStateStorage = authStateStorage, authStateStorage = get(), imapValidator = ImapServerSettingsValidator( trustedSocketFactory = get(), oAuth2TokenProviderFactory = get(), Loading Loading @@ -85,59 +88,53 @@ val featureAccountSetupModule: Module = module { factory<AccountOptionsContract.Validator> { AccountOptionsValidator() } viewModel { val authStateStorage = InMemoryAuthStateStorage() AccountSetupViewModel( createAccount = get(), autoDiscoveryViewModel = get(), incomingViewModel = get(), incomingValidationViewModel = get(named(NAME_INCOMING_VALIDATION)) { parametersOf(authStateStorage) }, outgoingViewModel = get(), outgoingValidationViewModel = get(named(NAME_OUTGOING_VALIDATION)) { parametersOf(authStateStorage) }, optionsViewModel = get(), authStateStorage = authStateStorage, accountSetupStateRepository = get(), ) } factory<AccountAutoDiscoveryContract.ViewModel> { viewModel { AccountAutoDiscoveryViewModel( validator = get(), getAutoDiscovery = get(), accountSetupStateRepository = get(), oAuthViewModel = get(), ) } factory<AccountIncomingConfigContract.ViewModel> { viewModel { AccountIncomingConfigViewModel( validator = get(), accountSetupStateRepository = get(), ) } factory<AccountValidationContract.ViewModel>(named(NAME_INCOMING_VALIDATION)) { (authStateStorage: AuthStateStorage) -> viewModel(named(NAME_INCOMING_VALIDATION)) { AccountValidationViewModel( validateServerSettings = get { parametersOf(authStateStorage) }, initialState = AccountValidationContract.State( validateServerSettings = get(), accountSetupStateRepository = get(), authorizationStateRepository = get(), oAuthViewModel = get(), isIncomingValidation = true, ), ) } factory<AccountOutgoingConfigContract.ViewModel> { viewModel { AccountOutgoingConfigViewModel( validator = get(), accountSetupStateRepository = get(), ) } factory<AccountValidationContract.ViewModel>(named(NAME_OUTGOING_VALIDATION)) { (authStateStorage: AuthStateStorage) -> viewModel(named(NAME_OUTGOING_VALIDATION)) { AccountValidationViewModel( validateServerSettings = get { parametersOf(authStateStorage) }, initialState = AccountValidationContract.State( validateServerSettings = get(), accountSetupStateRepository = get(), authorizationStateRepository = get(), oAuthViewModel = get(), isIncomingValidation = false, ), ) } factory<AccountOptionsContract.ViewModel> { viewModel { AccountOptionsViewModel( validator = get(), accountSetupStateRepository = get(), ) } } Loading