Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaService.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaService.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaService.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..6f665fb7de9f67ba88102942921ea35cd6824a81 |
| --- /dev/null |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaService.java |
| @@ -0,0 +1,135 @@ |
| +// Copyright 2017 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.omaha; |
| + |
| +import android.annotation.TargetApi; |
| +import android.app.IntentService; |
| +import android.app.job.JobService; |
| +import android.content.Context; |
| +import android.os.AsyncTask; |
| +import android.os.Build; |
| +import android.support.annotation.Nullable; |
| + |
| +import org.chromium.base.ContextUtils; |
| +import org.chromium.base.Log; |
| +import org.chromium.base.ThreadUtils; |
| +import org.chromium.components.background_task_scheduler.BackgroundTask; |
| +import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory; |
| +import org.chromium.components.background_task_scheduler.TaskInfo; |
| +import org.chromium.components.background_task_scheduler.TaskParameters; |
| + |
| +/** |
| + * Manages scheduling and running of the Omaha client code. |
| + * Delegates out to either an {@link IntentService} or {@link JobService}, as necessary. |
| + */ |
| +public class OmahaService extends OmahaBase implements BackgroundTask { |
| + public static final int OMAHA_JOB_ID = 0x00011684; |
|
nyquist
2017/02/28 00:23:00
Could you move this to org.chromium.components.bac
gone
2017/02/28 00:35:14
Done.
|
| + |
| + private static final String TAG = "omaha"; |
| + |
| + private static class OmahaClientDelegate extends OmahaDelegateBase { |
| + public OmahaClientDelegate(Context context) { |
| + super(context); |
| + } |
| + |
| + @Override |
| + public void scheduleService(long currentTimestampMs, long nextTimestampMs) { |
| + if (Build.VERSION.SDK_INT < OmahaBase.MIN_API_JOB_SCHEDULER) { |
| + getScheduler().createAlarm(OmahaClient.createIntent(getContext()), nextTimestampMs); |
| + Log.i(TAG, "Scheduled using AlarmManager and IntentService"); |
| + } else { |
| + final long delay = nextTimestampMs - currentTimestampMs; |
| + ThreadUtils.runOnUiThread(new Runnable() { |
| + @Override |
| + public void run() { |
| + if (scheduleJobService(getContext(), delay)) { |
| + Log.i(TAG, "Scheduled using JobService"); |
| + } else { |
| + Log.e(TAG, "Failed to schedule job"); |
| + } |
| + } |
| + }); |
| + } |
| + } |
| + } |
| + |
| + private static final Object DELEGATE_LOCK = new Object(); |
| + private static OmahaService sInstance; |
| + |
| + @Nullable |
| + public static OmahaService getInstance(Context context) { |
| + synchronized (DELEGATE_LOCK) { |
| + if (sInstance == null) sInstance = new OmahaService(context); |
| + return sInstance; |
| + } |
| + } |
| + |
| + private AsyncTask<Void, Void, Void> mJobServiceTask; |
| + |
| + /** Used only by {@link BackgroundTaskScheduler}. */ |
| + public OmahaService() { |
| + this(ContextUtils.getApplicationContext()); |
| + } |
| + |
| + private OmahaService(Context context) { |
| + super(new OmahaClientDelegate(context)); |
| + } |
| + |
| + /** |
| + * Trigger the {@link BackgroundTaskScheduler} immediately. |
| + * Must only be called by {@link OmahaBase#onForegroundSessionStart}. |
| + */ |
| + static void startServiceImmediately(Context context) { |
| + if (Build.VERSION.SDK_INT < OmahaBase.MIN_API_JOB_SCHEDULER) { |
| + context.startService(OmahaClient.createIntent(context)); |
| + } else { |
| + scheduleJobService(context, 0); |
| + } |
| + } |
| + |
| + @Override |
| + @TargetApi(Build.VERSION_CODES.M) |
| + public boolean onStartTask( |
| + Context context, TaskParameters parameters, final TaskFinishedCallback callback) { |
| + mJobServiceTask = new AsyncTask<Void, Void, Void>() { |
| + @Override |
| + public Void doInBackground(Void... params) { |
| + run(); |
| + return null; |
| + } |
| + |
| + @Override |
| + public void onPostExecute(Void result) { |
| + callback.taskFinished(false); |
| + } |
| + }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); |
| + return false; |
| + } |
| + |
| + @Override |
| + @TargetApi(Build.VERSION_CODES.M) |
| + public boolean onStopTask(Context context, TaskParameters taskParameters) { |
| + if (mJobServiceTask != null) { |
| + mJobServiceTask.cancel(false); |
| + mJobServiceTask = null; |
| + } |
| + return false; |
| + } |
| + |
| + /** |
| + * Schedules the Omaha code to run at the given time. |
| + * @param context Context to use. |
| + * @param delayMs How long to wait until the job should be triggered. |
| + */ |
| + @TargetApi(Build.VERSION_CODES.M) |
| + static boolean scheduleJobService(Context context, long delayMs) { |
| + long latency = Math.max(0, delayMs); |
| + |
| + TaskInfo taskInfo = |
| + TaskInfo.createOneOffTask(OMAHA_JOB_ID, OmahaService.class, latency, latency) |
| + .build(); |
| + return BackgroundTaskSchedulerFactory.getScheduler().schedule(context, taskInfo); |
| + } |
| +} |