Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(540)

Unified Diff: components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java

Issue 2714463002: [android] Add JobScheduler-based BackgroundTaskScheduler. (Closed)
Patch Set: FindBugs wants the real Pi, but I won't give it. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java
diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed78922bbf18d7c703154e5d0fc702c989972b4c
--- /dev/null
+++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java
@@ -0,0 +1,529 @@
+// 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.components.background_task_scheduler;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * TaskInfo represents a request to run a specific {@link BackgroundTask} given the required
+ * parameters, such as whether a special type of network is available.
+ */
+public class TaskInfo {
+ /**
+ * Specifies information regarding one-off tasks.
+ * This is part of a {@link TaskInfo} iff the task is NOT a periodic task.
+ */
+ public static class OneOffInfo {
+ private final long mWindowStartTimeMs;
+ private final long mWindowEndTimeMs;
+ private final boolean mHasWindowStartTimeConstraint;
+
+ private OneOffInfo(long windowStartTimeMs, long windowEndTimeMs,
+ boolean hasWindowStartTimeConstraint) {
+ mWindowStartTimeMs = windowStartTimeMs;
+ mWindowEndTimeMs = windowEndTimeMs;
+ mHasWindowStartTimeConstraint = hasWindowStartTimeConstraint;
+ }
+
+ /**
+ * @return the start of the window that the task can begin executing as a delta in
+ * milliseconds from now.
+ */
+ public long getWindowStartTimeMs() {
+ return mWindowStartTimeMs;
+ }
+
+ /**
+ * @return the end of the window that the task can begin executing as a delta in
+ * milliseconds from now.
+ */
+ public long getWindowEndTimeMs() {
+ return mWindowEndTimeMs;
+ }
+
+ /**
+ * @return whether this one-off task has a window start time constraint.
+ */
+ public boolean hasWindowStartTimeConstraint() {
+ return mHasWindowStartTimeConstraint;
+ }
+
+ @Override
+ public String toString() {
+ return "{windowStartTimeMs: " + mWindowStartTimeMs + ", windowEndTimeMs: "
+ + mWindowEndTimeMs + "}";
+ }
+ }
+
+ /**
+ * Specifies information regarding periodic tasks.
+ * This is part of a {@link TaskInfo} iff the task is a periodic task.
+ */
+ public static class PeriodicInfo {
+ private final long mIntervalMs;
+ private final long mFlexMs;
+ private final boolean mHasFlex;
+
+ private PeriodicInfo(long intervalMs, long flexMs, boolean hasFlex) {
+ mIntervalMs = intervalMs;
+ mFlexMs = flexMs;
+ mHasFlex = hasFlex;
+ }
+
+ /**
+ * @return the interval between occurrences of this task in milliseconds.
+ */
+ public long getIntervalMs() {
+ return mIntervalMs;
+ }
+
+ /**
+ * @return the flex time for this task. The task can execute at any time in a window of flex
+ * length at the end of the period. It is reported in milliseconds.
+ */
+ public long getFlexMs() {
+ return mFlexMs;
+ }
+
+ /**
+ * @return true whether this task has defined a flex time. False otherwise.
+ */
+ public boolean hasFlex() {
+ return mHasFlex;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("{");
+ sb.append("{");
+ sb.append("intervalMs: ").append(mIntervalMs);
+ if (mHasFlex) {
+ sb.append(", flexMs: ").append(mFlexMs);
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+ }
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({NETWORK_TYPE_NONE, NETWORK_TYPE_ANY, NETWORK_TYPE_UNMETERED})
+ public @interface NetworkType {}
+
+ /**
+ * This task has no requirements for network connectivity. Default.
+ *
+ * @see NetworkType
+ */
+ public static final int NETWORK_TYPE_NONE = 0;
+ /**
+ * This task requires network connectivity.
+ *
+ * @see NetworkType
+ */
+ public static final int NETWORK_TYPE_ANY = 1;
+ /**
+ * This task requires network connectivity that is unmetered.
+ *
+ * @see NetworkType
+ */
+ public static final int NETWORK_TYPE_UNMETERED = 2;
+
+ /**
+ * The task ID should be unique across all tasks. A list of such unique IDs exists in
+ * {@link TaskIds}.
+ */
+ private final int mTaskId;
+
+ /**
+ * The {@link BackgroundTask} to invoke when this task is run.
+ */
+ @NonNull
+ private final Class<? extends BackgroundTask> mBackgroundTaskClass;
+
+ /**
+ * The extras to provide to the {@link BackgroundTask} when it is run.
+ */
+ @NonNull
+ private final Bundle mExtras;
+
+ /**
+ * The type of network the task requires to run.
+ */
+ @NetworkType
+ private final int mRequiredNetworkType;
+
+ /**
+ * Whether the task requires charging to run.
+ */
+ private final boolean mRequiresCharging;
+
+ /**
+ * Whether or not to persist this task across device reboots.
+ */
+ private final boolean mIsPersisted;
+
+ /**
+ * Whether this task should override any preexisting tasks with the same task id.
+ */
+ private final boolean mUpdateCurrent;
+
+ /**
+ * Whether this task is periodic.
+ */
+ private final boolean mIsPeriodic;
+
+ /**
+ * Task information regarding one-off tasks. Non-null iff {@link #mIsPeriodic} is false.
+ */
+ private final OneOffInfo mOneOffInfo;
+
+ /**
+ * Task information regarding periodic tasks. Non-null iff {@link #mIsPeriodic} is true.
+ */
+ private final PeriodicInfo mPeriodicInfo;
+
+ private TaskInfo(Builder builder) {
+ mTaskId = builder.mTaskId;
+ mBackgroundTaskClass = builder.mBackgroundTaskClass;
+ mExtras = builder.mExtras == null ? new Bundle() : builder.mExtras;
+ mRequiredNetworkType = builder.mRequiredNetworkType;
+ mRequiresCharging = builder.mRequiresCharging;
+ mIsPersisted = builder.mIsPersisted;
+ mUpdateCurrent = builder.mUpdateCurrent;
+ mIsPeriodic = builder.mIsPeriodic;
+ if (mIsPeriodic) {
+ mOneOffInfo = null;
+ mPeriodicInfo =
+ new PeriodicInfo(builder.mIntervalMs, builder.mFlexMs, builder.mHasFlex);
+ } else {
+ mOneOffInfo = new OneOffInfo(builder.mWindowStartTimeMs, builder.mWindowEndTimeMs,
+ builder.mHasWindowStartTimeConstraint);
+ mPeriodicInfo = null;
+ }
+ }
+
+ /**
+ * @return the unique ID of this task.
+ */
+ public int getTaskId() {
+ return mTaskId;
+ }
+
+ /**
+ * @return the {@link BackgroundTask} class that will be instantiated for this task.
+ */
+ @NonNull
+ public Class<? extends BackgroundTask> getBackgroundTaskClass() {
+ return mBackgroundTaskClass;
+ }
+
+ /**
+ * @return the extras that will be provided to the {@link BackgroundTask}.
+ */
+ @NonNull
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ /**
+ * @return the type of network the task requires to run.
+ */
+ @NetworkType
+ public int getRequiredNetworkType() {
+ return mRequiredNetworkType;
+ }
+
+ /**
+ * @return whether the task requires charging to run.
+ */
+ public boolean requiresCharging() {
+ return mRequiresCharging;
+ }
+
+ /**
+ * @return whether or not to persist this task across device reboots.
+ */
+ public boolean isPersisted() {
+ return mIsPersisted;
+ }
+
+ /**
+ * @return whether this task should override any preexisting tasks with the same task id.
+ */
+ public boolean shouldUpdateCurrent() {
+ return mUpdateCurrent;
+ }
+
+ /**
+ * @return Whether or not this task is a periodic task.
+ */
+ public boolean isPeriodic() {
+ return mIsPeriodic;
+ }
+
+ /**
+ * This is part of a {@link TaskInfo} iff the task is NOT a periodic task, i.e.
+ * {@link TaskInfo#isPeriodic()} returns false.
+ *
+ * @return the specific data that is only available for one-off tasks.
+ */
+ public OneOffInfo getOneOffInfo() {
+ return mOneOffInfo;
+ }
+
+ /**
+ * This is part of a {@link TaskInfo} iff the task is a periodic task, i.e.
+ * {@link TaskInfo#isPeriodic()} returns true.
+ *
+ * @return the specific data that is only available for periodic tasks.
+ */
+ public PeriodicInfo getPeriodicInfo() {
+ return mPeriodicInfo;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("{");
+ sb.append("taskId: ").append(mTaskId);
+ sb.append(", backgroundTaskClass: ").append(mBackgroundTaskClass);
+ sb.append(", extras: ").append(mExtras);
+ sb.append(", requiredNetworkType: ").append(mRequiredNetworkType);
+ sb.append(", requiresCharging: ").append(mRequiresCharging);
+ sb.append(", isPersisted: ").append(mIsPersisted);
+ sb.append(", updateCurrent: ").append(mUpdateCurrent);
+ sb.append(", isPeriodic: ").append(mIsPeriodic);
+ if (isPeriodic()) {
+ sb.append(", periodicInfo: ").append(mPeriodicInfo);
+ } else {
+ sb.append(", oneOffInfo: ").append(mOneOffInfo);
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Schedule a one-off task to execute within a deadline. If windowEndTimeMs is 0, the task will
+ * run as soon as possible. For executing a task within a time window, see
+ * {@link #createOneOffTask(int, Class, long, long)}.
+ *
+ * @param taskId the unique task ID for this task. Should be listed in {@link TaskIds}.
+ * @param backgroundTaskClass the {@link BackgroundTask} class that will be instantiated for
+ * this task.
+ * @param windowEndTimeMs the end of the window that the task can begin executing as a delta in
+ * milliseconds from now.
+ * @return the builder which can be used to continue configuration and {@link Builder#build()}.
+ * @see TaskIds
+ */
+ public static Builder createOneOffTask(
+ int taskId, Class<? extends BackgroundTask> backgroundTaskClass, long windowEndTimeMs) {
+ return new Builder(taskId, backgroundTaskClass, false).setWindowEndTimeMs(windowEndTimeMs);
+ }
+
+ /**
+ * Schedule a one-off task to execute within a time window. For executing a task within a
+ * deadline, see {@link #createOneOffTask(int, Class, long)},
+ *
+ * @param taskId the unique task ID for this task. Should be listed in {@link TaskIds}.
+ * @param backgroundTaskClass the {@link BackgroundTask} class that will be instantiated for
+ * this task.
+ * @param windowStartTimeMs the start of the window that the task can begin executing as a delta
+ * in milliseconds from now.
+ * @param windowEndTimeMs the end of the window that the task can begin executing as a delta in
+ * milliseconds from now.
+ * @return the builder which can be used to continue configuration and {@link Builder#build()}.
+ * @see TaskIds
+ */
+ public static Builder createOneOffTask(int taskId,
+ Class<? extends BackgroundTask> backgroundTaskClass, long windowStartTimeMs,
+ long windowEndTimeMs) {
+ return new Builder(taskId, backgroundTaskClass, false)
+ .setWindowStartTimeMs(windowStartTimeMs)
+ .setWindowEndTimeMs(windowEndTimeMs);
+ }
+
+ /**
+ * Schedule a periodic task that will recur at the specified interval, without the need to
+ * be rescheduled. The task will continue to recur until
+ * {@link BackgroundTaskScheduler#cancel(Context, int)} is invoked with the task ID from this
+ * {@link TaskInfo}.
+ *
+ * @param taskId the unique task ID for this task. Should be listed in {@link TaskIds}.
+ * @param backgroundTaskClass the {@link BackgroundTask} class that will be instantiated for
+ * this task.
+ * @param intervalMs the interval between occurrences of this task in milliseconds.
+ * @return the builder which can be used to continue configuration and {@link Builder#build()}.
+ * @see TaskIds
+ */
+ public static Builder createPeriodicTask(
+ int taskId, Class<? extends BackgroundTask> backgroundTaskClass, long intervalMs) {
+ return new Builder(taskId, backgroundTaskClass, true).setIntervalMs(intervalMs);
+ }
+
+ /**
+ * Schedule a periodic task that will recur at the specified interval, without the need to
+ * be rescheduled. The task will continue to recur until
+ * {@link BackgroundTaskScheduler#cancel(Context, int)} is invoked with the task ID from this
+ * {@link TaskInfo}.
+ * The flex time specifies how close to the end of the interval you are willing to execute.
+ * Instead of executing at the exact interval, the task will execute at the interval or up to
+ * flex milliseconds before.
+ *
+ * @param taskId the unique task ID for this task. Should be listed in {@link TaskIds}.
+ * @param backgroundTaskClass the {@link BackgroundTask} class that will be instantiated for
+ * this task.
+ * @param intervalMs the interval between occurrences of this task in milliseconds.
+ * @param flexMs the flex time for this task. The task can execute at any time in a window of
+ * flex
+ * length at the end of the period. It is reported in milliseconds.
+ * @return the builder which can be used to continue configuration and {@link Builder#build()}.
+ * @see TaskIds
+ */
+ public static Builder createPeriodicTask(int taskId,
+ Class<? extends BackgroundTask> backgroundTaskClass, long intervalMs, long flexMs) {
+ return new Builder(taskId, backgroundTaskClass, true)
+ .setIntervalAndFlexMs(intervalMs, flexMs);
+ }
+
+ /**
+ * A helper builder to provide a way to build {@link TaskInfo}. To create a {@link Builder}
+ * use one of the create* class method on {@link TaskInfo}.
+ *
+ * @see #createOneOffTask(int, Class, long)
+ * @see #createOneOffTask(int, Class, long, long)
+ * @see #createPeriodicTask(int, Class, long)
+ * @see #createPeriodicTask(int, Class, long, long)
+ */
+ public static final class Builder {
+ private final int mTaskId;
+ @NonNull
+ private final Class<? extends BackgroundTask> mBackgroundTaskClass;
+ private final boolean mIsPeriodic;
+ private Bundle mExtras;
+ @NetworkType
+ private int mRequiredNetworkType;
+ private boolean mRequiresCharging;
+ private boolean mIsPersisted;
+ private boolean mUpdateCurrent;
+
+ // Data about one-off tasks.
+ private long mWindowStartTimeMs;
+ private long mWindowEndTimeMs;
+ private boolean mHasWindowStartTimeConstraint;
+
+ // Data about periodic tasks.
+ private long mIntervalMs;
+ private long mFlexMs;
+ private boolean mHasFlex;
+
+ Builder(int taskId, @NonNull Class<? extends BackgroundTask> backgroundTaskClass,
+ boolean isPeriodic) {
+ mTaskId = taskId;
+ mBackgroundTaskClass = backgroundTaskClass;
+ mIsPeriodic = isPeriodic;
+ }
+
+ Builder setWindowStartTimeMs(long windowStartTimeMs) {
+ assert !mIsPeriodic;
+ mWindowStartTimeMs = windowStartTimeMs;
+ mHasWindowStartTimeConstraint = true;
+ return this;
+ }
+
+ Builder setWindowEndTimeMs(long windowEndTimeMs) {
+ assert !mIsPeriodic;
+ mWindowEndTimeMs = windowEndTimeMs;
+ return this;
+ }
+
+ Builder setIntervalMs(long intervalMs) {
+ assert mIsPeriodic;
+ mIntervalMs = intervalMs;
+ return this;
+ }
+
+ Builder setIntervalAndFlexMs(long intervalMs, long flexMs) {
+ assert mIsPeriodic;
+ mIntervalMs = intervalMs;
+ mFlexMs = flexMs;
+ mHasFlex = true;
+ return this;
+ }
+
+ /**
+ * Set the optional extra values necessary for this task. Must only ever contain simple
+ * values supported by {@link android.os.BaseBundle}. All other values are thrown away.
+ * If the extras for this builder are not set, or set to null, the resulting
+ * {@link TaskInfo} will have an empty bundle (i.e. not null).
+ *
+ * @param bundle the bundle of extra values necessary for this task.
+ * @return this {@link Builder}.
+ */
+ public Builder setExtras(Bundle bundle) {
+ mExtras = bundle;
+ return this;
+ }
+
+ /**
+ * Set the type of network the task requires to run.
+ *
+ * @param networkType the {@link NetworkType} required for this task.
+ * @return this {@link Builder}.
+ */
+ public Builder setRequiredNetworkType(@NetworkType int networkType) {
+ mRequiredNetworkType = networkType;
+ return this;
+ }
+
+ /**
+ * Set whether the task requires charging to run.
+ *
+ * @param requiresCharging true if this task requires charging.
+ * @return this {@link Builder}.
+ */
+ public Builder setRequiresCharging(boolean requiresCharging) {
+ mRequiresCharging = requiresCharging;
+ return this;
+ }
+
+ /**
+ * Set whether or not to persist this task across device reboots.
+ *
+ * @param isPersisted true if this task should be persisted across reboots.
+ * @return this {@link Builder}.
+ */
+ public Builder setIsPersisted(boolean isPersisted) {
+ mIsPersisted = isPersisted;
+ return this;
+ }
+
+ /**
+ * Set whether this task should override any preexisting tasks with the same task id.
+ *
+ * @param updateCurrent true if this task should overwrite a currently existing task with
+ * the same ID, if it exists.
+ * @return this {@link Builder}.
+ */
+ public Builder setUpdateCurrent(boolean updateCurrent) {
+ mUpdateCurrent = updateCurrent;
+ return this;
+ }
+
+ /**
+ * Build the {@link TaskInfo object} specified by this builder.
+ *
+ * @return the {@link TaskInfo} object.
+ */
+ public TaskInfo build() {
+ return new TaskInfo(this);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698