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

Unverified Commit efd54b89 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #7094 from thundernest/change_to_new_validation_screen

Change to new validation screen
parents 6b3c7a8f a00ca56f
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -22,6 +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 com.fsck.k9.mail.store.imap.ImapServerSettingsValidator
import com.fsck.k9.mail.store.pop3.Pop3ServerSettingsValidator
@@ -29,6 +30,7 @@ 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.qualifier.named
import org.koin.dsl.module

val featureAccountSetupModule: Module = module {
@@ -111,20 +113,29 @@ val featureAccountSetupModule: Module = module {
        )
    }
    viewModel {
        AccountIncomingConfigViewModel(
            validator = get(),
        )
    }
    viewModel(named(NAME_INCOMING_VALIDATION)) {
        AccountValidationViewModel(
            validateServerSettings = get(),
            initialState = AccountValidationContract.State(
                isIncomingValidation = true,
            ),
        )
    }
    viewModel {
        AccountIncomingConfigViewModel(
        AccountOutgoingConfigViewModel(
            validator = get(),
            checkIncomingServerConfig = get(),
        )
    }
    viewModel {
        AccountOutgoingConfigViewModel(
            validator = get(),
            checkOutgoingServerConfig = get(),
    viewModel(named(NAME_OUTGOING_VALIDATION)) {
        AccountValidationViewModel(
            validateServerSettings = get(),
            initialState = AccountValidationContract.State(
                isIncomingValidation = false,
            ),
        )
    }
    viewModel {
@@ -133,3 +144,6 @@ val featureAccountSetupModule: Module = module {
        )
    }
}

internal const val NAME_INCOMING_VALIDATION = "incoming_validation"
internal const val NAME_OUTGOING_VALIDATION = "outgoing_validation"
+8 −0
Original line number Diff line number Diff line
@@ -11,7 +11,9 @@ interface AccountSetupContract {
    enum class SetupStep {
        AUTO_CONFIG,
        INCOMING_CONFIG,
        INCOMING_VALIDATION,
        OUTGOING_CONFIG,
        OUTGOING_VALIDATION,
        OPTIONS,
    }

@@ -19,6 +21,7 @@ interface AccountSetupContract {

    data class State(
        val setupStep: SetupStep = SetupStep.AUTO_CONFIG,
        val isAutomaticConfig: Boolean = false,
    )

    sealed interface Event {
@@ -26,6 +29,7 @@ interface AccountSetupContract {

        data class OnAutoDiscoveryFinished(
            val state: AccountAutoDiscoveryContract.State,
            val isAutomaticConfig: Boolean,
        ) : Event

        data class OnStateCollected(
@@ -44,10 +48,14 @@ interface AccountSetupContract {
            val state: AccountIncomingConfigContract.State,
        ) : Effect

        object UpdateIncomingConfigValidation : Effect

        data class UpdateOutgoingConfig(
            val state: AccountOutgoingConfigContract.State,
        ) : Effect

        object UpdateOutgoingConfigValidation : Effect

        data class UpdateOptions(
            val state: AccountOptionsContract.State,
        ) : Effect
+51 −1
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@ package app.k9mail.feature.account.setup.ui
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.feature.account.setup.NAME_INCOMING_VALIDATION
import app.k9mail.feature.account.setup.NAME_OUTGOING_VALIDATION
import app.k9mail.feature.account.setup.ui.AccountSetupContract.Effect
import app.k9mail.feature.account.setup.ui.AccountSetupContract.Event
import app.k9mail.feature.account.setup.ui.AccountSetupContract.SetupStep
@@ -13,14 +15,21 @@ import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryVie
import app.k9mail.feature.account.setup.ui.incoming.AccountIncomingConfigContract
import app.k9mail.feature.account.setup.ui.incoming.AccountIncomingConfigScreen
import app.k9mail.feature.account.setup.ui.incoming.AccountIncomingConfigViewModel
import app.k9mail.feature.account.setup.ui.incoming.toValidationState
import app.k9mail.feature.account.setup.ui.options.AccountOptionsContract
import app.k9mail.feature.account.setup.ui.options.AccountOptionsScreen
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.AccountOutgoingConfigScreen
import app.k9mail.feature.account.setup.ui.outgoing.AccountOutgoingConfigViewModel
import app.k9mail.feature.account.setup.ui.outgoing.toValidationState
import app.k9mail.feature.account.setup.ui.validation.AccountValidationContract
import app.k9mail.feature.account.setup.ui.validation.AccountValidationScreen
import app.k9mail.feature.account.setup.ui.validation.AccountValidationViewModel
import org.koin.androidx.compose.koinViewModel
import org.koin.core.qualifier.named

@Suppress("LongMethod", "CyclomaticComplexMethod")
@Composable
fun AccountSetupScreen(
    onFinish: (String) -> Unit,
@@ -28,13 +37,31 @@ fun AccountSetupScreen(
    viewModel: ViewModel = koinViewModel<AccountSetupViewModel>(),
    autoDiscoveryViewModel: AccountAutoDiscoveryContract.ViewModel = koinViewModel<AccountAutoDiscoveryViewModel>(),
    incomingViewModel: AccountIncomingConfigContract.ViewModel = koinViewModel<AccountIncomingConfigViewModel>(),
    incomingValidationViewModel: AccountValidationContract.ViewModel = koinViewModel<AccountValidationViewModel>(
        named(
            NAME_INCOMING_VALIDATION,
        ),
    ),
    outgoingViewModel: AccountOutgoingConfigContract.ViewModel = koinViewModel<AccountOutgoingConfigViewModel>(),
    outgoingValidationViewModel: AccountValidationContract.ViewModel = koinViewModel<AccountValidationViewModel>(
        named(
            NAME_OUTGOING_VALIDATION,
        ),
    ),
    optionsViewModel: AccountOptionsContract.ViewModel = koinViewModel<AccountOptionsViewModel>(),
) {
    val (state, dispatch) = viewModel.observe { effect ->
        when (effect) {
            is Effect.UpdateIncomingConfig -> incomingViewModel.initState(effect.state)
            is Effect.UpdateIncomingConfigValidation -> {
                incomingValidationViewModel.initState(incomingViewModel.state.value.toValidationState())
            }

            is Effect.UpdateOutgoingConfig -> outgoingViewModel.initState(effect.state)
            is Effect.UpdateOutgoingConfigValidation -> {
                outgoingValidationViewModel.initState(outgoingViewModel.state.value.toValidationState())
            }

            is Effect.UpdateOptions -> optionsViewModel.initState(effect.state)
            is Effect.CollectExternalStates -> viewModel.event(
                Event.OnStateCollected(
@@ -53,7 +80,14 @@ fun AccountSetupScreen(
    when (state.value.setupStep) {
        SetupStep.AUTO_CONFIG -> {
            AccountAutoDiscoveryScreen(
                onNext = { dispatch(Event.OnAutoDiscoveryFinished(it)) },
                onNext = { autoDiscoveryState, isAutomaticConfig ->
                    dispatch(
                        Event.OnAutoDiscoveryFinished(
                            autoDiscoveryState,
                            isAutomaticConfig,
                        ),
                    )
                },
                onBack = { dispatch(Event.OnBack) },
                viewModel = autoDiscoveryViewModel,
            )
@@ -67,6 +101,14 @@ fun AccountSetupScreen(
            )
        }

        SetupStep.INCOMING_VALIDATION -> {
            AccountValidationScreen(
                onNext = { dispatch(Event.OnNext) },
                onBack = { dispatch(Event.OnBack) },
                viewModel = incomingValidationViewModel,
            )
        }

        SetupStep.OUTGOING_CONFIG -> {
            AccountOutgoingConfigScreen(
                onNext = { dispatch(Event.OnNext) },
@@ -75,6 +117,14 @@ fun AccountSetupScreen(
            )
        }

        SetupStep.OUTGOING_VALIDATION -> {
            AccountValidationScreen(
                onNext = { dispatch(Event.OnNext) },
                onBack = { dispatch(Event.OnBack) },
                viewModel = outgoingValidationViewModel,
            )
        }

        SetupStep.OPTIONS -> {
            AccountOptionsScreen(
                onNext = { dispatch(Event.OnNext) },
+62 −7
Original line number Diff line number Diff line
@@ -27,7 +27,15 @@ class AccountSetupViewModel(

    override fun event(event: Event) {
        when (event) {
            is Event.OnAutoDiscoveryFinished -> onAutoDiscoveryFinished(event.state)
            is Event.OnAutoDiscoveryFinished -> {
                updateState {
                    it.copy(
                        isAutomaticConfig = event.isAutomaticConfig,
                    )
                }
                onAutoDiscoveryFinished(event.state)
            }

            is Event.OnStateCollected -> onStateCollected(
                autoDiscoveryState = event.autoDiscoveryState,
                incomingState = event.incomingState,
@@ -40,7 +48,9 @@ class AccountSetupViewModel(
        }
    }

    private fun onAutoDiscoveryFinished(autoDiscoveryState: AccountAutoDiscoveryContract.State) {
    private fun onAutoDiscoveryFinished(
        autoDiscoveryState: AccountAutoDiscoveryContract.State,
    ) {
        emitEffect(Effect.UpdateIncomingConfig(autoDiscoveryState.toIncomingConfigState()))
        emitEffect(Effect.UpdateOutgoingConfig(autoDiscoveryState.toOutgoingConfigState()))
        emitEffect(Effect.UpdateOptions(autoDiscoveryState.toOptionsState()))
@@ -51,16 +61,61 @@ class AccountSetupViewModel(
        when (state.value.setupStep) {
            SetupStep.AUTO_CONFIG -> navigateBack()
            SetupStep.INCOMING_CONFIG -> changeToSetupStep(SetupStep.AUTO_CONFIG)
            SetupStep.OUTGOING_CONFIG -> changeToSetupStep(SetupStep.INCOMING_CONFIG)
            SetupStep.OPTIONS -> changeToSetupStep(SetupStep.OUTGOING_CONFIG)
            SetupStep.INCOMING_VALIDATION -> {
                if (state.value.isAutomaticConfig) {
                    changeToSetupStep(SetupStep.AUTO_CONFIG)
                } else {
                    changeToSetupStep(SetupStep.INCOMING_CONFIG)
                }
            }

            SetupStep.OUTGOING_CONFIG -> changeToSetupStep(SetupStep.INCOMING_VALIDATION)
            SetupStep.OUTGOING_VALIDATION -> {
                if (state.value.isAutomaticConfig) {
                    changeToSetupStep(SetupStep.AUTO_CONFIG)
                } else {
                    changeToSetupStep(SetupStep.OUTGOING_CONFIG)
                }
            }

            SetupStep.OPTIONS -> changeToSetupStep(SetupStep.OUTGOING_VALIDATION)
        }
    }

    private fun onNext() {
        when (state.value.setupStep) {
            SetupStep.AUTO_CONFIG -> changeToSetupStep(SetupStep.INCOMING_CONFIG)
            SetupStep.INCOMING_CONFIG -> changeToSetupStep(SetupStep.OUTGOING_CONFIG)
            SetupStep.OUTGOING_CONFIG -> changeToSetupStep(SetupStep.OPTIONS)
            SetupStep.AUTO_CONFIG -> {
                if (state.value.isAutomaticConfig) {
                    emitEffect(Effect.UpdateIncomingConfigValidation)
                    emitEffect(Effect.UpdateOutgoingConfigValidation)
                    changeToSetupStep(SetupStep.INCOMING_VALIDATION)
                } else {
                    changeToSetupStep(SetupStep.INCOMING_CONFIG)
                }
            }

            SetupStep.INCOMING_CONFIG -> {
                emitEffect(Effect.UpdateIncomingConfigValidation)
                changeToSetupStep(SetupStep.INCOMING_VALIDATION)
            }

            SetupStep.INCOMING_VALIDATION -> {
                if (state.value.isAutomaticConfig) {
                    changeToSetupStep(SetupStep.OUTGOING_VALIDATION)
                } else {
                    changeToSetupStep(SetupStep.OUTGOING_CONFIG)
                }
            }

            SetupStep.OUTGOING_CONFIG -> {
                emitEffect(Effect.UpdateOutgoingConfigValidation)
                changeToSetupStep(SetupStep.OUTGOING_VALIDATION)
            }

            SetupStep.OUTGOING_VALIDATION -> {
                changeToSetupStep(SetupStep.OPTIONS)
            }

            SetupStep.OPTIONS -> onFinish()
        }
    }
+3 −1
Original line number Diff line number Diff line
@@ -40,7 +40,9 @@ interface AccountAutoDiscoveryContract {
    }

    sealed class Effect {
        object NavigateNext : Effect()
        data class NavigateNext(
            val isAutomaticConfig: Boolean,
        ) : Effect()
        object NavigateBack : Effect()
    }

Loading