diff options
| -rw-r--r-- | services/core/java/com/android/server/content/SyncManager.java | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 2eb90952f6c4..c28ba2c90f08 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -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,9 +2889,14 @@ 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 - sendCheckAlarmsMessage(); + + 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) { |