Loading app/core/src/main/java/com/fsck/k9/setup/EeloAccountHelper.kt +26 −11 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Context import com.fsck.k9.Account import com.fsck.k9.mail.AuthType import com.fsck.k9.preferences.AccountManager import kotlin.streams.toList import timber.log.Timber object EeloAccountHelper { Loading @@ -44,8 +45,8 @@ object EeloAccountHelper { } val osAccountManager = OsAccountManager.get(context) val googleAccount = retrieveGoogleAccountFromAccountManager(osAccountManager, account.email) ?: return false account.oAuthState = osAccountManager.getUserData(googleAccount, AccountManagerConstants.KEY_AUTH_STATE) val authAccount = retrieveAuthAccountFromAccountManager(osAccountManager, account.email) ?: return false account.oAuthState = osAccountManager.getUserData(authAccount, AccountManagerConstants.KEY_AUTH_STATE) accountManager.saveAccount(account) return true } Loading @@ -67,30 +68,44 @@ object EeloAccountHelper { accountManager.setUserData(account, AccountManagerConstants.KEY_AUTH_STATE, authState) } fun retrieveGoogleAccountFromAccountManager(context: Context?, email: String?): OsAccount? { fun retrieveAuthAccountFromAccountManager(context: Context?, email: String?): OsAccount? { if (context == null) { Timber.w("retrieve google accounts from accountManager failed, null context.") Timber.w("retrieve accounts from accountManager failed, null context.") return null } val accountManager = OsAccountManager.get(context) return retrieveGoogleAccountFromAccountManager(accountManager, email) return retrieveAuthAccountFromAccountManager(accountManager, email) } private fun retrieveGoogleAccountFromAccountManager(accountManager: OsAccountManager?, email: String?): OsAccount? { private fun retrieveAuthAccountFromAccountManager(accountManager: OsAccountManager?, email: String?): android.accounts.Account? { if (accountManager == null || email == null || email.isEmpty()) { Timber.w("retrieve google 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 accounts = getAuthAccounts(accountManager) for (account in accounts) { val emailId = accountManager.getUserData(account, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY) if (email.equals(emailId, ignoreCase = true)) { return googleAccount return account } } return null } private fun getAuthAccounts(accountManager: OsAccountManager): List<android.accounts.Account> { val murenaAccounts = accountManager.getAccountsByType(AccountManagerConstants.EELO_ACCOUNT_TYPE) val googleAccounts = accountManager.getAccountsByType(AccountManagerConstants.GOOGLE_ACCOUNT_TYPE) val authAccounts = ArrayList<android.accounts.Account>() authAccounts.addAll(murenaAccounts) authAccounts.addAll(googleAccounts) return authAccounts.stream() .filter{ val authState = accountManager.getUserData(it, AccountManagerConstants.KEY_AUTH_STATE) authState != null &&authState.trim().isNotEmpty() }.toList() } } app/k9mail/src/main/java/com/fsck/k9/backends/RealOAuth2TokenProvider.kt +1 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ class RealOAuth2TokenProvider( ?: throw AuthenticationFailedException("Login required") } val accountManagerAccount = EeloAccountHelper.retrieveGoogleAccountFromAccountManager(context, email) val accountManagerAccount = EeloAccountHelper.retrieveAuthAccountFromAccountManager(context, email) val latch = CountDownLatch(1) var token: String? = null Loading app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java +9 −10 Original line number Diff line number Diff line Loading @@ -16,17 +16,14 @@ package com.fsck.k9.activity.setup.accountmanager; import java.util.List; import android.accounts.AccountManager; import android.content.ContentResolver; import android.content.Context; import android.os.Build.VERSION_CODES; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.annotation.WorkerThread; import com.fsck.k9.Account; import com.fsck.k9.Account.DeletePolicy; Loading @@ -48,13 +45,11 @@ import com.fsck.k9.setup.AccountManagerConstants; import com.fsck.k9.ui.ConnectionSettings; import timber.log.Timber; public class EeloAccountCreator { private static final ProvidersXmlDiscovery providersXmlDiscovery = DI.get(ProvidersXmlDiscovery.class); private static final AccountCreator accountCreator = DI.get(AccountCreator.class); private static final SpecialLocalFoldersCreator localFoldersCreator = DI.get(SpecialLocalFoldersCreator.class); @RequiresApi(api = VERSION_CODES.N) @WorkerThread public static void loadAccountsFromAccountManager(@NonNull Context context, @NonNull Preferences preferences, @NonNull BackgroundAccountRemover accountRemover, @NonNull K9JobManager jobManager, @Nullable OnAccountLoadCompleteCallBack callBack) { Loading Loading @@ -88,7 +83,6 @@ public class EeloAccountCreator { return ContentResolver.getSyncAutomatically(account, AccountManagerConstants.MAIL_CONTENT_AUTHORITY); } @RequiresApi(api = VERSION_CODES.N) private static void loadGoogleAccounts(@NonNull Context context, List<Account> accounts, @NonNull AccountManager accountManager, @NonNull K9JobManager jobManager) { android.accounts.Account[] googleAccounts = Loading Loading @@ -130,7 +124,6 @@ public class EeloAccountCreator { return emailId == null || !emailId.contains("@"); } @RequiresApi(api = VERSION_CODES.N) private static void loadEeloAccounts(@NonNull Context context, List<Account> accounts, @NonNull AccountManager accountManager, @NonNull K9JobManager jobManager) { android.accounts.Account[] eeloAccounts = Loading @@ -151,7 +144,8 @@ public class EeloAccountCreator { if (!existenceAccount.isPresent()) { String password = accountManager.getPassword(eeloAccount); createAccount(context, emailId, password, null); String authState = accountManager.getUserData(eeloAccount, AccountManagerConstants.KEY_AUTH_STATE); createAccount(context, emailId, (password != null ? password : ""), authState); continue; } Loading @@ -159,7 +153,6 @@ public class EeloAccountCreator { } } @RequiresApi(api = VERSION_CODES.N) private static void deleteIncompleteAccounts(List<Account> accounts, BackgroundAccountRemover accountRemover) { accounts.stream().filter(account -> !account.isFinishedSetup()) .forEach(account -> accountRemover.removeAccountAsync(account.getUuid())); Loading Loading @@ -190,8 +183,14 @@ public class EeloAccountCreator { return; } ServerSettings incomingSettings = connectionSettings.getIncoming().newPassword(password); account.setIncomingServerSettings(incomingSettings); ServerSettings outgoingSettings = connectionSettings.getOutgoing().newPassword(password); if (authState != null && !authState.trim().isEmpty()) { incomingSettings = incomingSettings.newAuthenticationType(AuthType.XOAUTH2); outgoingSettings = outgoingSettings.newAuthenticationType(AuthType.XOAUTH2); } account.setIncomingServerSettings(incomingSettings); account.setOutgoingServerSettings(outgoingSettings); account.setOAuthState(authState); Loading Loading
app/core/src/main/java/com/fsck/k9/setup/EeloAccountHelper.kt +26 −11 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Context import com.fsck.k9.Account import com.fsck.k9.mail.AuthType import com.fsck.k9.preferences.AccountManager import kotlin.streams.toList import timber.log.Timber object EeloAccountHelper { Loading @@ -44,8 +45,8 @@ object EeloAccountHelper { } val osAccountManager = OsAccountManager.get(context) val googleAccount = retrieveGoogleAccountFromAccountManager(osAccountManager, account.email) ?: return false account.oAuthState = osAccountManager.getUserData(googleAccount, AccountManagerConstants.KEY_AUTH_STATE) val authAccount = retrieveAuthAccountFromAccountManager(osAccountManager, account.email) ?: return false account.oAuthState = osAccountManager.getUserData(authAccount, AccountManagerConstants.KEY_AUTH_STATE) accountManager.saveAccount(account) return true } Loading @@ -67,30 +68,44 @@ object EeloAccountHelper { accountManager.setUserData(account, AccountManagerConstants.KEY_AUTH_STATE, authState) } fun retrieveGoogleAccountFromAccountManager(context: Context?, email: String?): OsAccount? { fun retrieveAuthAccountFromAccountManager(context: Context?, email: String?): OsAccount? { if (context == null) { Timber.w("retrieve google accounts from accountManager failed, null context.") Timber.w("retrieve accounts from accountManager failed, null context.") return null } val accountManager = OsAccountManager.get(context) return retrieveGoogleAccountFromAccountManager(accountManager, email) return retrieveAuthAccountFromAccountManager(accountManager, email) } private fun retrieveGoogleAccountFromAccountManager(accountManager: OsAccountManager?, email: String?): OsAccount? { private fun retrieveAuthAccountFromAccountManager(accountManager: OsAccountManager?, email: String?): android.accounts.Account? { if (accountManager == null || email == null || email.isEmpty()) { Timber.w("retrieve google 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 accounts = getAuthAccounts(accountManager) for (account in accounts) { val emailId = accountManager.getUserData(account, AccountManagerConstants.ACCOUNT_EMAIL_ADDRESS_KEY) if (email.equals(emailId, ignoreCase = true)) { return googleAccount return account } } return null } private fun getAuthAccounts(accountManager: OsAccountManager): List<android.accounts.Account> { val murenaAccounts = accountManager.getAccountsByType(AccountManagerConstants.EELO_ACCOUNT_TYPE) val googleAccounts = accountManager.getAccountsByType(AccountManagerConstants.GOOGLE_ACCOUNT_TYPE) val authAccounts = ArrayList<android.accounts.Account>() authAccounts.addAll(murenaAccounts) authAccounts.addAll(googleAccounts) return authAccounts.stream() .filter{ val authState = accountManager.getUserData(it, AccountManagerConstants.KEY_AUTH_STATE) authState != null &&authState.trim().isNotEmpty() }.toList() } }
app/k9mail/src/main/java/com/fsck/k9/backends/RealOAuth2TokenProvider.kt +1 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ class RealOAuth2TokenProvider( ?: throw AuthenticationFailedException("Login required") } val accountManagerAccount = EeloAccountHelper.retrieveGoogleAccountFromAccountManager(context, email) val accountManagerAccount = EeloAccountHelper.retrieveAuthAccountFromAccountManager(context, email) val latch = CountDownLatch(1) var token: String? = null Loading
app/ui/legacy/src/main/java/com/fsck/k9/activity/setup/accountmanager/EeloAccountCreator.java +9 −10 Original line number Diff line number Diff line Loading @@ -16,17 +16,14 @@ package com.fsck.k9.activity.setup.accountmanager; import java.util.List; import android.accounts.AccountManager; import android.content.ContentResolver; import android.content.Context; import android.os.Build.VERSION_CODES; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.annotation.WorkerThread; import com.fsck.k9.Account; import com.fsck.k9.Account.DeletePolicy; Loading @@ -48,13 +45,11 @@ import com.fsck.k9.setup.AccountManagerConstants; import com.fsck.k9.ui.ConnectionSettings; import timber.log.Timber; public class EeloAccountCreator { private static final ProvidersXmlDiscovery providersXmlDiscovery = DI.get(ProvidersXmlDiscovery.class); private static final AccountCreator accountCreator = DI.get(AccountCreator.class); private static final SpecialLocalFoldersCreator localFoldersCreator = DI.get(SpecialLocalFoldersCreator.class); @RequiresApi(api = VERSION_CODES.N) @WorkerThread public static void loadAccountsFromAccountManager(@NonNull Context context, @NonNull Preferences preferences, @NonNull BackgroundAccountRemover accountRemover, @NonNull K9JobManager jobManager, @Nullable OnAccountLoadCompleteCallBack callBack) { Loading Loading @@ -88,7 +83,6 @@ public class EeloAccountCreator { return ContentResolver.getSyncAutomatically(account, AccountManagerConstants.MAIL_CONTENT_AUTHORITY); } @RequiresApi(api = VERSION_CODES.N) private static void loadGoogleAccounts(@NonNull Context context, List<Account> accounts, @NonNull AccountManager accountManager, @NonNull K9JobManager jobManager) { android.accounts.Account[] googleAccounts = Loading Loading @@ -130,7 +124,6 @@ public class EeloAccountCreator { return emailId == null || !emailId.contains("@"); } @RequiresApi(api = VERSION_CODES.N) private static void loadEeloAccounts(@NonNull Context context, List<Account> accounts, @NonNull AccountManager accountManager, @NonNull K9JobManager jobManager) { android.accounts.Account[] eeloAccounts = Loading @@ -151,7 +144,8 @@ public class EeloAccountCreator { if (!existenceAccount.isPresent()) { String password = accountManager.getPassword(eeloAccount); createAccount(context, emailId, password, null); String authState = accountManager.getUserData(eeloAccount, AccountManagerConstants.KEY_AUTH_STATE); createAccount(context, emailId, (password != null ? password : ""), authState); continue; } Loading @@ -159,7 +153,6 @@ public class EeloAccountCreator { } } @RequiresApi(api = VERSION_CODES.N) private static void deleteIncompleteAccounts(List<Account> accounts, BackgroundAccountRemover accountRemover) { accounts.stream().filter(account -> !account.isFinishedSetup()) .forEach(account -> accountRemover.removeAccountAsync(account.getUuid())); Loading Loading @@ -190,8 +183,14 @@ public class EeloAccountCreator { return; } ServerSettings incomingSettings = connectionSettings.getIncoming().newPassword(password); account.setIncomingServerSettings(incomingSettings); ServerSettings outgoingSettings = connectionSettings.getOutgoing().newPassword(password); if (authState != null && !authState.trim().isEmpty()) { incomingSettings = incomingSettings.newAuthenticationType(AuthType.XOAUTH2); outgoingSettings = outgoingSettings.newAuthenticationType(AuthType.XOAUTH2); } account.setIncomingServerSettings(incomingSettings); account.setOutgoingServerSettings(outgoingSettings); account.setOAuthState(authState); Loading