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

Commit d9be7216 authored by Shreyas Basarge's avatar Shreyas Basarge
Browse files

Bugfix for accountsUpdated receiver in SyncManager

Sync for all accounts/authorities/users could be
fired before the updated accounts were fetched. This
CL fixes the behavior. ContentResolverSyncTestCase
tests will now pass.

Bug: 26295466
Change-Id: Ia310337f2547448f0dd2ae9734755a8806efc5c2
parent a0b16caf
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -295,7 +295,7 @@ public class SyncManager {
    private final BroadcastReceiver mAccountsUpdatedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            updateRunningAccounts();
            updateRunningAccounts(true /* resync all targets */);

            // Kick off sync for everyone, since this was a radical account change
            scheduleSync(null, UserHandle.USER_ALL, SyncOperation.REASON_ACCOUNTS_UPDATED, null,
@@ -344,10 +344,12 @@ public class SyncManager {
        return found;
    }

    public void updateRunningAccounts() {
    private void updateRunningAccounts(boolean resyncAllTargets) {
        if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "sending MESSAGE_ACCOUNTS_UPDATED");
        // Update accounts in handler thread.
        mSyncHandler.sendEmptyMessage(SyncHandler.MESSAGE_ACCOUNTS_UPDATED);
        Message m = mSyncHandler.obtainMessage(SyncHandler.MESSAGE_ACCOUNTS_UPDATED);
        m.arg1 = resyncAllTargets ? 1 : 0;
        m.sendToTarget();
    }

    private void doDatabaseCleanup() {
@@ -1282,7 +1284,7 @@ public class SyncManager {

        mSyncAdapters.invalidateCache(userId);

        updateRunningAccounts();
        updateRunningAccounts(false);

        synchronized (mSyncQueue) {
            mSyncQueue.addPendingOperations(userId);
@@ -1301,7 +1303,7 @@ public class SyncManager {
    }

    private void onUserStopping(int userId) {
        updateRunningAccounts();
        updateRunningAccounts(false);

        cancelActiveSync(
                new SyncStorageEngine.EndPoint(
@@ -1313,7 +1315,7 @@ public class SyncManager {
    }

    private void onUserRemoved(int userId) {
        updateRunningAccounts();
        updateRunningAccounts(false);

        // Clean up the storage engine database
        mSyncStorageEngine.doDatabaseCleanup(new Account[0], userId);
@@ -2285,7 +2287,8 @@ public class SyncManager {
                        if (Log.isLoggable(TAG, Log.VERBOSE)) {
                            Log.v(TAG, "handleSyncHandlerMessage: MESSAGE_ACCOUNTS_UPDATED");
                        }
                        updateRunningAccountsH();
                        boolean resyncAllTargets = msg.arg1 == 0 ? false : true;
                        updateRunningAccountsH(resyncAllTargets);
                        break;

                    case SyncHandler.MESSAGE_CANCEL:
@@ -2869,7 +2872,7 @@ public class SyncManager {
            }
        }

        private void updateRunningAccountsH() {
        private void updateRunningAccountsH(boolean resyncAll) {
            mRunningAccounts = AccountManagerService.getSingleton().getRunningAccounts();

            if (mBootCompleted) {
@@ -2886,10 +2889,15 @@ public class SyncManager {
                            null /* no result since this is a cancel */);
                }
            }
            // we must do this since we don't bother scheduling alarms when
            // the accounts are not set yet

            if (resyncAll) {
                // Kick off sync for everyone, since this was a radical account change
                scheduleSync(null, UserHandle.USER_ALL, SyncOperation.REASON_ACCOUNTS_UPDATED, null,
                        null, 0 /* no delay */, 0/* no delay */, false);
            } else {
                sendCheckAlarmsMessage();
            }
        }

        private boolean isSyncNotUsingNetworkH(ActiveSyncContext activeSyncContext) {
            final long bytesTransferredCurrent =