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

Side by Side Diff: components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManager.java

Issue 2779753002: [Android] Adding scheduling through GcmNetworkManager (Closed)
Patch Set: Ensuring task is called on UI thread Created 3 years, 8 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.components.background_task_scheduler;
6
7 import android.content.Context;
8 import android.os.Bundle;
9 import android.support.annotation.NonNull;
10
11 import com.google.android.gms.common.ConnectionResult;
12 import com.google.android.gms.common.GoogleApiAvailability;
13 import com.google.android.gms.gcm.GcmNetworkManager;
14 import com.google.android.gms.gcm.OneoffTask;
15 import com.google.android.gms.gcm.PeriodicTask;
16 import com.google.android.gms.gcm.Task;
17 import com.google.android.gms.gcm.TaskParams;
18
19 import org.chromium.base.Log;
20 import org.chromium.base.ThreadUtils;
21 import org.chromium.base.VisibleForTesting;
22
23 import java.util.concurrent.TimeUnit;
24
25 /**
26 * An implementation of {@link BackgroundTaskSchedulerDelegate} that uses the Pl ay Services
27 * {@link GcmNetworkManager} to schedule jobs.
28 */
29 class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule rDelegate {
30 private static final String TAG = "BkgrdTaskSchedGcmNM";
31
32 @VisibleForTesting
33 static final String BACKGROUND_TASK_CLASS_KEY = "_background_task_class";
34 @VisibleForTesting
35 static final String BACKGROUND_TASK_EXTRAS_KEY = "_background_task_extras";
36
37 static BackgroundTask getBackgroundTaskFromTaskParams(@NonNull TaskParams ta skParams) {
38 String backgroundTaskClassName = getBackgroundTaskClassFromTaskParams(ta skParams);
39 return BackgroundTaskScheduler.getBackgroundTaskFromClassName(background TaskClassName);
40 }
41
42 private static String getBackgroundTaskClassFromTaskParams(@NonNull TaskPara ms taskParams) {
43 Bundle extras = taskParams.getExtras();
44 if (extras == null) return null;
45 return extras.getString(BACKGROUND_TASK_CLASS_KEY);
46 }
47
48 /**
49 * Retrieves the {@link TaskParameters} from the {@link TaskParams}, which a re passed as
50 * one of the keys. Only values valid for {@link android.os.BaseBundle} are supported, and other
51 * values are stripped at the time when the task is scheduled.
52 *
53 * @param taskParams the {@link TaskParams} to extract the {@link TaskParame ters} from.
54 * @return the {@link TaskParameters} for the current job.
55 */
56 static TaskParameters getTaskParametersFromTaskParams(@NonNull TaskParams ta skParams) {
57 int taskId;
58 try {
59 taskId = Integer.parseInt(taskParams.getTag());
60 } catch (NumberFormatException e) {
61 Log.e(TAG, "Cound not parse task ID from task tag: " + taskParams.ge tTag());
62 return null;
63 }
64
65 TaskParameters.Builder builder = TaskParameters.create(taskId);
66
67 Bundle extras = taskParams.getExtras();
68 Bundle taskExtras = extras.getBundle(BACKGROUND_TASK_EXTRAS_KEY);
69 builder.addExtras(taskExtras);
70
71 return builder.build();
72 }
73
74 @VisibleForTesting
75 static Task createTaskFromTaskInfo(@NonNull TaskInfo taskInfo) {
76 Bundle taskExtras = new Bundle();
77 taskExtras.putString(
78 BACKGROUND_TASK_CLASS_KEY, taskInfo.getBackgroundTaskClass().get Name());
79 taskExtras.putBundle(BACKGROUND_TASK_EXTRAS_KEY, taskInfo.getExtras());
80
81 Task.Builder builder;
82 if (taskInfo.isPeriodic()) {
83 builder = getPeriodicTaskBuilder(taskInfo.getPeriodicInfo());
84 } else {
85 builder = getOneOffTaskBuilder(taskInfo.getOneOffInfo());
86 }
87
88 builder.setExtras(taskExtras)
89 .setPersisted(taskInfo.isPersisted())
90 .setRequiredNetwork(getGcmNetworkManagerNetworkTypeFromTypeFromT askNetworkType(
91 taskInfo.getRequiredNetworkType()))
92 .setRequiresCharging(taskInfo.requiresCharging())
93 .setService(BackgroundTaskGcmTaskService.class)
94 .setTag(taskIdToTaskTag(taskInfo.getTaskId()))
95 .setUpdateCurrent(taskInfo.shouldUpdateCurrent());
96
97 return builder.build();
98 }
99
100 private static Task.Builder getPeriodicTaskBuilder(TaskInfo.PeriodicInfo per iodicInfo) {
101 PeriodicTask.Builder builder = new PeriodicTask.Builder();
102 builder.setPeriod(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getInterv alMs()));
103 if (periodicInfo.hasFlex()) {
104 builder.setFlex(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getFlex Ms()));
105 }
106 return builder;
107 }
108
109 private static Task.Builder getOneOffTaskBuilder(TaskInfo.OneOffInfo oneOffI nfo) {
110 OneoffTask.Builder builder = new OneoffTask.Builder();
111 long windowStartSeconds = oneOffInfo.hasWindowStartTimeConstraint()
112 ? TimeUnit.MILLISECONDS.toSeconds(oneOffInfo.getWindowStartTimeM s())
113 : 0;
114 builder.setExecutionWindow(windowStartSeconds,
115 TimeUnit.MILLISECONDS.toSeconds(oneOffInfo.getWindowEndTimeMs()) );
116 return builder;
117 }
118
119 private static int getGcmNetworkManagerNetworkTypeFromTypeFromTaskNetworkTyp e(
120 @TaskInfo.NetworkType int networkType) {
121 switch (networkType) {
122 // This is correct: GcmNM ANY means no network is guaranteed.
123 case TaskInfo.NETWORK_TYPE_NONE:
124 return Task.NETWORK_STATE_ANY;
125 case TaskInfo.NETWORK_TYPE_ANY:
126 return Task.NETWORK_STATE_CONNECTED;
127 case TaskInfo.NETWORK_TYPE_UNMETERED:
128 return Task.NETWORK_STATE_UNMETERED;
129 default:
130 assert false;
131 }
132 return Task.NETWORK_STATE_ANY;
133 }
134
135 @Override
136 public boolean schedule(Context context, @NonNull TaskInfo taskInfo) {
137 ThreadUtils.assertOnUiThread();
138 if (!BackgroundTaskScheduler.hasParameterlessPublicConstructor(
139 taskInfo.getBackgroundTaskClass())) {
140 Log.e(TAG,
141 "BackgroundTask " + taskInfo.getBackgroundTaskClass()
142 + " has no parameterless public constructor.");
143 return false;
144 }
145
146 GcmNetworkManager gcmNetworkManager = getGcmNetworkManager(context);
147 if (gcmNetworkManager == null) {
148 Log.e(TAG, "GcmNetworkManager is not available.");
149 return false;
150 }
151
152 Task task = createTaskFromTaskInfo(taskInfo);
153
154 gcmNetworkManager.schedule(task);
155 return true;
156 }
157
158 @Override
159 public void cancel(Context context, int taskId) {
160 ThreadUtils.assertOnUiThread();
161
162 GcmNetworkManager gcmNetworkManager = getGcmNetworkManager(context);
163 if (gcmNetworkManager == null) {
164 Log.e(TAG, "GcmNetworkManager is not available.");
165 return;
166 }
167
168 gcmNetworkManager.cancelTask(taskIdToTaskTag(taskId), BackgroundTaskGcmT askService.class);
169 }
170
171 private GcmNetworkManager getGcmNetworkManager(Context context) {
172 if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(co ntext)
173 == ConnectionResult.SUCCESS) {
174 return GcmNetworkManager.getInstance(context);
175 }
176 return null;
177 }
178
179 private static String taskIdToTaskTag(int taskId) {
180 return Integer.toString(taskId);
181 }
182 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698