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

Commit fa44d63c authored by Fahim Salam Chowdhury's avatar Fahim Salam Chowdhury 👽
Browse files

Refactor openId account support

Simplify the openId accounts (google & yahoo for now) retrieval code, so
less code duplication is needed. So in future, adding new openId account
should be straight forward.
parent b2c726ef
Loading
Loading
Loading
Loading
Loading
+17 −18
Original line number Diff line number Diff line
@@ -32,36 +32,35 @@ object OsAccountManagerUtil {
    fun isSyncEnable(context: Context, email: String): Boolean {
        val accountManager = AccountManager.get(context)

        val murenaAccounts = accountManager.getAccountsByType(AccountManagerConstants.EELO_ACCOUNT_TYPE)
        var syncEnable = isSyncEnable(accountManager, murenaAccounts, email)
        if (syncEnable.isAccountFound()) {
            return syncEnable.getStatus()
        }
        var syncStatus = true

        val googleAccounts = accountManager.getAccountsByType(AccountManagerConstants.GOOGLE_ACCOUNT_TYPE)
        syncEnable = isSyncEnable(accountManager, googleAccounts, email)
        AccountManagerConstants.ALL_ACCOUNT_TYPES.forEach {
            val accounts = accountManager.getAccountsByType(it)
            val syncEnable = isSyncEnable(accountManager, accounts, email)
            if (syncEnable.isAccountFound()) {
            return syncEnable.getStatus()
                syncStatus = syncEnable.getStatus()
                return@forEach
            }

        val yahooAccounts = accountManager.getAccountsByType(AccountManagerConstants.YAHOO_ACCOUNT_TYPE)
        syncEnable = isSyncEnable(accountManager, yahooAccounts, email)
        if (syncEnable.isAccountFound()) {
            return syncEnable.getStatus()
        }

        return true
        return syncStatus
    }

    private fun isSyncEnable(accountManager: AccountManager, accounts: Array<out Account>, email: String): Syncable {
        accounts.forEach {
            try {
                val accountEmail: String = accountManager.getUserData(it, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY)
                val accountEmail: String =
                    accountManager.getUserData(it, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY)
                if (accountEmail == email) {
                    // if master sync disable, then account sync is disable
                    return if (!ContentResolver.getMasterSyncAutomatically()) {
                        Syncable.NOT_SYNCABLE
                    } else Syncable.getSyncable(ContentResolver.getSyncAutomatically(it, AccountManagerConstants.MAIL_CONTENT_AUTHORITY))
                    } else Syncable.getSyncable(
                        ContentResolver.getSyncAutomatically(
                            it,
                            AccountManagerConstants.MAIL_CONTENT_AUTHORITY,
                        ),
                    )
                }
            } catch (e: Throwable) {
                Timber.e(e)
+0 −4
Original line number Diff line number Diff line
@@ -19,8 +19,4 @@ class OAuthConfigurationProvider(
    fun isGoogle(hostname: String): Boolean {
        return getConfiguration(hostname) == googleConfiguration
    }

    fun  isYahoo(hostname: String): Boolean {
        return hostname in listOf("imap.mail.yahoo.com", "smtp.mail.yahoo.com")
    }
}
+11 −0
Original line number Diff line number Diff line
@@ -29,4 +29,15 @@ object AccountManagerConstants {
    const val OPEN_APP_ACTIVITY_AFTER_AUTH = "open_app_activity_after_auth"

    const val IGNORE_ACCOUNT_SETUP = "ignore_account_setup"

    val OPENID_ACCOUNT_TYPES = listOf(GOOGLE_ACCOUNT_TYPE, YAHOO_ACCOUNT_TYPE)
    val ALL_ACCOUNT_TYPES = listOf(EELO_ACCOUNT_TYPE, GOOGLE_ACCOUNT_TYPE, YAHOO_ACCOUNT_TYPE)

    fun getOpenIdAccountTypeByHostName(hostname: String): String? {
        return when(hostname) {
            in listOf("imap.gmail.com", "imap.googlemail.com", "smtp.gmail.com", "smtp.googlemail.com") -> GOOGLE_ACCOUNT_TYPE
            in listOf("imap.mail.yahoo.com", "smtp.mail.yahoo.com") -> YAHOO_ACCOUNT_TYPE
            else -> null
        }
    }
}
+25 −19
Original line number Diff line number Diff line
@@ -16,13 +16,13 @@

package com.fsck.k9.setup

import android.accounts.Account as OsAccount
import android.accounts.AccountManager as OsAccountManager
import android.content.Context
import com.fsck.k9.Account
import com.fsck.k9.mail.AuthType
import com.fsck.k9.preferences.AccountManager
import timber.log.Timber
import android.accounts.Account as OsAccount
import android.accounts.AccountManager as OsAccountManager

object EeloAccountHelper {

@@ -45,19 +45,17 @@ object EeloAccountHelper {

        val osAccountManager = OsAccountManager.get(context)

        val googleAccount = retrieveOpenIdAccountFromAccountManager(osAccountManager, AccountManagerConstants.GOOGLE_ACCOUNT_TYPE, account.email)
        if (googleAccount != null) {
            updateOAuthState(account, osAccountManager, googleAccount, accountManager)
            return true
        var result = false
        AccountManagerConstants.OPENID_ACCOUNT_TYPES.forEach {
            val openIdAccount = retrieveOpenIdAccountFromAccountManager(osAccountManager, it, account.email)
            if (openIdAccount != null) {
                updateOAuthState(account, osAccountManager, openIdAccount, accountManager)
                result = true
                return@forEach
            }

        val yahooAccount = retrieveOpenIdAccountFromAccountManager(osAccountManager, AccountManagerConstants.YAHOO_ACCOUNT_TYPE, account.email)
        if (yahooAccount != null) {
            updateOAuthState(account, osAccountManager, yahooAccount, accountManager)
            return true
        }

        return false
        return result
    }

    private fun updateOAuthState(
@@ -75,7 +73,7 @@ object EeloAccountHelper {
        context: Context?,
        account: OsAccount?,
        authState: String?,
        accessToken: String?
        accessToken: String?,
    ) {
        if (context == null || account == null || authState == null || accessToken == null) {
            Timber.w("updating account for accountManager failed, invalid param.")
@@ -95,15 +93,23 @@ object EeloAccountHelper {

        val accountManager = OsAccountManager.get(context)

        val googleAccount = retrieveOpenIdAccountFromAccountManager(accountManager, AccountManagerConstants.GOOGLE_ACCOUNT_TYPE, email)
        if (googleAccount != null) {
            return googleAccount;
        var resultAccount: OsAccount? = null

        AccountManagerConstants.OPENID_ACCOUNT_TYPES.forEach {
            resultAccount = retrieveOpenIdAccountFromAccountManager(accountManager, it, email)
            if (resultAccount != null) {
                return@forEach
            }
        }

        return retrieveOpenIdAccountFromAccountManager(accountManager, AccountManagerConstants.YAHOO_ACCOUNT_TYPE, email)
        return resultAccount
    }

    private fun retrieveOpenIdAccountFromAccountManager(accountManager: OsAccountManager?, accountType: String, email: String?): OsAccount? {
    private fun retrieveOpenIdAccountFromAccountManager(
        accountManager: OsAccountManager?,
        accountType: String,
        email: String?,
    ): OsAccount? {
        if (accountManager == null || email.isNullOrEmpty()) {
            Timber.w("retrieve $accountType account from accountManager failed, invalid param")
            return null
+2 −3
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import com.fsck.k9.setup.AccountManagerConstants
import java.util.concurrent.Executors
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import timber.log.Timber

class AccountSyncReceiver : BroadcastReceiver(), KoinComponent {

@@ -41,7 +40,6 @@ class AccountSyncReceiver : BroadcastReceiver(), KoinComponent {
        private const val ACCOUNT_CREATION_ACTION = "$ACTION_PREFIX.create"
        private const val ACCOUNT_REMOVAL_ACTION = "android.accounts.action.ACCOUNT_REMOVED"

        private val ACCOUNT_TYPES = listOf(AccountManagerConstants.EELO_ACCOUNT_TYPE, AccountManagerConstants.GOOGLE_ACCOUNT_TYPE, AccountManagerConstants.YAHOO_ACCOUNT_TYPE)
    }

    private val pushController: PushController by inject()
@@ -49,6 +47,7 @@ class AccountSyncReceiver : BroadcastReceiver(), KoinComponent {
    private val accountRemover: BackgroundAccountRemover by inject()
    private val jobManager: K9JobManager by inject()

    @RequiresApi(Build.VERSION_CODES.N)
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent == null) {
            return
@@ -84,7 +83,7 @@ class AccountSyncReceiver : BroadcastReceiver(), KoinComponent {
    private fun getAccount(intent: Intent) : Account? {
        val accountType = intent.extras?.getString(AccountManager.KEY_ACCOUNT_TYPE)

        if (!ACCOUNT_TYPES.contains(accountType)) {
        if (!AccountManagerConstants.ALL_ACCOUNT_TYPES.contains(accountType)) {
            return null
        }

Loading