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

This commit is contained in:
Alon Albert
2012-09-24 09:53:33 -07:00
committed by Android (Google) Code Review
2 changed files with 65 additions and 19 deletions

View File

@ -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) {
onUserRemoved(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;

View File

@ -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");
}