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

Commit fccb14ed authored by Rubin Xu's avatar Rubin Xu Committed by Android (Google) Code Review
Browse files

Merge "Only cancel syncs for non-existent accounts" into nyc-dev

parents 22e2769c 2c548e0e
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -1402,12 +1402,24 @@ public class SyncManager {
        }
    }

    private void restoreLostPeriodicSyncsIfNeeded(int userId) {
        List<SyncOperation> periodicSyncs = new ArrayList<SyncOperation>();
        for (SyncOperation sync : getAllPendingSyncs()) {
            if (sync.isPeriodic && sync.target.userId == userId) {
                periodicSyncs.add(sync);
            }
        }
        mSyncStorageEngine.restorePeriodicSyncsIfNeededForUser(userId, periodicSyncs);
    }

    private void onUserUnlocked(int userId) {
        // Make sure that accounts we're about to use are valid.
        AccountManagerService.getSingleton().validateAccounts(userId);

        mSyncAdapters.invalidateCache(userId);

        restoreLostPeriodicSyncsIfNeeded(userId);

        EndPoint target = new EndPoint(null, null, userId);
        updateRunningAccounts(target);

@@ -2578,9 +2590,11 @@ public class SyncManager {
                }
            }

            // Cancel all jobs from non-existent accounts.
            AccountAndUser[] allAccounts = AccountManagerService.getSingleton().getAllAccounts();
            List<SyncOperation> ops = getAllPendingSyncs();
            for (SyncOperation op: ops) {
                if (!containsAccountAndUser(accounts, op.target.account, op.target.userId)) {
                if (!containsAccountAndUser(allAccounts, op.target.account, op.target.userId)) {
                    getJobScheduler().cancel(op.jobId);
                }
            }
+29 −0
Original line number Diff line number Diff line
@@ -826,6 +826,35 @@ public class SyncStorageEngine extends Handler {
        return true;
    }

    /**
     * STOPSHIP This is a temporary workaround and should be removed before shipping: b/28052438
     */
    void restorePeriodicSyncsIfNeededForUser(int userHandle, List<SyncOperation> periodicSyncs) {
        if (mPeriodicSyncAddedListener == null) {
            return;
        }
        synchronized (mAuthorities) {
            for (int i = 0; i < mAuthorities.size(); i++) {
                AuthorityInfo authority = mAuthorities.valueAt(i);
                if (authority.target.userId == userHandle && authority.enabled) {
                    boolean periodicSyncAlreadyExists = false;
                    for (SyncOperation sync : periodicSyncs) {
                        if (authority.target.matchesSpec(sync.target)) {
                            periodicSyncAlreadyExists = true;
                            break;
                        }
                    }
                    // The periodic sync must have been lost due to previous bug.
                    if (!periodicSyncAlreadyExists) {
                        mPeriodicSyncAddedListener.onPeriodicSyncAdded(authority.target,
                                new Bundle(), DEFAULT_POLL_FREQUENCY_SECONDS,
                                calculateDefaultFlexTime(DEFAULT_POLL_FREQUENCY_SECONDS));
                    }
                }
            }
        }
    }

    public void setMasterSyncAutomatically(boolean flag, int userId) {
        synchronized (mAuthorities) {
            Boolean auto = mMasterSyncAutomatically.get(userId);