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

Commit 13c825c3 authored by Mohammed Althaf T's avatar Mohammed Althaf T 😊
Browse files

mail: Remove accounts properly

parent 6f8f88a8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@
            android:exported="true">
            <intent-filter>
                <action android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" />
                <action android:name="foundation.e.accountmanager.account.create"/>
                <action android:name="android.accounts.action.ACCOUNT_REMOVED"/>
            </intent-filter>
        </receiver>

+32 −10
Original line number Diff line number Diff line
@@ -18,30 +18,52 @@
package com.fsck.k9

import android.accounts.AccountManager
import android.accounts.AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.fsck.k9.account.BackgroundAccountRemover
import com.fsck.k9.activity.accountmanager.AccountManagerConstants
import com.fsck.k9.activity.accountmanager.EeloAccountCreator
import com.fsck.k9.controller.push.PushController
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

class AccountReceiver : BroadcastReceiver() {
class AccountReceiver : BroadcastReceiver(), KoinComponent {

    private val pushController: PushController by inject()
    private val preferences: Preferences by inject()
    private val accountRemover: BackgroundAccountRemover by inject()

    override fun onReceive(context: Context, intent: Intent?) {
        val action = intent?.action ?: return
        if (intent == null) {
            return
        }

        val accountCreator = EeloAccountCreator(context)

        when (action) {
            AccountManagerConstants.ACCOUNT_CREATION_ACTION, LOGIN_ACCOUNTS_CHANGED_ACTION -> {
        when (intent.action) {
            AccountManagerConstants.ACCOUNT_CREATION_ACTION -> {
                accountCreator.loadAccountsFromAccountManager()
            }
            AccountManagerConstants.ACCOUNT_REMOVAL_ACTION -> {
                intent.extras?.let { extras ->
                    val accountType = extras.getString(AccountManager.KEY_ACCOUNT_TYPE) ?: return
                    val accountName = extras.getString(AccountManager.KEY_ACCOUNT_NAME) ?: return
                    accountCreator.removeAccount(accountType, accountName)
                removeAccount(intent)
            }
            AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION -> {
                pushController.init()
                accountCreator.loadAccountsFromAccountManager()
            }
        }
    }

    private fun removeAccount(intent: Intent) {
        val accountType = intent.extras?.getString(AccountManager.KEY_ACCOUNT_TYPE) ?: return
        if (!AccountManagerConstants.ACCOUNT_TYPES.contains(accountType)) return
        val account = intent.extras?.getString(AccountManager.KEY_ACCOUNT_NAME) ?: return

        preferences.getAccounts().forEach {
            if (it.email == account) {
                accountRemover.removeAccountAsync(it.uuid)
            }
        }
    }
}
+12 −2
Original line number Diff line number Diff line
@@ -145,13 +145,15 @@ open class MessageList :
            return
        }

        val accountCreator = EeloAccountCreator(this)
        var accounts = accountManager.getAccounts()
        deleteIncompleteAccounts(accounts)

        if (EeloAccountCreator(this).loadAccountsFromAccountManager()) {
        if (accountCreator.loadAccountsFromAccountManager()) {
            accounts = accountManager.getAccounts()
        }

        deleteIncompleteAccounts(accounts)

        val hasAccountSetup = accounts.any { it.isFinishedSetup }
        if (!hasAccountSetup) {
            FeatureLauncherActivity.launch(this, FeatureLauncherTarget.Onboarding)
@@ -206,6 +208,7 @@ open class MessageList :
        }
    }


    public override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)

@@ -540,6 +543,13 @@ open class MessageList :
    public override fun onResume() {
        super.onResume()

        val hasAccountSetup = preferences.getAccounts().any { it.isFinishedSetup }
        if (!hasAccountSetup) {
            FeatureLauncherActivity.launch(this, FeatureLauncherTarget.Onboarding)
            finish()
            return
        }

        if (messageListActivityConfig == null) {
            messageListActivityConfig = MessageListActivityConfig.create(generalSettingsManager)
        } else if (messageListActivityConfig != MessageListActivityConfig.create(generalSettingsManager)) {
+5 −8
Original line number Diff line number Diff line
@@ -83,21 +83,18 @@ internal class EeloAccountCreator(context: Context) : KoinComponent {
        return true
    }

    fun removeAccount(accountType: String, accountName: String) {
        if (AccountManagerConstants.ACCOUNT_TYPES.contains(accountType)) {
            preferences.getAccounts().forEach {
                if (it.email == accountName) {
    private fun deleteIncompleteAccounts() {
        val accounts = preferences.getAccounts()
        accounts.filter { !it.isFinishedSetup }.forEach {
            accountRemover.removeAccountAsync(it.uuid)
        }
    }
        }
    }

    fun loadAccountsFromAccountManager(): Boolean {
        try {
            val accountManager = AccountManager.get(mContext)
            val accounts = preferences.getAccounts()
            EeloAccountHelper.deleteIncompleteAccounts(accounts, accountRemover)
            deleteIncompleteAccounts()
            AccountManagerConstants.ACCOUNT_TYPES
                .forEach { accountType ->
                    loadAccounts(
+0 −5
Original line number Diff line number Diff line
@@ -78,9 +78,4 @@ object EeloAccountHelper {
        val authState = accountManager.getUserData(account, AccountManagerConstants.KEY_AUTH_STATE)
        return authState != null && authState.trim { it <= ' ' }.isNotEmpty()
    }

    fun deleteIncompleteAccounts(accounts: List<kAccount>, accountRemover: BackgroundAccountRemover) {
        accounts.stream().filter { account: kAccount -> !account.isFinishedSetup }
            .forEach { account: kAccount -> accountRemover.removeAccountAsync(account.uuid) }
    }
}