Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/ChromeGcmTaskService.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeGcmTaskService.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeGcmTaskService.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..2e31b0c1a9f2832479f0b9803233a91531b97c62 |
| --- /dev/null |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeGcmTaskService.java |
| @@ -0,0 +1,92 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.chrome.browser; |
| + |
| +import android.content.Context; |
| + |
| +import com.google.android.gms.gcm.GcmNetworkManager; |
| +import com.google.android.gms.gcm.GcmTaskService; |
| +import com.google.android.gms.gcm.TaskParams; |
| + |
| +import org.chromium.base.Log; |
| +import org.chromium.base.ThreadUtils; |
| +import org.chromium.base.VisibleForTesting; |
| +import org.chromium.base.annotations.SuppressFBWarnings; |
| +import org.chromium.base.library_loader.LibraryProcessType; |
| +import org.chromium.base.library_loader.ProcessInitException; |
| +import org.chromium.chrome.browser.ntp.snippets.SnippetsController; |
| +import org.chromium.chrome.browser.ntp.snippets.SnippetsLauncher; |
| +import org.chromium.content.app.ContentApplication; |
| +import org.chromium.content.browser.BrowserStartupController; |
| + |
| +/** |
| + * {@link GcmTaskService} is scheduled through the {@link GcmNetworkManager} when the browser needs |
| + * to be launched for scheduled tasks, or in response to changing network or power conditions. |
| + */ |
| +public class ChromeGcmTaskService extends GcmTaskService { |
|
Bernhard Bauer
2016/02/18 10:32:40
Should we just name this ChromeBackgroundService?
Marc Treib
2016/02/18 10:52:40
Done.
|
| + private static final String TAG = "ChromeGcmTaskService"; |
| + |
| + @Override |
| + @VisibleForTesting |
| + public int onRunTask(final TaskParams params) { |
| + Log.i(TAG, "Woken up at " + new java.util.Date().toString()); |
| + final Context context = this; |
| + ThreadUtils.runOnUiThread(new Runnable() { |
| + @Override |
| + public void run() { |
| + switch(params.getTag()) { |
| + case BackgroundSyncLauncher.TASK_TAG: |
| + handleBackgroundSyncEvent(context); |
| + break; |
| + |
| + case SnippetsLauncher.TASK_TAG: |
| + handleFetchSnippets(context); |
| + break; |
| + } |
| + } |
| + }); |
| + return GcmNetworkManager.RESULT_SUCCESS; |
| + } |
| + |
| + private void handleBackgroundSyncEvent(Context context) { |
| + if (!BackgroundSyncLauncher.hasInstance()) { |
| + // Start the browser. The browser's BackgroundSyncManager (for the active profile) will |
| + // start, check the network, and run any necessary sync events. This task runs with a |
| + // wake lock, but has a three minute timeout, so we need to start the browser in its |
| + // own task. |
| + // TODO(jkarlin): Protect the browser sync event with a wake lock. |
| + // See crbug.com/486020. |
| + launchBrowser(context); |
| + } |
| + } |
| + |
| + private void handleFetchSnippets(Context context) { |
| + if (!SnippetsLauncher.hasInstance()) { |
| + launchBrowser(context); |
| + } |
| + SnippetsController.get(context).fetchSnippets(true); |
| + } |
| + |
| + @VisibleForTesting |
| + @SuppressFBWarnings("DM_EXIT") |
| + protected void launchBrowser(Context context) { |
| + Log.i(TAG, "Launching browser"); |
| + ContentApplication.initCommandLine(context); |
| + try { |
| + BrowserStartupController.get(context, LibraryProcessType.PROCESS_BROWSER) |
| + .startBrowserProcessesSync(false); |
| + } catch (ProcessInitException e) { |
| + Log.e(TAG, "ProcessInitException while starting the browser process"); |
| + // Since the library failed to initialize nothing in the application |
| + // can work, so kill the whole application not just the activity. |
| + System.exit(-1); |
| + } |
| + } |
| + |
| + @Override |
| + public void onInitializeTasks() { |
| + BackgroundSyncLauncher.rescheduleTasksOnUpgrade(this); |
| + } |
| +} |