| Index: components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
|
| 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 b7a50242d259c521a08bfb8f934c0aab7a430112..932d47a879d6fea7608552914ad80521e1b348c2 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
|
| @@ -14,6 +14,8 @@ import com.google.android.gcm.GCMRegistrar;
|
| import org.chromium.base.CalledByNative;
|
| import org.chromium.base.JNINamespace;
|
| import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.library_loader.ProcessInitException;
|
| +import org.chromium.content.browser.BrowserStartupController;
|
|
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| @@ -153,10 +155,25 @@ public class GCMDriver {
|
| }
|
| }
|
|
|
| - static void onMessageReceived(final String appId, final Bundle extras) {
|
| + static void onMessageReceived(Context context, final String appId, final Bundle extras) {
|
| + final String PUSH_API_DATA_KEY = "data";
|
| + if (!extras.containsKey(PUSH_API_DATA_KEY)) {
|
| + // For now on Android only the Push API uses GCMDriver. To avoid double-handling of
|
| + // messages already handled in Java by other implementations of MultiplexingGcmListener,
|
| + // and unnecessarily waking up the browser processes for all existing GCM messages that
|
| + // are received by Chrome on Android, we currently discard messages unless they are
|
| + // destined for the Push API.
|
| + // TODO(johnme): Find a better way of distinguishing messages that should be delivered
|
| + // to native from messages that have already been delivered to Java, for example by
|
| + // refactoring other implementations of MultiplexingGcmListener to instead register with
|
| + // this class, and distinguish them based on appId (which also requires GCM to start
|
| + // sending us the app IDs).
|
| + return;
|
| + }
|
| +
|
| // TODO(johnme): Store message and redeliver later if Chrome is killed before delivery.
|
| ThreadUtils.assertOnUiThread();
|
| - launchNativeThen(new Runnable() {
|
| + launchNativeThen(context, new Runnable() {
|
| @Override public void run() {
|
| final String BUNDLE_SENDER_ID = "from";
|
| final String BUNDLE_COLLAPSE_KEY = "collapse_key";
|
| @@ -182,10 +199,10 @@ public class GCMDriver {
|
| });
|
| }
|
|
|
| - static void onMessagesDeleted(final String appId) {
|
| + static void onMessagesDeleted(Context context, final String appId) {
|
| // TODO(johnme): Store event and redeliver later if Chrome is killed before delivery.
|
| ThreadUtils.assertOnUiThread();
|
| - launchNativeThen(new Runnable() {
|
| + launchNativeThen(context, new Runnable() {
|
| @Override public void run() {
|
| sInstance.nativeOnMessagesDeleted(sInstance.mNativeGCMDriverAndroid, appId);
|
| }
|
| @@ -200,12 +217,31 @@ public class GCMDriver {
|
| String senderId, String collapseKey, String[] dataKeysAndValues);
|
| private native void nativeOnMessagesDeleted(long nativeGCMDriverAndroid, String appId);
|
|
|
| - private static void launchNativeThen(Runnable task) {
|
| + private static void launchNativeThen(Context context, Runnable task) {
|
| if (sInstance != null) {
|
| task.run();
|
| return;
|
| }
|
|
|
| - throw new UnsupportedOperationException("Native startup not yet implemented");
|
| + // TODO(johnme): Call ChromeMobileApplication.initCommandLine(context) or
|
| + // ChromeShellApplication.initCommandLine() as appropriate.
|
| +
|
| + try {
|
| + final int MAX_RENDERERS = 1;
|
| + BrowserStartupController.get(context).startBrowserProcessesSync(MAX_RENDERERS);
|
| + // TODO(johnme): Explicitly call a JNI method that starts up GCMDriver,
|
| + // rather than relying on it being started automatically by
|
| + // ProfileSyncServiceFactory::BuildServiceInstanceFor.
|
| + if (sInstance != null) {
|
| + task.run();
|
| + } else {
|
| + Log.e(TAG, "Started browser process, but failed to instantiate GCMDriver.");
|
| + }
|
| + } catch (ProcessInitException e) {
|
| + Log.e(TAG, "Failed to start browser process.", e);
|
| + System.exit(-1);
|
| + }
|
| +
|
| + // TODO(johnme): Now we should probably exit?
|
| }
|
| }
|
|
|