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

Commit 7c7ce912 authored by cketti's avatar cketti
Browse files

Always initialize AuthViewModel with an Account instance

This will avoid a NullPointerException when the activity result is handled after recovering from a process death.
parent 276f8ead
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -69,7 +69,19 @@ class AccountSetupCheckSettings : K9Activity(), ConfirmationDialogFragmentListen
        super.onCreate(savedInstanceState)
        setLayout(R.layout.account_setup_check_settings)

        authViewModel.init(activityResultRegistry, lifecycle)
        messageView = findViewById(R.id.message)
        progressBar = findViewById(R.id.progress)
        findViewById<View>(R.id.cancel).setOnClickListener { onCancel() }

        setMessage(R.string.account_setup_check_settings_retr_info_msg)
        progressBar.isIndeterminate = true

        val accountUuid = intent.getStringExtra(EXTRA_ACCOUNT) ?: error("Missing account UUID")
        account = preferences.getAccount(accountUuid) ?: error("Could not find account")
        direction = intent.getSerializableExtra(EXTRA_CHECK_DIRECTION) as CheckDirection?
            ?: error("Missing CheckDirection")

        authViewModel.init(activityResultRegistry, lifecycle, account)

        authViewModel.uiState.observe(this) { state ->
            when (state) {
@@ -96,22 +108,10 @@ class AccountSetupCheckSettings : K9Activity(), ConfirmationDialogFragmentListen
            authViewModel.authResultConsumed()
        }

        messageView = findViewById(R.id.message)
        progressBar = findViewById(R.id.progress)
        findViewById<View>(R.id.cancel).setOnClickListener { onCancel() }

        setMessage(R.string.account_setup_check_settings_retr_info_msg)
        progressBar.isIndeterminate = true

        val accountUuid = intent.getStringExtra(EXTRA_ACCOUNT) ?: error("Missing account UUID")
        account = preferences.getAccount(accountUuid) ?: error("Could not find account")
        direction = intent.getSerializableExtra(EXTRA_CHECK_DIRECTION) as CheckDirection?
            ?: error("Missing CheckDirection")

        if (savedInstanceState == null) {
            if (needsAuthorization()) {
                setMessage(R.string.account_setup_check_settings_authenticate)
                authViewModel.login(account)
                authViewModel.login()
            } else {
                startCheckServerSettings()
            }
+4 −3
Original line number Diff line number Diff line
@@ -56,7 +56,8 @@ class AuthViewModel(
        return authService ?: AuthorizationService(getApplication<Application>()).also { authService = it }
    }

    fun init(activityResultRegistry: ActivityResultRegistry, lifecycle: Lifecycle) {
    fun init(activityResultRegistry: ActivityResultRegistry, lifecycle: Lifecycle, account: Account) {
        this.account = account
        resultObserver = AppAuthResultObserver(activityResultRegistry)
        lifecycle.addObserver(resultObserver)
    }
@@ -83,8 +84,8 @@ class AuthViewModel(
        }
    }

    fun login(account: Account) {
        this.account = account
    fun login() {
        val account = checkNotNull(account)

        viewModelScope.launch {
            val config = findOAuthConfiguration(account)
+4 −5
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@ import android.widget.Button
import android.widget.ProgressBar
import android.widget.TextView
import androidx.core.view.isVisible
import com.fsck.k9.Account
import com.fsck.k9.preferences.AccountManager
import com.fsck.k9.ui.R
import com.fsck.k9.ui.base.K9Activity
@@ -40,7 +39,7 @@ class OAuthFlowActivity : K9Activity() {
        }

        signInButton.isVisible = true
        signInButton.setOnClickListener { startOAuthFlow(account) }
        signInButton.setOnClickListener { startOAuthFlow() }

        savedInstanceState?.let {
            val signInRunning = it.getBoolean(STATE_PROGRESS)
@@ -48,7 +47,7 @@ class OAuthFlowActivity : K9Activity() {
            signInProgress.isVisible = signInRunning
        }

        authViewModel.init(activityResultRegistry, lifecycle)
        authViewModel.init(activityResultRegistry, lifecycle, account)

        authViewModel.uiState.observe(this) { state ->
            handleUiUpdates(state)
@@ -87,12 +86,12 @@ class OAuthFlowActivity : K9Activity() {
        errorText.text = getString(errorTextResId, *args)
    }

    private fun startOAuthFlow(account: Account) {
    private fun startOAuthFlow() {
        signInButton.isVisible = false
        signInProgress.isVisible = true
        errorText.text = ""

        authViewModel.login(account)
        authViewModel.login()
    }

    override fun onSaveInstanceState(outState: Bundle) {