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

Commit 8e28555f authored by Alon Albert's avatar Alon Albert
Browse files

Skip operations for users who are not running

Listen to ACTION_USER_FOREGROUND and check alarms when it happens
Also add user logging to dumpsys

Bug: 7115753
Change-Id: Idb7881b62e31813feec684db8ff2e9d22e65a0f9
parent 4046e012
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");
        }