Ensure that EAS reconciler uses current account list
Bug: 3369380
Change-Id: I00f18f0848232ea90149fb6e243f147d0e6f5c0f
diff --git a/src/com/android/exchange/ExchangeService.java b/src/com/android/exchange/ExchangeService.java
index 0ce8dfc..8a82f81 100644
--- a/src/com/android/exchange/ExchangeService.java
+++ b/src/com/android/exchange/ExchangeService.java
@@ -464,6 +464,28 @@
}
};
+ private static AccountList collectEasAccounts(Context context, AccountList accounts) {
+ Cursor c = context.getContentResolver().query(Account.CONTENT_URI,
+ Account.CONTENT_PROJECTION, null, null, null);
+ try {
+ while (c.moveToNext()) {
+ long hostAuthId = c.getLong(Account.CONTENT_HOST_AUTH_KEY_RECV_COLUMN);
+ if (hostAuthId > 0) {
+ HostAuth ha = HostAuth.restoreHostAuthWithId(context, hostAuthId);
+ if (ha != null && ha.mProtocol.equals("eas")) {
+ Account account = new Account().restore(c);
+ // Cache the HostAuth
+ account.mHostAuthRecv = ha;
+ accounts.add(account);
+ }
+ }
+ }
+ } finally {
+ c.close();
+ }
+ return accounts;
+ }
+
static class AccountList extends ArrayList<Account> {
private static final long serialVersionUID = 1L;
@@ -523,15 +545,7 @@
// At startup, we want to see what EAS accounts exist and cache them
Context context = getContext();
synchronized (mAccountList) {
- Cursor c = getContentResolver().query(Account.CONTENT_URI,
- Account.CONTENT_PROJECTION, null, null, null);
- // Build the account list from the cursor
- try {
- collectEasAccounts(c, mAccountList);
- } finally {
- c.close();
- }
-
+ collectEasAccounts(context, mAccountList);
// Create an account mailbox for any account without one
for (Account account : mAccountList) {
int cnt = Mailbox.count(context, Mailbox.CONTENT_URI, "accountKey="
@@ -603,81 +617,74 @@
// A change to the list requires us to scan for deletions (stop running syncs)
// At startup, we want to see what accounts exist and cache them
- AccountList currentAccounts = new AccountList();
- Cursor c = getContentResolver().query(Account.CONTENT_URI,
- Account.CONTENT_PROJECTION, null, null, null);
- try {
- collectEasAccounts(c, currentAccounts);
- synchronized (mAccountList) {
- for (Account account : mAccountList) {
- boolean accountIncomplete =
- (account.mFlags & Account.FLAGS_INCOMPLETE) != 0;
- // If the current list doesn't include this account and the account wasn't
- // incomplete, then this is a deletion
- if (!currentAccounts.contains(account.mId) && !accountIncomplete) {
- // Shut down any account-related syncs
+ AccountList currentAccounts = collectEasAccounts(context, new AccountList());
+ synchronized (mAccountList) {
+ for (Account account : mAccountList) {
+ boolean accountIncomplete =
+ (account.mFlags & Account.FLAGS_INCOMPLETE) != 0;
+ // If the current list doesn't include this account and the account wasn't
+ // incomplete, then this is a deletion
+ if (!currentAccounts.contains(account.mId) && !accountIncomplete) {
+ // Shut down any account-related syncs
+ stopAccountSyncs(account.mId, true);
+ // Delete this from AccountManager...
+ android.accounts.Account acct = new android.accounts.Account(
+ account.mEmailAddress, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
+ AccountManager.get(ExchangeService.this)
+ .removeAccount(acct, null, null);
+ mSyncableEasMailboxSelector = null;
+ mEasAccountSelector = null;
+ } else {
+ // Get the newest version of this account
+ Account updatedAccount =
+ Account.restoreAccountWithId(context, account.mId);
+ if (updatedAccount == null) continue;
+ if (account.mSyncInterval != updatedAccount.mSyncInterval
+ || account.mSyncLookback != updatedAccount.mSyncLookback) {
+ // Set the inbox interval to the interval of the Account
+ // This setting should NOT affect other boxes
+ ContentValues cv = new ContentValues();
+ cv.put(MailboxColumns.SYNC_INTERVAL, updatedAccount.mSyncInterval);
+ getContentResolver().update(Mailbox.CONTENT_URI, cv,
+ WHERE_IN_ACCOUNT_AND_TYPE_INBOX, new String[] {
+ Long.toString(account.mId)
+ });
+ // Stop all current syncs; the appropriate ones will restart
+ log("Account " + account.mDisplayName + " changed; stop syncs");
stopAccountSyncs(account.mId, true);
- // Delete this from AccountManager...
- android.accounts.Account acct = new android.accounts.Account(
- account.mEmailAddress, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
- AccountManager.get(ExchangeService.this)
- .removeAccount(acct, null, null);
- mSyncableEasMailboxSelector = null;
- mEasAccountSelector = null;
- } else {
- // Get the newest version of this account
- Account updatedAccount =
- Account.restoreAccountWithId(context, account.mId);
- if (updatedAccount == null) continue;
- if (account.mSyncInterval != updatedAccount.mSyncInterval
- || account.mSyncLookback != updatedAccount.mSyncLookback) {
- // Set the inbox interval to the interval of the Account
- // This setting should NOT affect other boxes
- ContentValues cv = new ContentValues();
- cv.put(MailboxColumns.SYNC_INTERVAL, updatedAccount.mSyncInterval);
- getContentResolver().update(Mailbox.CONTENT_URI, cv,
- WHERE_IN_ACCOUNT_AND_TYPE_INBOX, new String[] {
- Long.toString(account.mId)
- });
- // Stop all current syncs; the appropriate ones will restart
- log("Account " + account.mDisplayName + " changed; stop syncs");
- stopAccountSyncs(account.mId, true);
- }
-
- // See if this account is no longer on security hold
- if (onSecurityHold(account) && !onSecurityHold(updatedAccount)) {
- releaseSyncHolds(ExchangeService.this,
- AbstractSyncService.EXIT_SECURITY_FAILURE, account);
- }
-
- // Put current values into our cached account
- account.mSyncInterval = updatedAccount.mSyncInterval;
- account.mSyncLookback = updatedAccount.mSyncLookback;
- account.mFlags = updatedAccount.mFlags;
}
- }
- // Look for new accounts
- for (Account account : currentAccounts) {
- if (!mAccountList.contains(account.mId)) {
- // Don't forget to cache the HostAuth
- HostAuth ha = HostAuth.restoreHostAuthWithId(getContext(),
- account.mHostAuthKeyRecv);
- if (ha == null) continue;
- account.mHostAuthRecv = ha;
- // This is an addition; create our magic hidden mailbox...
- log("Account observer found new account: " + account.mDisplayName);
- addAccountMailbox(account.mId);
- mAccountList.add(account);
- mSyncableEasMailboxSelector = null;
- mEasAccountSelector = null;
+
+ // See if this account is no longer on security hold
+ if (onSecurityHold(account) && !onSecurityHold(updatedAccount)) {
+ releaseSyncHolds(ExchangeService.this,
+ AbstractSyncService.EXIT_SECURITY_FAILURE, account);
}
+
+ // Put current values into our cached account
+ account.mSyncInterval = updatedAccount.mSyncInterval;
+ account.mSyncLookback = updatedAccount.mSyncLookback;
+ account.mFlags = updatedAccount.mFlags;
}
- // Finally, make sure our account list is up to date
- mAccountList.clear();
- mAccountList.addAll(currentAccounts);
}
- } finally {
- c.close();
+ // Look for new accounts
+ for (Account account : currentAccounts) {
+ if (!mAccountList.contains(account.mId)) {
+ // Don't forget to cache the HostAuth
+ HostAuth ha = HostAuth.restoreHostAuthWithId(getContext(),
+ account.mHostAuthKeyRecv);
+ if (ha == null) continue;
+ account.mHostAuthRecv = ha;
+ // This is an addition; create our magic hidden mailbox...
+ log("Account observer found new account: " + account.mDisplayName);
+ addAccountMailbox(account.mId);
+ mAccountList.add(account);
+ mSyncableEasMailboxSelector = null;
+ mEasAccountSelector = null;
+ }
+ }
+ // Finally, make sure our account list is up to date
+ mAccountList.clear();
+ mAccountList.addAll(currentAccounts);
}
// See if there's anything to do...
@@ -692,23 +699,6 @@
}}, "Account Observer").start();
}
- private void collectEasAccounts(Cursor c, ArrayList<Account> accounts) {
- Context context = getContext();
- if (context == null) return;
- while (c.moveToNext()) {
- long hostAuthId = c.getLong(Account.CONTENT_HOST_AUTH_KEY_RECV_COLUMN);
- if (hostAuthId > 0) {
- HostAuth ha = HostAuth.restoreHostAuthWithId(context, hostAuthId);
- if (ha != null && ha.mProtocol.equals("eas")) {
- Account account = new Account().restore(c);
- // Cache the HostAuth
- account.mHostAuthRecv = ha;
- accounts.add(account);
- }
- }
- }
- }
-
private void addAccountMailbox(long acctId) {
Account acct = Account.restoreAccountWithId(getContext(), acctId);
Mailbox main = new Mailbox();
@@ -1044,16 +1034,13 @@
private void runAccountReconcilerSync(Context context) {
android.accounts.Account[] accountMgrList = AccountManager.get(context)
.getAccountsByType(Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
- synchronized (mAccountList) {
- // Make sure we have an up-to-date sAccountList. If not (for example, if the
- // service has been destroyed), we would be reconciling against an empty account
- // list, which would cause the deletion of all of our accounts
- if (mAccountObserver != null) {
- mAccountObserver.onAccountChanged();
- MailService.reconcileAccountsWithAccountManager(context,
- mAccountList, accountMgrList, false, mResolver);
- }
- }
+ // Make sure we have an up-to-date sAccountList. If not (for example, if the
+ // service has been destroyed), we would be reconciling against an empty account
+ // list, which would cause the deletion of all of our accounts
+ AccountList accountList = collectEasAccounts(context, new AccountList());
+ alwaysLog("Reconciling accounts...");
+ MailService.reconcileAccountsWithAccountManager(context, accountList, accountMgrList,
+ false, context.getContentResolver());
}
public static void log(String str) {