| Index: sync/android/java/src/org/chromium/sync/notifier/InvalidationController.java
|
| diff --git a/sync/android/java/src/org/chromium/sync/notifier/InvalidationController.java b/sync/android/java/src/org/chromium/sync/notifier/InvalidationController.java
|
| index 663ca00ab9ee4db0e58a493ffc1b2394f5d9f488..93685dbe0a3f090e82c89bf5c191b91f110c345f 100644
|
| --- a/sync/android/java/src/org/chromium/sync/notifier/InvalidationController.java
|
| +++ b/sync/android/java/src/org/chromium/sync/notifier/InvalidationController.java
|
| @@ -10,11 +10,16 @@ import android.content.Intent;
|
|
|
| import com.google.common.annotations.VisibleForTesting;
|
| import com.google.common.base.Preconditions;
|
| +import com.google.ipc.invalidation.external.client.types.ObjectId;
|
| +import com.google.protos.ipc.invalidation.Types;
|
|
|
| import org.chromium.base.ActivityStatus;
|
| +import org.chromium.base.CalledByNative;
|
| import org.chromium.base.CollectionUtil;
|
| import org.chromium.sync.internal_api.pub.base.ModelType;
|
|
|
| +import java.util.ArrayList;
|
| +import java.util.HashSet;
|
| import java.util.Set;
|
|
|
| /**
|
| @@ -44,6 +49,18 @@ public class InvalidationController implements ActivityStatus.StateListener {
|
| public static final String EXTRA_REGISTERED_TYPES = "registered_types";
|
|
|
| /**
|
| + * Int-array-valued intent extra containing sources of objects to register for.
|
| + * The array is parallel to EXTRA_REGISTERED_OBJECT_NAMES.
|
| + */
|
| + public static final String EXTRA_REGISTERED_OBJECT_SOURCES = "registered_object_sources";
|
| +
|
| + /**
|
| + * String-array-valued intent extra containing names of objects to register for.
|
| + * The array is parallel to EXTRA_REGISTERED_OBJECT_SOURCES.
|
| + */
|
| + public static final String EXTRA_REGISTERED_OBJECT_NAMES = "registered_object_names";
|
| +
|
| + /**
|
| * Boolean-valued intent extra indicating that the service should be stopped.
|
| */
|
| public static final String EXTRA_STOP = "stop";
|
| @@ -71,6 +88,34 @@ public class InvalidationController implements ActivityStatus.StateListener {
|
| return registerIntent;
|
| }
|
|
|
| + /**
|
| + * Create an Intent that will start the invalidation listener service and
|
| + * register for the object ids with the specified sources and names.
|
| + * Sync-specific objects are filtered out of the request since Sync types
|
| + * are registered using the other version of createRegisterIntent.
|
| + */
|
| + public static Intent createRegisterIntent(Account account, int[] objectSources,
|
| + String[] objectNames) {
|
| + Preconditions.checkArgument(objectSources.length == objectNames.length,
|
| + "objectSources and objectNames must have the same length");
|
| +
|
| + // Add all non-Sync objects to new lists.
|
| + ArrayList<Integer> sources = new ArrayList<Integer>();
|
| + ArrayList<String> names = new ArrayList<String>();
|
| + for (int i = 0; i < objectSources.length; i++) {
|
| + if (objectSources[i] != Types.ObjectSource.Type.CHROME_SYNC.getNumber()) {
|
| + sources.add(objectSources[i]);
|
| + names.add(objectNames[i]);
|
| + }
|
| + }
|
| +
|
| + Intent registerIntent = new Intent(ACTION_REGISTER);
|
| + registerIntent.putIntegerArrayListExtra(EXTRA_REGISTERED_OBJECT_SOURCES, sources);
|
| + registerIntent.putStringArrayListExtra(EXTRA_REGISTERED_OBJECT_NAMES, names);
|
| + registerIntent.putExtra(EXTRA_ACCOUNT, account);
|
| + return registerIntent;
|
| + }
|
| +
|
| /** Returns whether {@code intent} is a stop intent. */
|
| public static boolean isStop(Intent intent) {
|
| return intent.getBooleanExtra(EXTRA_STOP, false);
|
| @@ -78,7 +123,26 @@ public class InvalidationController implements ActivityStatus.StateListener {
|
|
|
| /** Returns whether {@code intent} is a registered types change intent. */
|
| public static boolean isRegisteredTypesChange(Intent intent) {
|
| - return intent.hasExtra(EXTRA_REGISTERED_TYPES);
|
| + return intent.hasExtra(EXTRA_REGISTERED_TYPES) ||
|
| + intent.hasExtra(EXTRA_REGISTERED_OBJECT_SOURCES);
|
| + }
|
| +
|
| + /** Returns the object ids for which to register contained in the intent. */
|
| + public static Set<ObjectId> getRegisteredObjectIds(Intent intent) {
|
| + ArrayList<Integer> objectSources =
|
| + intent.getIntegerArrayListExtra(EXTRA_REGISTERED_OBJECT_SOURCES);
|
| + ArrayList<String> objectNames =
|
| + intent.getStringArrayListExtra(EXTRA_REGISTERED_OBJECT_NAMES);
|
| + if (objectSources == null || objectNames == null ||
|
| + objectSources.size() != objectNames.size()) {
|
| + return null;
|
| + }
|
| + Set<ObjectId> objectIds = new HashSet<ObjectId>(objectSources.size());
|
| + for (int i = 0; i < objectSources.size(); i++) {
|
| + objectIds.add(ObjectId.newInstance(
|
| + objectSources.get(i), objectNames.get(i).getBytes()));
|
| + }
|
| + return objectIds;
|
| }
|
|
|
| private IntentProtocol() {
|
| @@ -122,6 +186,23 @@ public class InvalidationController implements ActivityStatus.StateListener {
|
| }
|
|
|
| /**
|
| + * Sets object ids for which the client should register for notification. This is intended for
|
| + * registering non-Sync types; Sync types are registered with {@code setRegisteredTypes}.
|
| + *
|
| + * @param objectSources The sources of the objects.
|
| + * @param objectNames The names of the objects.
|
| + */
|
| + @CalledByNative
|
| + public void setRegisteredObjectIds(int[] objectSources, String[] objectNames) {
|
| + InvalidationPreferences invalidationPreferences = new InvalidationPreferences(mContext);
|
| + Account account = invalidationPreferences.getSavedSyncedAccount();
|
| + Intent registerIntent = IntentProtocol.createRegisterIntent(account, objectSources,
|
| + objectNames);
|
| + registerIntent.setClass(mContext, InvalidationService.class);
|
| + mContext.startService(registerIntent);
|
| + }
|
| +
|
| + /**
|
| * Starts the invalidation client.
|
| */
|
| public void start() {
|
| @@ -143,6 +224,7 @@ public class InvalidationController implements ActivityStatus.StateListener {
|
| *
|
| * Calling this method will create the instance if it does not yet exist.
|
| */
|
| + @CalledByNative
|
| public static InvalidationController get(Context context) {
|
| synchronized (LOCK) {
|
| if (sInstance == null) {
|
|
|