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

Commit fcf0061e authored by Alon Albert's avatar Alon Albert Committed by Android (Google) Code Review
Browse files

Merge "Skip operations for users who are not running" into jb-mr1-dev

parents 0ff65375 8e28555f
Loading
Loading
Loading
Loading
+53 −12
Original line number Diff line number Diff line
@@ -16,10 +16,6 @@

package android.content;

import com.android.internal.R;
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;

import android.accounts.Account;
import android.accounts.AccountAndUser;
import android.accounts.AccountManager;
@@ -27,7 +23,6 @@ import android.accounts.AccountManagerService;
import android.accounts.OnAccountsUpdateListener;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -62,6 +57,11 @@ import android.util.EventLog;
import android.util.Log;
import android.util.Pair;

import com.android.internal.R;
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
import com.google.android.collect.Sets;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -75,6 +75,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CountDownLatch;

/**
@@ -151,7 +152,7 @@ public class SyncManager implements OnAccountsUpdateListener {
    private AlarmManager mAlarmService = null;

    private SyncStorageEngine mSyncStorageEngine;
    public SyncQueue mSyncQueue;
    final public SyncQueue mSyncQueue;

    protected final ArrayList<ActiveSyncContext> mActiveSyncContexts = Lists.newArrayList();

@@ -328,7 +329,21 @@ public class SyncManager implements OnAccountsUpdateListener {
    private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
            if (Intent.ACTION_USER_REMOVED.equals(action)) {
                Log.i(TAG, "User removed - cleanup: u" + userId);
                onUserRemoved(intent);
            } else if (Intent.ACTION_USER_STARTED.equals(action)) {
                Log.i(TAG, "User started - check alarms: u" + userId);
                sendCheckAlarmsMessage();
            } else if (Intent.ACTION_USER_STOPPED.equals(action)) {
                Log.i(TAG, "User stopped - stop syncs: u" + userId);
                cancelActiveSync(
                        null /* any account */,
                        userId,
                        null /* any authority */);
            }
        }
    };

@@ -401,7 +416,9 @@ public class SyncManager implements OnAccountsUpdateListener {

        intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_USER_REMOVED);
        mContext.registerReceiver(mUserIntentReceiver, intentFilter);
        intentFilter.addAction(Intent.ACTION_USER_STARTED);
        mContext.registerReceiverAsUser(
                mUserIntentReceiver, UserHandle.ALL, intentFilter, null, null);

        if (!factoryTest) {
            mNotificationMgr = (NotificationManager)
@@ -897,7 +914,10 @@ public class SyncManager implements OnAccountsUpdateListener {
    private void onUserRemoved(Intent intent) {
        int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
        if (userId == -1) return;
        removeUser(userId);
    }

    private void removeUser(int userId) {
        // Clean up the storage engine database
        mSyncStorageEngine.doDatabaseCleanup(new Account[0], userId);
        onAccountsUpdated(null);
@@ -1267,7 +1287,8 @@ public class SyncManager implements OnAccountsUpdateListener {
                final String accountKey;
                if (authority != null) {
                    authorityName = authority.authority;
                    accountKey = authority.account.name + "/" + authority.account.type;
                    accountKey = authority.account.name + "/" + authority.account.type
                            + " u" + authority.userId;
                } else {
                    authorityName = "Unknown";
                    accountKey = "Unknown";
@@ -1394,7 +1415,8 @@ public class SyncManager implements OnAccountsUpdateListener {
                final String accountKey;
                if (authority != null) {
                    authorityName = authority.authority;
                    accountKey = authority.account.name + "/" + authority.account.type;
                    accountKey = authority.account.name + "/" + authority.account.type
                            + " u" + authority.userId;
                } else {
                    authorityName = "Unknown";
                    accountKey = "Unknown";
@@ -1924,6 +1946,10 @@ public class SyncManager implements OnAccountsUpdateListener {
                }
                Iterator<SyncOperation> operationIterator =
                        mSyncQueue.mOperationsMap.values().iterator();

                final ActivityManager activityManager
                        = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
                final Set<Integer> removedUsers = Sets.newHashSet();
                while (operationIterator.hasNext()) {
                    final SyncOperation op = operationIterator.next();

@@ -1943,6 +1969,15 @@ public class SyncManager implements OnAccountsUpdateListener {
                        continue;
                    }

                    // if the user in not running, drop the request
                    if (!activityManager.isUserRunning(op.userId)) {
                        final UserInfo userInfo = mUserManager.getUserInfo(op.userId);
                        if (userInfo == null) {
                            removedUsers.add(op.userId);
                        }
                        continue;
                    }

                    // if the next run time is in the future, meaning there are no syncs ready
                    // to run, return the time
                    if (op.effectiveRunTime > now) {
@@ -1983,6 +2018,12 @@ public class SyncManager implements OnAccountsUpdateListener {

                    operations.add(op);
                }
                for (Integer user : removedUsers) {
                    // if it's still removed
                    if (mUserManager.getUserInfo(user) == null) {
                        removeUser(user);
                    }
                }
            }

            // find the next operation to dispatch, if one is ready
@@ -2168,13 +2209,13 @@ public class SyncManager implements OnAccountsUpdateListener {
                    new ArrayList<ActiveSyncContext>(mActiveSyncContexts);
            for (ActiveSyncContext activeSyncContext : activeSyncs) {
                if (activeSyncContext != null) {
                    // if an authority was specified then only cancel the sync if it matches
                    // if an account was specified then only cancel the sync if it matches
                    if (account != null) {
                        if (!account.equals(activeSyncContext.mSyncOperation.account)) {
                            continue;
                        }
                    }
                    // if an account was specified then only cancel the sync if it matches
                    // if an authority was specified then only cancel the sync if it matches
                    if (authority != null) {
                        if (!authority.equals(activeSyncContext.mSyncOperation.authority)) {
                            continue;
+12 −7
Original line number Diff line number Diff line
@@ -95,13 +95,18 @@ public class SyncOperation implements Comparable {
    }

    public String dump(boolean useOneLine) {
        StringBuilder sb = new StringBuilder();
        sb.append(account.name);
        sb.append(" (" + account.type + ")");
        sb.append(", " + authority);
        sb.append(", ");
        sb.append(SyncStorageEngine.SOURCES[syncSource]);
        sb.append(", earliestRunTime " + earliestRunTime);
        StringBuilder sb = new StringBuilder()
                .append(account.name)
                .append(" u")
                .append(userId).append(" (")
                .append(account.type)
                .append(")")
                .append(", ")
                .append(authority)
                .append(", ")
                .append(SyncStorageEngine.SOURCES[syncSource])
                .append(", earliestRunTime ")
                .append(earliestRunTime);
        if (expedited) {
            sb.append(", EXPEDITED");
        }