summaryrefslogtreecommitdiffstats
path: root/core/java/android/content/SyncQueue.java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2012-10-08 16:44:37 -0700
committerJeff Sharkey <jsharkey@android.com>2012-10-09 21:39:19 -0700
commit6ab72d74b86e5f4ec3c3909366fd46c225a66bd7 (patch)
tree20c8af2d052d6c20eac3b633b92f54ab2afa52a4 /core/java/android/content/SyncQueue.java
parentc0c0c0e612e1ccf1e55eb2a9338ddfff40d8d7f2 (diff)
downloadframeworks_base-6ab72d74b86e5f4ec3c3909366fd46c225a66bd7.zip
frameworks_base-6ab72d74b86e5f4ec3c3909366fd46c225a66bd7.tar.gz
frameworks_base-6ab72d74b86e5f4ec3c3909366fd46c225a66bd7.tar.bz2
Make RegisteredServicesCache multi-user aware.
RegisteredServicesCache is used to track account authenticators and sync adapters, which can vary based on user. This change requires that callers now provide a userId when making cache requests. It continues persisting into a single file for now, which is keyed based on UID. It now watches for package broadcasts from all users, and scans packages on-demand. It changes cache callers to provide a relevant userId, and evicts cache entries when users are stopped. Changes SyncManager to only work with accounts from running users, only kicking off pending syncs once a user is started. Bug: 7276595, 7316150 Change-Id: I79466a84aa69aa37e4bd9691c5d6221d3662ff29
Diffstat (limited to 'core/java/android/content/SyncQueue.java')
-rw-r--r--core/java/android/content/SyncQueue.java42
1 files changed, 25 insertions, 17 deletions
diff --git a/core/java/android/content/SyncQueue.java b/core/java/android/content/SyncQueue.java
index c18c86b..395658c 100644
--- a/core/java/android/content/SyncQueue.java
+++ b/core/java/android/content/SyncQueue.java
@@ -16,14 +16,15 @@
package android.content;
-import com.google.android.collect.Maps;
-
-import android.content.pm.RegisteredServicesCache;
+import android.accounts.Account;
+import android.content.pm.RegisteredServicesCache.ServiceInfo;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.text.format.DateUtils;
-import android.util.Pair;
import android.util.Log;
-import android.accounts.Account;
+import android.util.Pair;
+
+import com.google.android.collect.Maps;
import java.util.ArrayList;
import java.util.HashMap;
@@ -36,7 +37,9 @@ import java.util.Map;
*/
public class SyncQueue {
private static final String TAG = "SyncManager";
- private SyncStorageEngine mSyncStorageEngine;
+
+ private final SyncStorageEngine mSyncStorageEngine;
+ private final SyncAdaptersCache mSyncAdapters;
// A Map of SyncOperations operationKey -> SyncOperation that is designed for
// quick lookup of an enqueued SyncOperation.
@@ -44,23 +47,28 @@ public class SyncQueue {
public SyncQueue(SyncStorageEngine syncStorageEngine, final SyncAdaptersCache syncAdapters) {
mSyncStorageEngine = syncStorageEngine;
- ArrayList<SyncStorageEngine.PendingOperation> ops
- = mSyncStorageEngine.getPendingOperations();
- final int N = ops.size();
- for (int i=0; i<N; i++) {
- SyncStorageEngine.PendingOperation op = ops.get(i);
- final Pair<Long, Long> backoff =
- syncStorageEngine.getBackoff(op.account, op.userId, op.authority);
- final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo =
- syncAdapters.getServiceInfo(
- SyncAdapterType.newKey(op.authority, op.account.type));
+ mSyncAdapters = syncAdapters;
+
+ addPendingOperations(UserHandle.USER_OWNER);
+ }
+
+ public void addPendingOperations(int userId) {
+ for (SyncStorageEngine.PendingOperation op : mSyncStorageEngine.getPendingOperations()) {
+ if (op.userId != userId) continue;
+
+ final Pair<Long, Long> backoff = mSyncStorageEngine.getBackoff(
+ op.account, op.userId, op.authority);
+ final ServiceInfo<SyncAdapterType> syncAdapterInfo = mSyncAdapters.getServiceInfo(
+ SyncAdapterType.newKey(op.authority, op.account.type), op.userId);
if (syncAdapterInfo == null) {
+ Log.w(TAG, "Missing sync adapter info for authority " + op.authority + ", userId "
+ + op.userId);
continue;
}
SyncOperation syncOperation = new SyncOperation(
op.account, op.userId, op.syncSource, op.authority, op.extras, 0 /* delay */,
backoff != null ? backoff.first : 0,
- syncStorageEngine.getDelayUntilTime(op.account, op.userId, op.authority),
+ mSyncStorageEngine.getDelayUntilTime(op.account, op.userId, op.authority),
syncAdapterInfo.type.allowParallelSyncs());
syncOperation.expedited = op.expedited;
syncOperation.pendingOperation = op;