summaryrefslogtreecommitdiffstats
path: root/components/gcm_driver
diff options
context:
space:
mode:
authorjohnme@chromium.org <johnme@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-10 22:51:00 +0000
committerjohnme@chromium.org <johnme@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-10 22:51:00 +0000
commitef2d5c736e39b59731abf7c2bb14befd8c5ae64e (patch)
tree89fc420d62c854ee44c251582051284aa36a6977 /components/gcm_driver
parentb1a59084018b0935b59f297436f2b77b12a5b006 (diff)
downloadchromium_src-ef2d5c736e39b59731abf7c2bb14befd8c5ae64e.zip
chromium_src-ef2d5c736e39b59731abf7c2bb14befd8c5ae64e.tar.gz
chromium_src-ef2d5c736e39b59731abf7c2bb14befd8c5ae64e.tar.bz2
Keep a static reference to Java GCMDriver instance
This is so that intent handlers etc will be able to access the GCMDriver instance (if any), or if it's null they'll know that they need to launch the native browser process and tell it to create a C++ GCMDriverAndroid. BUG=350384 Review URL: https://codereview.chromium.org/316963003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276187 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components/gcm_driver')
-rw-r--r--components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java90
1 files changed, 64 insertions, 26 deletions
diff --git a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
index 61964a0..5f84f50 100644
--- a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
+++ b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
@@ -9,6 +9,7 @@ import android.os.Bundle;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
+import org.chromium.base.ThreadUtils;
import java.util.ArrayList;
import java.util.List;
@@ -19,6 +20,9 @@ import java.util.List;
*/
@JNINamespace("gcm")
public final class GCMDriver {
+ // The instance of GCMDriver currently owned by a C++ GCMDriverAndroid, if any.
+ private static GCMDriver sInstance = null;
+
private long mNativeGCMDriverAndroid;
private final Context mContext;
@@ -37,7 +41,10 @@ public final class GCMDriver {
@CalledByNative
private static GCMDriver create(long nativeGCMDriverAndroid,
Context context) {
- return new GCMDriver(nativeGCMDriverAndroid, context);
+ if (sInstance != null)
+ throw new IllegalStateException("Already instantiated");
+ sInstance = new GCMDriver(nativeGCMDriverAndroid, context);
+ return sInstance;
}
/**
@@ -46,6 +53,8 @@ public final class GCMDriver {
*/
@CalledByNative
private void destroy() {
+ assert sInstance == this;
+ sInstance = null;
mNativeGCMDriverAndroid = 0;
}
@@ -60,36 +69,56 @@ public final class GCMDriver {
nativeOnUnregisterFinished(mNativeGCMDriverAndroid, appId, false);
}
- public void onRegistered(String appId, String registrationId) {
- nativeOnRegisterFinished(mNativeGCMDriverAndroid, appId, registrationId, true);
+ public static void onRegistered(String appId, String registrationId) {
+ ThreadUtils.assertOnUiThread();
+ // TODO(johnme): Update registrations cache?
+ if (sInstance != null)
+ sInstance.nativeOnRegisterFinished(sInstance.mNativeGCMDriverAndroid, appId,
+ registrationId, true);
}
- public void onUnregistered(String appId) {
- nativeOnUnregisterFinished(mNativeGCMDriverAndroid, appId, true);
+ public static void onUnregistered(String appId) {
+ ThreadUtils.assertOnUiThread();
+ // TODO(johnme): Update registrations cache?
+ if (sInstance != null)
+ sInstance.nativeOnUnregisterFinished(sInstance.mNativeGCMDriverAndroid, appId, true);
}
- public void onMessageReceived(String appId, Bundle extras) {
- final String BUNDLE_SENDER_ID = "from";
- final String BUNDLE_COLLAPSE_KEY = "collapse_key";
-
- String senderId = extras.getString(BUNDLE_SENDER_ID);
- String collapseKey = extras.getString(BUNDLE_COLLAPSE_KEY);
-
- List<String> dataKeysAndValues = new ArrayList<String>();
- for (String key : extras.keySet()) {
- // TODO(johnme): Check there aren't other default keys that we need to exclude.
- if (key == BUNDLE_SENDER_ID || key == BUNDLE_COLLAPSE_KEY)
- continue;
- dataKeysAndValues.add(key);
- dataKeysAndValues.add(extras.getString(key));
- }
-
- nativeOnMessageReceived(mNativeGCMDriverAndroid, appId, senderId, collapseKey,
- dataKeysAndValues.toArray(new String[dataKeysAndValues.size()]));
+ public static void onMessageReceived(final String appId, final Bundle extras) {
+ // TODO(johnme): Store message and redeliver later if Chrome is killed before delivery.
+ ThreadUtils.assertOnUiThread();
+ launchNativeThen(new Runnable() {
+ @Override public void run() {
+ final String BUNDLE_SENDER_ID = "from";
+ final String BUNDLE_COLLAPSE_KEY = "collapse_key";
+
+ String senderId = extras.getString(BUNDLE_SENDER_ID);
+ String collapseKey = extras.getString(BUNDLE_COLLAPSE_KEY);
+
+ List<String> dataKeysAndValues = new ArrayList<String>();
+ for (String key : extras.keySet()) {
+ // TODO(johnme): Check there aren't other default keys that we need to exclude.
+ if (key == BUNDLE_SENDER_ID || key == BUNDLE_COLLAPSE_KEY)
+ continue;
+ dataKeysAndValues.add(key);
+ dataKeysAndValues.add(extras.getString(key));
+ }
+
+ sInstance.nativeOnMessageReceived(sInstance.mNativeGCMDriverAndroid,
+ appId, senderId, collapseKey,
+ dataKeysAndValues.toArray(new String[dataKeysAndValues.size()]));
+ }
+ });
}
- public void onMessagesDeleted(String appId) {
- nativeOnMessagesDeleted(mNativeGCMDriverAndroid, appId);
+ public static void onMessagesDeleted(final String appId) {
+ // TODO(johnme): Store event and redeliver later if Chrome is killed before delivery.
+ ThreadUtils.assertOnUiThread();
+ launchNativeThen(new Runnable() {
+ @Override public void run() {
+ sInstance.nativeOnMessagesDeleted(sInstance.mNativeGCMDriverAndroid, appId);
+ }
+ });
}
private native void nativeOnRegisterFinished(long nativeGCMDriverAndroid, String appId,
@@ -99,4 +128,13 @@ public final class GCMDriver {
private native void nativeOnMessageReceived(long nativeGCMDriverAndroid, String appId,
String senderId, String collapseKey, String[] dataKeysAndValues);
private native void nativeOnMessagesDeleted(long nativeGCMDriverAndroid, String appId);
-} \ No newline at end of file
+
+ private static void launchNativeThen(Runnable task) {
+ if (sInstance != null) {
+ task.run();
+ return;
+ }
+
+ throw new UnsupportedOperationException("Native startup not yet implemented");
+ }
+}