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

Unverified Commit 8f911650 authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé Committed by GitHub
Browse files

Merge pull request #7172 from thundernest/change_server_validation_injection

Change injection for server validation
parents 9715cfc4 72de4c6b
Loading
Loading
Loading
Loading
+2 −9
Original line number Diff line number Diff line
@@ -3,8 +3,6 @@ package com.fsck.k9
import android.view.ContextThemeWrapper
import androidx.lifecycle.LifecycleOwner
import androidx.work.WorkerParameters
import app.k9mail.feature.account.server.validation.KOIN_NAME_INCOMING_SERVER_VALIDATION
import app.k9mail.feature.account.server.validation.KOIN_NAME_OUTGOING_SERVER_VALIDATION
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract
import com.fsck.k9.account.AccountRemoverWorker
@@ -23,7 +21,6 @@ import org.junit.runner.RunWith
import org.koin.core.annotation.KoinInternalApi
import org.koin.core.logger.PrintLogger
import org.koin.core.parameter.parametersOf
import org.koin.core.qualifier.named
import org.koin.java.KoinJavaComponent
import org.koin.test.AutoCloseKoinTest
import org.koin.test.check.checkModules
@@ -61,12 +58,8 @@ class DependencyInjectionTest : AutoCloseKoinTest() {
            withParameters(clazz = Class.forName("com.fsck.k9.view.K9WebViewClient").kotlin) {
                parametersOf(null, null)
            }
            withParameter<ServerValidationContract.ViewModel>(
                named(KOIN_NAME_INCOMING_SERVER_VALIDATION),
            ) { authStateStorage }
            withParameter<ServerValidationContract.ViewModel>(
                named(KOIN_NAME_OUTGOING_SERVER_VALIDATION),
            ) { authStateStorage }
            withParameter<ServerValidationContract.IncomingViewModel> { authStateStorage }
            withParameter<ServerValidationContract.OutgoingViewModel> { authStateStorage }
            withParameter<ServerValidationDomainContract.UseCase.ValidateServerSettings> { authStateStorage }
            withParameter<AccountRemoverWorker> { mock<WorkerParameters>() }
        }
+42 −0
Original line number Diff line number Diff line
@@ -102,3 +102,45 @@ inline fun <reified STATE, EVENT, EFFECT> UnidirectionalViewModel<STATE, EVENT,
        dispatch = dispatch,
    )
}

/**
 * Composable function that observes a UnidirectionalViewModel without handling side effects.
 *
 * Example usage:
 * ```
 * @Composable
 * fun MyScreen(
 *   viewModel: MyUnidirectionalViewModel<MyState, MyEvent, MyEffect>,
 *   onNavigateNext: () -> Unit,
 *   onNavigateBack: () -> Unit,
 * ) {
 *   val (state, dispatch) = viewModel.observeWithoutEffect()
 *
 *   MyContent(
 *     onNextClick = {
 *       dispatch(MyEvent.OnNext)
 *     },
 *     onBackClick = {
 *       dispatch(MyEvent.OnBack)
 *     },
 *     state = state.value,
 *   )
 * }
 * ```
 *
 * @param STATE The type that represents the state of the ViewModel.
 * @param EVENT The type that represents user actions that can occur and should be handled by the ViewModel.
 *
 * @return A [StateDispatch] containing the state and a dispatch function.
 */
@Suppress("MaxLineLength")
@Composable
inline fun <reified STATE, EVENT, EFFECT> UnidirectionalViewModel<STATE, EVENT, EFFECT>.observeWithoutEffect(): StateDispatch<STATE, EVENT> {
    val collectedState = state.collectAsStateWithLifecycle()
    val dispatch: (EVENT) -> Unit = { event(it) }

    return StateDispatch(
        state = collectedState,
        dispatch = dispatch,
    )
}
+6 −11
Original line number Diff line number Diff line
@@ -6,12 +6,12 @@ import app.k9mail.feature.account.oauth.featureAccountOAuthModule
import app.k9mail.feature.account.server.certificate.featureAccountServerCertificateModule
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract
import app.k9mail.feature.account.server.validation.domain.usecase.ValidateServerSettings
import app.k9mail.feature.account.server.validation.ui.ServerValidationViewModel
import app.k9mail.feature.account.server.validation.ui.IncomingServerValidationViewModel
import app.k9mail.feature.account.server.validation.ui.OutgoingServerValidationViewModel
import com.fsck.k9.mail.store.imap.ImapServerSettingsValidator
import com.fsck.k9.mail.store.pop3.Pop3ServerSettingsValidator
import com.fsck.k9.mail.transport.smtp.SmtpServerSettingsValidator
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.qualifier.named
import org.koin.dsl.module

val featureAccountServerValidationModule = module {
@@ -40,28 +40,23 @@ val featureAccountServerValidationModule = module {
        )
    }

    viewModel(named(KOIN_NAME_INCOMING_SERVER_VALIDATION)) {
        ServerValidationViewModel(
    viewModel {
        IncomingServerValidationViewModel(
            validateServerSettings = get(),
            accountStateRepository = get(),
            authorizationStateRepository = get(),
            certificateErrorRepository = get(),
            oAuthViewModel = get(),
            isIncomingValidation = true,
        )
    }

    viewModel(named(KOIN_NAME_OUTGOING_SERVER_VALIDATION)) {
        ServerValidationViewModel(
    viewModel {
        OutgoingServerValidationViewModel(
            validateServerSettings = get(),
            accountStateRepository = get(),
            authorizationStateRepository = get(),
            certificateErrorRepository = get(),
            oAuthViewModel = get(),
            isIncomingValidation = false,
        )
    }
}

const val KOIN_NAME_INCOMING_SERVER_VALIDATION = "incoming_server_validation"
const val KOIN_NAME_OUTGOING_SERVER_VALIDATION = "outgoing_server_validation"
+1 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import kotlinx.coroutines.launch
private const val CONTINUE_NEXT_DELAY = 2000L

@Suppress("TooManyFunctions")
class ServerValidationViewModel(
abstract class BaseServerValidationViewModel(
    private val accountStateRepository: AccountDomainContract.AccountStateRepository,
    private val validateServerSettings: ServerValidationDomainContract.UseCase.ValidateServerSettings,
    private val authorizationStateRepository: AccountOAuthDomainContract.AuthorizationStateRepository,
+25 −0
Original line number Diff line number Diff line
package app.k9mail.feature.account.server.validation.ui

import app.k9mail.feature.account.common.domain.AccountDomainContract
import app.k9mail.feature.account.oauth.domain.AccountOAuthDomainContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.server.certificate.domain.ServerCertificateDomainContract
import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract.UseCase

class IncomingServerValidationViewModel(
    accountStateRepository: AccountDomainContract.AccountStateRepository,
    validateServerSettings: UseCase.ValidateServerSettings,
    authorizationStateRepository: AccountOAuthDomainContract.AuthorizationStateRepository,
    certificateErrorRepository: ServerCertificateDomainContract.ServerCertificateErrorRepository,
    oAuthViewModel: AccountOAuthContract.ViewModel,
    initialState: ServerValidationContract.State? = null,
) : BaseServerValidationViewModel(
    accountStateRepository = accountStateRepository,
    validateServerSettings = validateServerSettings,
    authorizationStateRepository = authorizationStateRepository,
    certificateErrorRepository = certificateErrorRepository,
    oAuthViewModel = oAuthViewModel,
    initialState = initialState,
    isIncomingValidation = true,
),
    ServerValidationContract.IncomingViewModel
Loading