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

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

6584-Add_yahoo_account_support

issue: https://gitlab.e.foundation/e/backlog/-/issues/6584

Add yahoo account support setup by accountManager
parent dccbe521
Loading
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -2,6 +2,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission
        android:name="android.permission.AUTHENTICATE_ACCOUNTS"
        android:maxSdkVersion="22" />
    <uses-permission
        android:name="android.permission.GET_ACCOUNTS"
        android:maxSdkVersion="22" />
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />

</manifest>
+7 −1
Original line number Diff line number Diff line
@@ -44,6 +44,12 @@ object OsAccountManagerUtil {
            return syncEnable.getStatus()
        }

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

        return true
    }

+4 −0
Original line number Diff line number Diff line
@@ -19,4 +19,8 @@ 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")
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.fsck.k9.setup
object AccountManagerConstants {
    const val EELO_ACCOUNT_TYPE = "e.foundation.webdav.eelo"
    const val GOOGLE_ACCOUNT_TYPE = "e.foundation.webdav.google"
    const val YAHOO_ACCOUNT_TYPE = "e.foundation.webdav.yahoo"
    const val ACCOUNT_EMAIL_ADDRESS_KEY = "email_address"
    const val MAIL_CONTENT_AUTHORITY = "foundation.e.mail.provider.AppContentProvider"
    const val AUTH_TOKEN_TYPE = "oauth2-access-token"
+38 −12
Original line number Diff line number Diff line
@@ -44,10 +44,30 @@ object EeloAccountHelper {
        }

        val osAccountManager = OsAccountManager.get(context)
        val googleAccount = retrieveGoogleAccountFromAccountManager(osAccountManager, account.email) ?: return false

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

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

        return false
    }

    private fun updateOAuthState(
        account: Account,
        osAccountManager: android.accounts.AccountManager,
        googleAccount: android.accounts.Account?,
        accountManager: AccountManager,
    ) {
        account.oAuthState = osAccountManager.getUserData(googleAccount, AccountManagerConstants.KEY_AUTH_STATE)
        accountManager.saveAccount(account)
        return true
    }

    // If token is updated by mail, also update the accountManager
@@ -67,27 +87,33 @@ object EeloAccountHelper {
        accountManager.setUserData(account, AccountManagerConstants.KEY_AUTH_STATE, authState)
    }

    fun retrieveGoogleAccountFromAccountManager(context: Context?, email: String?): OsAccount? {
    fun retrieveOpenIdAccountFromAccountManager(context: Context?, email: String?): OsAccount? {
        if (context == null) {
            Timber.w("retrieve google accounts from accountManager failed, null context.")
            return null
        }

        val accountManager = OsAccountManager.get(context)
        return retrieveGoogleAccountFromAccountManager(accountManager, email)

        val googleAccount = retrieveOpenIdAccountFromAccountManager(accountManager, AccountManagerConstants.GOOGLE_ACCOUNT_TYPE, email)
        if (googleAccount != null) {
            return googleAccount;
        }

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

    private fun retrieveGoogleAccountFromAccountManager(accountManager: OsAccountManager?, email: String?): OsAccount? {
        if (accountManager == null || email == null || email.isEmpty()) {
            Timber.w("retrieve google account from accountManager failed, invalid param")
    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
        }

        val googleAccounts = accountManager.getAccountsByType(AccountManagerConstants.GOOGLE_ACCOUNT_TYPE)
        for (googleAccount in googleAccounts) {
            val emailId = accountManager.getUserData(googleAccount, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY)
        val openIdAccounts = accountManager.getAccountsByType(accountType)
        for (openIdAccount in openIdAccounts) {
            val emailId = accountManager.getUserData(openIdAccount, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY)
            if (email.equals(emailId, ignoreCase = true)) {
                return googleAccount
                return openIdAccount
            }
        }

Loading