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

Commit 4efbf3d0 authored by cketti's avatar cketti
Browse files

Add OAuth to auto discovery flow

parent 6ff458da
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ class AccountCreator(

        newAccount.outgoingServerSettings = account.outgoingServerSettings

        newAccount.oAuthState = account.authorizationState

        newAccount.name = account.options.accountName
        newAccount.senderName = account.options.displayName
        if (account.options.emailSignature != null) {
+8 −0
Original line number Diff line number Diff line
@@ -3,7 +3,10 @@ package com.fsck.k9
import android.view.ContextThemeWrapper
import androidx.lifecycle.LifecycleOwner
import androidx.work.WorkerParameters
import app.k9mail.feature.account.setup.domain.DomainContract.UseCase.ValidateServerSettings
import app.k9mail.feature.account.setup.ui.validation.AccountValidationContract
import com.fsck.k9.job.MailSyncWorker
import com.fsck.k9.mail.oauth.AuthStateStorage
import com.fsck.k9.ui.R
import com.fsck.k9.ui.changelog.ChangeLogMode
import com.fsck.k9.ui.changelog.ChangelogViewModel
@@ -17,6 +20,7 @@ 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
@@ -34,6 +38,7 @@ class DependencyInjectionTest : AutoCloseKoinTest() {
        on { lifecycle } doReturn mock()
    }
    private val autocryptTransferView = mock<AutocryptKeyTransferActivity>()
    private val authStateStorage = mock<AuthStateStorage>()

    @KoinInternalApi
    @Test
@@ -53,6 +58,9 @@ class DependencyInjectionTest : AutoCloseKoinTest() {
            withParameters(clazz = Class.forName("com.fsck.k9.view.K9WebViewClient").kotlin) {
                parametersOf(null, null)
            }
            withParameter<AccountValidationContract.ViewModel>(named("incoming_validation")) { authStateStorage }
            withParameter<AccountValidationContract.ViewModel>(named("outgoing_validation")) { authStateStorage }
            withParameter<ValidateServerSettings> { authStateStorage }
        }
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ android {
dependencies {
    implementation(projects.core.ui.compose.designsystem)
    implementation(projects.core.common)
    implementation(projects.mail.common)
    implementation(projects.feature.account.common)

    implementation(libs.appauth)
+2 −2
Original line number Diff line number Diff line
@@ -9,10 +9,10 @@ import app.k9mail.feature.account.oauth.domain.usecase.CheckIsGoogleSignIn
import app.k9mail.feature.account.oauth.domain.usecase.FinishOAuthSignIn
import app.k9mail.feature.account.oauth.domain.usecase.GetOAuthRequestIntent
import app.k9mail.feature.account.oauth.domain.usecase.SuggestServerName
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthViewModel
import net.openid.appauth.AuthorizationService
import org.koin.android.ext.koin.androidApplication
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.module.Module
import org.koin.dsl.module

@@ -48,7 +48,7 @@ val featureAccountOAuthModule: Module = module {

    factory<UseCase.CheckIsGoogleSignIn> { CheckIsGoogleSignIn() }

    viewModel {
    factory<AccountOAuthContract.ViewModel> {
        AccountOAuthViewModel(
            getOAuthRequestIntent = get(),
            finishOAuthSignIn = get(),
+17 −23
Original line number Diff line number Diff line
package app.k9mail.feature.account.oauth.ui

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -8,16 +9,15 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import app.k9mail.core.ui.compose.common.DevicePreviews
import app.k9mail.core.ui.compose.designsystem.molecule.ErrorView
import app.k9mail.core.ui.compose.designsystem.molecule.LoadingView
import app.k9mail.core.ui.compose.theme.K9Theme
import app.k9mail.core.ui.compose.theme.MainTheme
import app.k9mail.core.ui.compose.theme.ThunderbirdTheme
import app.k9mail.feature.account.common.ui.ContentListView
import app.k9mail.feature.account.common.ui.item.ErrorItem
import app.k9mail.feature.account.common.ui.item.LoadingItem
import app.k9mail.feature.account.oauth.R
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract.Event
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract.State
import app.k9mail.feature.account.oauth.ui.item.SignInItem
import app.k9mail.feature.account.oauth.ui.view.SignInView

@Composable
internal fun AccountOAuthContent(
@@ -27,36 +27,30 @@ internal fun AccountOAuthContent(
) {
    val resources = LocalContext.current.resources

    ContentListView(
    Column(
        modifier = Modifier
            .testTag("AccountOAuthContent")
            .then(modifier),
        verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double, Alignment.CenterVertically),
    ) {
        if (state.isLoading) {
            item(key = "loading") {
                LoadingItem(
            LoadingView(
                message = stringResource(id = R.string.account_oauth_loading_message),
            )
            }
        } else if (state.error != null) {
            item(key = "error") {
                ErrorItem(
            ErrorView(
                title = stringResource(id = R.string.account_oauth_loading_error),
                message = state.error.toResourceString(resources),
                onRetry = { onEvent(Event.OnRetryClicked) },
            )
            }
        } else {
            item(key = "sign_in") {
                SignInItem(
            SignInView(
                onSignInClick = { onEvent(Event.SignInClicked) },
                isGoogleSignIn = state.isGoogleSignIn,
            )
        }
    }
}
}

@Composable
@DevicePreviews
Loading