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..3aaf2cbc83a50047f79b1789cc12b3368a2d9978 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,14 @@ 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 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.HashSet; |
import java.util.Set; |
/** |
@@ -44,6 +47,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 +86,19 @@ 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. |
+ */ |
+ public static Intent createRegisterIntent(Account account, int[] objectSources, |
+ String[] objectNames) { |
+ Intent registerIntent = new Intent(ACTION_REGISTER); |
+ registerIntent.putExtra(EXTRA_REGISTERED_OBJECT_SOURCES, objectSources); |
+ registerIntent.putExtra(EXTRA_REGISTERED_OBJECT_NAMES, objectNames); |
+ 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 +106,23 @@ 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) { |
+ int[] objectSources = intent.getIntArrayExtra(EXTRA_REGISTERED_OBJECT_SOURCES); |
+ String[] objectNames = intent.getStringArrayExtra(EXTRA_REGISTERED_OBJECT_NAMES); |
+ if (objectSources == null || objectNames == null || |
+ objectSources.length != objectNames.length) { |
+ return null; |
+ } |
+ Set<ObjectId> objectIds = new HashSet<ObjectId>(objectSources.length); |
+ for (int i = 0; i < objectSources.length; i++) { |
+ objectIds.add(ObjectId.newInstance(objectSources[i], objectNames[i].getBytes())); |
+ } |
+ return objectIds; |
} |
private IntentProtocol() { |
@@ -122,6 +166,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 +204,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) { |