Commit d0b99544 authored by Krishna Govind's avatar Krishna Govind Committed by Commit Bot

Revert "[BackgroundTaskScheduler] TaskInfo refactoring"

This reverts commit 8fb37f86.

Reason for revert: Browser crash, bug 995264

Original change's description:
> [BackgroundTaskScheduler] TaskInfo refactoring
> 
> The BackgroundTaskScheduler does not offer at the moment the possibility of scheduling a task at an exact moment. In preparation for this feature, the existing code is going to be updated first.
> 
> This CL refactors the way in which specific task information is kept. A more object-oriented approach is implemented, based on the discussion in this Design doc: https://docs.google.com/document/d/1o9BS5qwv10QVN3Df6W2m4QKjSo1DXdGIgLf8p2l0PYc/edit?usp=sharing. Changes have been made only in the way timing info for a task is kept and not in the way pre-requisites information is kept. Updates have also been added to the test files.
> 
> This change does not affect the interface exposed by the TaskInfo class.
> 
> TBR=rouslan@chromium.org
> 
> Bug: 970160
> Change-Id: I2985ca68da4e6db18f47e0fd1769db3138850cb0
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1707365
> Commit-Queue: Richard Knoll <knollr@chromium.org>
> Reviewed-by: Tommy Nyquist <nyquist@chromium.org>
> Reviewed-by: Mugdha Lakhani <nator@chromium.org>
> Reviewed-by: Richard Knoll <knollr@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#687603}

TBR=nyquist@chromium.org,nator@chromium.org,knollr@chromium.org,ioanastefan@chromium.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: 970160
Change-Id: I199f9c5245ac659c733599cec3558d780f21be19
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1761050Reviewed-by: default avatarKrishna Govind <govind@chromium.org>
Commit-Queue: Krishna Govind <govind@chromium.org>
Cr-Commit-Position: refs/heads/master@{#688186}
parent 3a3fd027
...@@ -2409,7 +2409,6 @@ generate_jni("chrome_jni_headers") { ...@@ -2409,7 +2409,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java", "java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java",
"java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncPwaDetector.java", "java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncPwaDetector.java",
"java/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncChromeWakeUpTask.java", "java/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncChromeWakeUpTask.java",
"java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory.java",
"java/src/org/chromium/chrome/browser/banners/AppBannerManager.java", "java/src/org/chromium/chrome/browser/banners/AppBannerManager.java",
"java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java", "java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java",
"java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
......
...@@ -48,6 +48,7 @@ import org.chromium.chrome.browser.night_mode.SystemNightModeMonitor; ...@@ -48,6 +48,7 @@ import org.chromium.chrome.browser.night_mode.SystemNightModeMonitor;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.vr.OnExitVrRequestListener; import org.chromium.chrome.browser.vr.OnExitVrRequestListener;
import org.chromium.chrome.browser.vr.VrModuleProvider; import org.chromium.chrome.browser.vr.VrModuleProvider;
import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory;
import org.chromium.components.embedder_support.application.FontPreloadingWorkaround; import org.chromium.components.embedder_support.application.FontPreloadingWorkaround;
import org.chromium.components.module_installer.ModuleInstaller; import org.chromium.components.module_installer.ModuleInstaller;
import org.chromium.ui.base.ResourceBundle; import org.chromium.ui.base.ResourceBundle;
...@@ -125,7 +126,8 @@ public class ChromeApplication extends Application { ...@@ -125,7 +126,8 @@ public class ChromeApplication extends Application {
ModuleInstaller.getInstance().recordModuleAvailability(); ModuleInstaller.getInstance().recordModuleAvailability();
// Set Chrome factory for mapping BackgroundTask classes to TaskIds. // Set Chrome factory for mapping BackgroundTask classes to TaskIds.
ChromeBackgroundTaskFactory.setAsDefault(); BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(
new ChromeBackgroundTaskFactory());
} }
// Write installed modules to crash keys. This needs to be done as early as possible so that // Write installed modules to crash keys. This needs to be done as early as possible so that
......
...@@ -120,16 +120,14 @@ public class BackgroundSyncBackgroundTaskScheduler { ...@@ -120,16 +120,14 @@ public class BackgroundSyncBackgroundTaskScheduler {
Bundle taskExtras = new Bundle(); Bundle taskExtras = new Bundle();
taskExtras.putLong(SOONEST_EXPECTED_WAKETIME, System.currentTimeMillis() + minDelayMs); taskExtras.putLong(SOONEST_EXPECTED_WAKETIME, System.currentTimeMillis() + minDelayMs);
TaskInfo.TimingInfo timingInfo = TaskInfo.OneOffInfo.create() TaskInfo taskInfo =
.setWindowStartTimeMs(minDelayMs) TaskInfo.createOneOffTask(getAppropriateTaskId(taskType),
.setWindowEndTimeMs(Integer.MAX_VALUE) getAppropriateTaskClass(taskType), minDelayMs, Integer.MAX_VALUE)
.build(); .setRequiredNetworkType(TaskInfo.NetworkType.ANY)
TaskInfo taskInfo = TaskInfo.createTask(getAppropriateTaskId(taskType), timingInfo) .setUpdateCurrent(true)
.setRequiredNetworkType(TaskInfo.NetworkType.ANY) .setIsPersisted(true)
.setUpdateCurrent(true) .setExtras(taskExtras)
.setIsPersisted(true) .build();
.setExtras(taskExtras)
.build();
// This will overwrite any existing task with this ID. // This will overwrite any existing task with this ID.
return BackgroundTaskSchedulerFactory.getScheduler().schedule( return BackgroundTaskSchedulerFactory.getScheduler().schedule(
ContextUtils.getApplicationContext(), taskInfo); ContextUtils.getApplicationContext(), taskInfo);
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
package org.chromium.chrome.browser.background_task_scheduler; package org.chromium.chrome.browser.background_task_scheduler;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTask; import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTask;
import org.chromium.chrome.browser.background_sync.PeriodicBackgroundSyncChromeWakeUpTask; import org.chromium.chrome.browser.background_sync.PeriodicBackgroundSyncChromeWakeUpTask;
import org.chromium.chrome.browser.component_updater.UpdateTask; import org.chromium.chrome.browser.component_updater.UpdateTask;
...@@ -23,7 +22,6 @@ import org.chromium.chrome.browser.services.gcm.GCMBackgroundTask; ...@@ -23,7 +22,6 @@ import org.chromium.chrome.browser.services.gcm.GCMBackgroundTask;
import org.chromium.chrome.browser.webapps.WebApkUpdateTask; import org.chromium.chrome.browser.webapps.WebApkUpdateTask;
import org.chromium.components.background_task_scheduler.BackgroundTask; import org.chromium.components.background_task_scheduler.BackgroundTask;
import org.chromium.components.background_task_scheduler.BackgroundTaskFactory; import org.chromium.components.background_task_scheduler.BackgroundTaskFactory;
import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory;
import org.chromium.components.background_task_scheduler.TaskIds; import org.chromium.components.background_task_scheduler.TaskIds;
/** /**
...@@ -32,16 +30,7 @@ import org.chromium.components.background_task_scheduler.TaskIds; ...@@ -32,16 +30,7 @@ import org.chromium.components.background_task_scheduler.TaskIds;
*/ */
public class ChromeBackgroundTaskFactory implements BackgroundTaskFactory { public class ChromeBackgroundTaskFactory implements BackgroundTaskFactory {
private static final String TAG = "ChromeBkgrdTaskF"; private static final String TAG = "ChromeBkgrdTaskF";
private ChromeBackgroundTaskFactory() {} public ChromeBackgroundTaskFactory() {}
private static class LazyHolder {
static final ChromeBackgroundTaskFactory INSTANCE = new ChromeBackgroundTaskFactory();
}
@CalledByNative
public static void setAsDefault() {
BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(LazyHolder.INSTANCE);
}
@Override @Override
public BackgroundTask getBackgroundTaskFromTaskId(int taskId) { public BackgroundTask getBackgroundTaskFromTaskId(int taskId) {
......
...@@ -28,7 +28,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner; ...@@ -28,7 +28,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTaskScheduler.BackgroundSyncTask; import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTaskScheduler.BackgroundSyncTask;
import org.chromium.chrome.browser.background_task_scheduler.ChromeBackgroundTaskFactory;
import org.chromium.chrome.browser.background_task_scheduler.NativeBackgroundTask; import org.chromium.chrome.browser.background_task_scheduler.NativeBackgroundTask;
import org.chromium.chrome.test.support.DisableHistogramsRule; import org.chromium.chrome.test.support.DisableHistogramsRule;
import org.chromium.components.background_task_scheduler.BackgroundTaskScheduler; import org.chromium.components.background_task_scheduler.BackgroundTaskScheduler;
...@@ -58,7 +57,6 @@ public class BackgroundSyncBackgroundTaskSchedulerTest { ...@@ -58,7 +57,6 @@ public class BackgroundSyncBackgroundTaskSchedulerTest {
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
BackgroundTaskSchedulerFactory.setSchedulerForTesting(mTaskScheduler); BackgroundTaskSchedulerFactory.setSchedulerForTesting(mTaskScheduler);
ChromeBackgroundTaskFactory.setAsDefault();
HashMap<String, Boolean> features = new HashMap<String, Boolean>(); HashMap<String, Boolean> features = new HashMap<String, Boolean>();
features.put(ChromeFeatureList.BACKGROUND_TASK_SCHEDULER_FOR_BACKGROUND_SYNC, true); features.put(ChromeFeatureList.BACKGROUND_TASK_SCHEDULER_FOR_BACKGROUND_SYNC, true);
ChromeFeatureList.setTestFeatures(features); ChromeFeatureList.setTestFeatures(features);
......
...@@ -40,7 +40,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner; ...@@ -40,7 +40,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker; import org.chromium.base.test.util.JniMocker;
import org.chromium.blink_public.platform.WebDisplayMode; import org.chromium.blink_public.platform.WebDisplayMode;
import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.background_task_scheduler.ChromeBackgroundTaskFactory;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.test.ShadowUrlUtilities; import org.chromium.chrome.browser.util.test.ShadowUrlUtilities;
import org.chromium.chrome.test.support.DisableHistogramsRule; import org.chromium.chrome.test.support.DisableHistogramsRule;
...@@ -500,8 +499,6 @@ public class WebApkUpdateManagerUnitTest { ...@@ -500,8 +499,6 @@ public class WebApkUpdateManagerUnitTest {
storage.updateTimeOfLastCheckForUpdatedWebManifest(); storage.updateTimeOfLastCheckForUpdatedWebManifest();
storage.updateTimeOfLastWebApkUpdateRequestCompletion(); storage.updateTimeOfLastWebApkUpdateRequestCompletion();
storage.updateDidLastWebApkUpdateRequestSucceed(true); storage.updateDidLastWebApkUpdateRequestSucceed(true);
ChromeBackgroundTaskFactory.setAsDefault();
} }
@After @After
......
...@@ -2234,8 +2234,6 @@ jumbo_split_static_library("browser") { ...@@ -2234,8 +2234,6 @@ jumbo_split_static_library("browser") {
"android/background_sync_launcher_android.h", "android/background_sync_launcher_android.h",
"android/background_tab_manager.cc", "android/background_tab_manager.cc",
"android/background_tab_manager.h", "android/background_tab_manager.h",
"android/background_task_scheduler/chrome_background_task_factory.cc",
"android/background_task_scheduler/chrome_background_task_factory.h",
"android/bookmarks/bookmark_bridge.cc", "android/bookmarks/bookmark_bridge.cc",
"android/bookmarks/bookmark_bridge.h", "android/bookmarks/bookmark_bridge.h",
"android/bookmarks/partner_bookmarks_reader.cc", "android/bookmarks/partner_bookmarks_reader.cc",
......
// Copyright 2019 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.
#include "chrome/browser/android/background_task_scheduler/chrome_background_task_factory.h"
#include "chrome/android/chrome_jni_headers/ChromeBackgroundTaskFactory_jni.h"
ChromeBackgroundTaskFactory::~ChromeBackgroundTaskFactory() = default;
// static
void ChromeBackgroundTaskFactory::SetAsDefault() {
JNIEnv* env = base::android::AttachCurrentThread();
Java_ChromeBackgroundTaskFactory_setAsDefault(env);
}
// Copyright 2019 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.
#ifndef CHROME_BROWSER_ANDROID_BACKGROUND_TASK_SCHEDULER_CHROME_BACKGROUND_TASK_FACTORY_H_
#define CHROME_BROWSER_ANDROID_BACKGROUND_TASK_SCHEDULER_CHROME_BACKGROUND_TASK_FACTORY_H_
// Intermediate that sets the ChromeBackgroundTaskFactory from C++. The C++ code
// does not call ChromeApplication (java initializations), so this setting was
// necessary for associating task ids with corresponding BackgroundTask classes
// for BackgroundTaskScheduler. This class can be used to set the default
// factory class to ChromeBackgroundTaskFactory by calling
// ChromeBackgroundTaskFactory::SetAsDefault().
class ChromeBackgroundTaskFactory {
public:
// Disable default constructor.
ChromeBackgroundTaskFactory() = delete;
// Disable copy (and move) semantics.
ChromeBackgroundTaskFactory(const ChromeBackgroundTaskFactory&) = delete;
ChromeBackgroundTaskFactory& operator=(const ChromeBackgroundTaskFactory&) =
delete;
~ChromeBackgroundTaskFactory();
// Sets the default factory implementation in //chrome for associating task
// ids with corresponding BackgroundTask classes.
static void SetAsDefault();
};
#endif // CHROME_BROWSER_ANDROID_BACKGROUND_TASK_SCHEDULER_CHROME_BACKGROUND_TASK_FACTORY_H_
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include "net/dns/mock_host_resolver.h" #include "net/dns/mock_host_resolver.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "chrome/browser/android/background_task_scheduler/chrome_background_task_factory.h"
#include "chrome/test/base/android/android_browser_test.h" #include "chrome/test/base/android/android_browser_test.h"
#else #else
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
...@@ -77,10 +76,6 @@ class PaymentRequestCanMakePaymentTestBase : public PlatformBrowserTest, ...@@ -77,10 +76,6 @@ class PaymentRequestCanMakePaymentTestBase : public PlatformBrowserTest,
autofill::PersonalDataManagerFactory::GetForProfile(profile); autofill::PersonalDataManagerFactory::GetForProfile(profile);
personal_data_manager->SetSyncServiceForTest(&sync_service_); personal_data_manager->SetSyncServiceForTest(&sync_service_);
#if defined(OS_ANDROID)
ChromeBackgroundTaskFactory::SetAsDefault();
#endif
payment_request_controller_.SetUpOnMainThread(); payment_request_controller_.SetUpOnMainThread();
} }
......
...@@ -62,13 +62,6 @@ no arguments.** ...@@ -62,13 +62,6 @@ no arguments.**
A task must also have a unique ID, and it must be listed in `TaskIds` to ensure A task must also have a unique ID, and it must be listed in `TaskIds` to ensure
there is no overlap between different tasks. there is no overlap between different tasks.
The connection between `TaskIds` and the corresponding `BackgroundTask` classes is done by injecting
a `BackgroundTaskFactory` class in `BackgroundTaskSchedulerFactory`. For the //chrome embedder
(which is the only one needing the association), the `ChromeBackgroundTaskFactory` [implementation]
(https://cs.chromium.org/chromium/src/chrome/android/java/src/org/chromium/chrome/browser
/background_task_scheduler/ChromeBackgroundTaskFactory.java) was created. Anyone that adds a new
task id to `TaskIds` should add a case in this class to.
## How to schedule a task ## How to schedule a task
A task is scheduled by creating an object containing information about the task, A task is scheduled by creating an object containing information about the task,
...@@ -80,29 +73,21 @@ There are two main types of tasks; one-off tasks and periodic tasks. One-off ...@@ -80,29 +73,21 @@ There are two main types of tasks; one-off tasks and periodic tasks. One-off
tasks are only executed once, whereas periodic tasks are executed once per tasks are only executed once, whereas periodic tasks are executed once per
a defined interval. a defined interval.
There are two steps in the process of creating a TaskInfo:
1. the specific timing info is created; there are two objects available - `OneOffInfo` and
`PeriodicInfo`; each one of these objects has its own builder;
2. the task info is created using the `createTask` method; other parameters can be set afterwards.
As an example for how to create a one-off task that executes in 200 minutes, As an example for how to create a one-off task that executes in 200 minutes,
you can do the following: you can do the following:
```java ```java
TaskInfo.TimingInfo oneOffInfo = TaskInfo.OneOffInfo.create() TaskInfo.createOneOffTask(TaskIds.YOUR_FEATURE,
.setWindowEndTimeMs(TimeUnit.MINUTES.toMillis(200)).build(); MyBackgroundTask.class,
TaskInfo taskInfo = TaskInfo.createTask(TaskIds.YOUR_FEATURE, TimeUnit.MINUTES.toMillis(200)).build();
oneOffInfo).build();
``` ```
For a periodic task that executes every 200 minutes, you can call: For a periodic task that executes every 200 minutes, you can call:
```java ```java
TaskInfo.TimingInfo periodicInfo = TaskInfo.PeriodicInfo.create() TaskInfo.createPeriodicTask(TaskIds.YOUR_FEATURE,
.setIntervalMs(TimeUnit.MINUTES.toMillis(200)).build(); MyBackgroundTask.class,
TaskInfo taskInfo = TaskInfo.createTask(TaskIds.YOUR_FEATURE, TimeUnit.MINUTES.toMillis(200)).build();
periodicInfo).build();
``` ```
Typically you will also set other required parameters such as what type of Typically you will also set other required parameters such as what type of
...@@ -110,11 +95,12 @@ network conditions are necessary and whether the task requires the device to ...@@ -110,11 +95,12 @@ network conditions are necessary and whether the task requires the device to
be charging. They can be set on the builder like this: be charging. They can be set on the builder like this:
```java ```java
TaskInfo.TimingInfo oneOffInfo = TaskInfo.OneOffInfo.create() TaskInfo.createOneOffTask(TaskIds.YOUR_FEATURE,
.setWindowStartTimeMs(TimeUnit.MINUTES.toMillis(100)) MyBackgroundTask.class,
.setWindowEndTimeMs(TimeUnit.MINUTES.toMillis(200)).build(); /* windowStartTimeMs= */
TaskInfo taskInfo = TaskInfo.createTask(TaskIds.YOUR_FEATURE, TimeUnit.MINUTES.toMillis(100)
oneOffInfo) /* windowEndTimeMs= */
TimeUnit.MINUTES.toMillis(200))
.setRequiresCharging(true) .setRequiresCharging(true)
.setRequiredNetworkType( .setRequiredNetworkType(
TaskInfo.NETWORK_TYPE_UNMETERED) TaskInfo.NETWORK_TYPE_UNMETERED)
...@@ -151,11 +137,10 @@ Bundle myBundle = new Bundle(); ...@@ -151,11 +137,10 @@ Bundle myBundle = new Bundle();
myBundle.putString("foo", "bar"); myBundle.putString("foo", "bar");
myBundle.putLong("number", 1337L); myBundle.putLong("number", 1337L);
TaskInfo.TimingInfo oneOffInfo = TaskInfo.OneOffInfo.create() TaskInfo.createOneOffTask(TaskIds.YOUR_FEATURE,
.setWindowStartTimeMs(TimeUnit.MINUTES.toMillis(100)) MyBackgroundTask.class,
.setWindowEndTimeMs(TimeUnit.MINUTES.toMillis(200)).build(); TimeUnit.MINUTES.toMillis(100)
TaskInfo taskInfo = TaskInfo.createTask(TaskIds.YOUR_FEATURE, TimeUnit.MINUTES.toMillis(200))
oneOffInfo)
.setExtras(myBundle) .setExtras(myBundle)
.build(); .build();
``` ```
...@@ -174,29 +159,6 @@ boolean onStartTask(Context context, ...@@ -174,29 +159,6 @@ boolean onStartTask(Context context,
} }
``` ```
## Performing actions over TimingInfo objects
To perform actions over the `TimingInfo` objects, based on their implementation, the Visitor design
pattern was used. A public interface is exposed for this: `TimingInfoVisitor`. To use this
interface, someone should create a class that would look like this:
```java
class ImplementedActionVisitor implements TaskInfo.TimingInfoVisitor {
@Override
public void visit(TaskInfo.OneOffInfo oneOffInfo) { ... }
@Override
public void visit(TaskInfo.PeriodicInfo periodicInfo) { ... }
}
```
To use this visitor, someone would make the following calls:
```java
ImplementedActionVisitor visitor = new ImplementedActionVisitor();
myTimingInfo.accept(visitor);
```
## Loading Native parts ## Loading Native parts
Some of the tasks running in the background require native parts of the browser Some of the tasks running in the background require native parts of the browser
......
...@@ -84,13 +84,20 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule ...@@ -84,13 +84,20 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule
@VisibleForTesting @VisibleForTesting
static Task createTaskFromTaskInfo(@NonNull TaskInfo taskInfo) { static Task createTaskFromTaskInfo(@NonNull TaskInfo taskInfo) {
Bundle taskExtras = new Bundle(); Bundle taskExtras = new Bundle();
if (!taskInfo.isPeriodic() && taskInfo.getOneOffInfo().expiresAfterWindowEndTime()) {
taskExtras.putLong(BACKGROUND_TASK_DEADLINE_KEY, getDeadlineTime(taskInfo));
}
taskExtras.putBundle(BACKGROUND_TASK_EXTRAS_KEY, taskInfo.getExtras()); taskExtras.putBundle(BACKGROUND_TASK_EXTRAS_KEY, taskInfo.getExtras());
TaskBuilderVisitor taskBuilderVisitor = new TaskBuilderVisitor(taskExtras); Task.Builder builder;
taskInfo.getTimingInfo().accept(taskBuilderVisitor); if (taskInfo.isPeriodic()) {
Task.Builder builder = taskBuilderVisitor.getBuilder(); builder = getPeriodicTaskBuilder(taskInfo.getPeriodicInfo());
} else {
builder = getOneOffTaskBuilder(taskInfo.getOneOffInfo());
}
builder.setPersisted(taskInfo.isPersisted()) builder.setExtras(taskExtras)
.setPersisted(taskInfo.isPersisted())
.setRequiredNetwork(getGcmNetworkManagerNetworkTypeFromTypeFromTaskNetworkType( .setRequiredNetwork(getGcmNetworkManagerNetworkTypeFromTypeFromTaskNetworkType(
taskInfo.getRequiredNetworkType())) taskInfo.getRequiredNetworkType()))
.setRequiresCharging(taskInfo.requiresCharging()) .setRequiresCharging(taskInfo.requiresCharging())
...@@ -101,49 +108,27 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule ...@@ -101,49 +108,27 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule
return builder.build(); return builder.build();
} }
private static class TaskBuilderVisitor implements TaskInfo.TimingInfoVisitor { private static Task.Builder getPeriodicTaskBuilder(TaskInfo.PeriodicInfo periodicInfo) {
private Task.Builder mBuilder; PeriodicTask.Builder builder = new PeriodicTask.Builder();
private final Bundle mTaskExtras; builder.setPeriod(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getIntervalMs()));
if (periodicInfo.hasFlex()) {
TaskBuilderVisitor(Bundle taskExtras) { builder.setFlex(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getFlexMs()));
mTaskExtras = taskExtras;
}
// Only valid after a TimingInfo object was visited.
Task.Builder getBuilder() {
return mBuilder;
}
@Override
public void visit(TaskInfo.OneOffInfo oneOffInfo) {
if (oneOffInfo.expiresAfterWindowEndTime()) {
mTaskExtras.putLong(BACKGROUND_TASK_DEADLINE_KEY,
sClock.currentTimeMillis() + oneOffInfo.getWindowEndTimeMs());
}
OneoffTask.Builder builder = new OneoffTask.Builder();
long windowStartSeconds = oneOffInfo.hasWindowStartTimeConstraint()
? TimeUnit.MILLISECONDS.toSeconds(oneOffInfo.getWindowStartTimeMs())
: 0;
long windowEndTimeMs = oneOffInfo.getWindowEndTimeMs();
if (oneOffInfo.expiresAfterWindowEndTime()) {
windowEndTimeMs += DEADLINE_DELTA_MS;
}
builder.setExecutionWindow(
windowStartSeconds, TimeUnit.MILLISECONDS.toSeconds(windowEndTimeMs));
builder.setExtras(mTaskExtras);
mBuilder = builder;
} }
return builder;
}
@Override private static Task.Builder getOneOffTaskBuilder(TaskInfo.OneOffInfo oneOffInfo) {
public void visit(TaskInfo.PeriodicInfo periodicInfo) { OneoffTask.Builder builder = new OneoffTask.Builder();
PeriodicTask.Builder builder = new PeriodicTask.Builder(); long windowStartSeconds = oneOffInfo.hasWindowStartTimeConstraint()
builder.setPeriod(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getIntervalMs())); ? TimeUnit.MILLISECONDS.toSeconds(oneOffInfo.getWindowStartTimeMs())
if (periodicInfo.hasFlex()) { : 0;
builder.setFlex(TimeUnit.MILLISECONDS.toSeconds(periodicInfo.getFlexMs())); long windowEndTimeMs = oneOffInfo.getWindowEndTimeMs();
} if (oneOffInfo.expiresAfterWindowEndTime()) {
mBuilder = builder; windowEndTimeMs += DEADLINE_DELTA_MS;
} }
builder.setExecutionWindow(
windowStartSeconds, TimeUnit.MILLISECONDS.toSeconds(windowEndTimeMs));
return builder;
} }
private static int getGcmNetworkManagerNetworkTypeFromTypeFromTaskNetworkType( private static int getGcmNetworkManagerNetworkTypeFromTypeFromTaskNetworkType(
......
...@@ -46,12 +46,10 @@ class BackgroundTaskSchedulerImpl implements BackgroundTaskScheduler { ...@@ -46,12 +46,10 @@ class BackgroundTaskSchedulerImpl implements BackgroundTaskScheduler {
boolean success = mSchedulerDelegate.schedule(context, taskInfo); boolean success = mSchedulerDelegate.schedule(context, taskInfo);
BackgroundTaskSchedulerUma.getInstance().reportTaskScheduled( BackgroundTaskSchedulerUma.getInstance().reportTaskScheduled(
taskInfo.getTaskId(), success); taskInfo.getTaskId(), success);
if (!taskInfo.isPeriodic()) {
// Retain expiration metrics BackgroundTaskSchedulerUma.getInstance().reportTaskCreatedAndExpirationState(
ExpirationMetricsVisitor expirationMetricsVisitor = taskInfo.getTaskId(), taskInfo.getOneOffInfo().expiresAfterWindowEndTime());
new ExpirationMetricsVisitor(taskInfo.getTaskId()); }
taskInfo.getTimingInfo().accept(expirationMetricsVisitor);
if (success) { if (success) {
BackgroundTaskSchedulerPrefs.addScheduledTask(taskInfo); BackgroundTaskSchedulerPrefs.addScheduledTask(taskInfo);
} }
...@@ -59,26 +57,6 @@ class BackgroundTaskSchedulerImpl implements BackgroundTaskScheduler { ...@@ -59,26 +57,6 @@ class BackgroundTaskSchedulerImpl implements BackgroundTaskScheduler {
} }
} }
private class ExpirationMetricsVisitor implements TaskInfo.TimingInfoVisitor {
private final int mTaskId;
ExpirationMetricsVisitor(int taskId) {
mTaskId = taskId;
}
@Override
public void visit(TaskInfo.OneOffInfo oneOffInfo) {
BackgroundTaskSchedulerUma.getInstance().reportTaskCreatedAndExpirationState(
mTaskId, oneOffInfo.expiresAfterWindowEndTime());
}
@Override
public void visit(TaskInfo.PeriodicInfo periodicInfo) {
BackgroundTaskSchedulerUma.getInstance().reportTaskCreatedAndExpirationState(
mTaskId, periodicInfo.expiresAfterWindowEndTime());
}
}
@Override @Override
public void cancel(Context context, int taskId) { public void cancel(Context context, int taskId) {
try (TraceEvent te = TraceEvent.scoped( try (TraceEvent te = TraceEvent.scoped(
......
...@@ -48,6 +48,11 @@ class BackgroundTaskSchedulerJobService implements BackgroundTaskSchedulerDelega ...@@ -48,6 +48,11 @@ class BackgroundTaskSchedulerJobService implements BackgroundTaskSchedulerDelega
return extras.getLong(BACKGROUND_TASK_DEADLINE_KEY); return extras.getLong(BACKGROUND_TASK_DEADLINE_KEY);
} }
private static long getDeadlineTime(TaskInfo taskInfo) {
long windowEndTimeMs = taskInfo.getOneOffInfo().getWindowEndTimeMs();
return sClock.currentTimeMillis() + windowEndTimeMs;
}
/** /**
* Retrieves the {@link TaskParameters} from the {@link JobParameters}, which are passed as * Retrieves the {@link TaskParameters} from the {@link JobParameters}, which are passed as
* one of the keys. Only values valid for {@link android.os.BaseBundle} are supported, and other * one of the keys. Only values valid for {@link android.os.BaseBundle} are supported, and other
...@@ -74,6 +79,10 @@ class BackgroundTaskSchedulerJobService implements BackgroundTaskSchedulerDelega ...@@ -74,6 +79,10 @@ class BackgroundTaskSchedulerJobService implements BackgroundTaskSchedulerDelega
static JobInfo createJobInfoFromTaskInfo(Context context, TaskInfo taskInfo) { static JobInfo createJobInfoFromTaskInfo(Context context, TaskInfo taskInfo) {
PersistableBundle jobExtras = new PersistableBundle(); PersistableBundle jobExtras = new PersistableBundle();
if (!taskInfo.isPeriodic() && taskInfo.getOneOffInfo().expiresAfterWindowEndTime()) {
jobExtras.putLong(BACKGROUND_TASK_DEADLINE_KEY, getDeadlineTime(taskInfo));
}
PersistableBundle persistableBundle = getTaskExtrasAsPersistableBundle(taskInfo); PersistableBundle persistableBundle = getTaskExtrasAsPersistableBundle(taskInfo);
jobExtras.putPersistableBundle(BACKGROUND_TASK_EXTRAS_KEY, persistableBundle); jobExtras.putPersistableBundle(BACKGROUND_TASK_EXTRAS_KEY, persistableBundle);
...@@ -81,60 +90,42 @@ class BackgroundTaskSchedulerJobService implements BackgroundTaskSchedulerDelega ...@@ -81,60 +90,42 @@ class BackgroundTaskSchedulerJobService implements BackgroundTaskSchedulerDelega
new JobInfo new JobInfo
.Builder(taskInfo.getTaskId(), .Builder(taskInfo.getTaskId(),
new ComponentName(context, BackgroundTaskJobService.class)) new ComponentName(context, BackgroundTaskJobService.class))
.setExtras(jobExtras)
.setPersisted(taskInfo.isPersisted()) .setPersisted(taskInfo.isPersisted())
.setRequiresCharging(taskInfo.requiresCharging()) .setRequiresCharging(taskInfo.requiresCharging())
.setRequiredNetworkType(getJobInfoNetworkTypeFromTaskNetworkType( .setRequiredNetworkType(getJobInfoNetworkTypeFromTaskNetworkType(
taskInfo.getRequiredNetworkType())); taskInfo.getRequiredNetworkType()));
JobInfoBuilderVisitor jobInfoBuilderVisitor = new JobInfoBuilderVisitor(builder, jobExtras); if (taskInfo.isPeriodic()) {
taskInfo.getTimingInfo().accept(jobInfoBuilderVisitor); builder = getPeriodicJobInfo(builder, taskInfo);
builder = jobInfoBuilderVisitor.getBuilder(); } else {
builder = getOneOffJobInfo(builder, taskInfo);
}
return builder.build(); return builder.build();
} }
private static class JobInfoBuilderVisitor implements TaskInfo.TimingInfoVisitor { private static JobInfo.Builder getOneOffJobInfo(JobInfo.Builder builder, TaskInfo taskInfo) {
private final JobInfo.Builder mBuilder; TaskInfo.OneOffInfo oneOffInfo = taskInfo.getOneOffInfo();
private final PersistableBundle mJobExtras; if (oneOffInfo.hasWindowStartTimeConstraint()) {
builder = builder.setMinimumLatency(oneOffInfo.getWindowStartTimeMs());
JobInfoBuilderVisitor(JobInfo.Builder builder, PersistableBundle jobExtras) {
mBuilder = builder;
mJobExtras = jobExtras;
} }
long windowEndTimeMs = oneOffInfo.getWindowEndTimeMs();
// Only valid after a TimingInfo object was visited. if (oneOffInfo.expiresAfterWindowEndTime()) {
JobInfo.Builder getBuilder() { windowEndTimeMs += DEADLINE_DELTA_MS;
return mBuilder;
} }
return builder.setOverrideDeadline(windowEndTimeMs);
}
@Override private static JobInfo.Builder getPeriodicJobInfo(JobInfo.Builder builder, TaskInfo taskInfo) {
public void visit(TaskInfo.OneOffInfo oneOffInfo) { TaskInfo.PeriodicInfo periodicInfo = taskInfo.getPeriodicInfo();
if (oneOffInfo.expiresAfterWindowEndTime()) { if (periodicInfo.hasFlex()) {
mJobExtras.putLong(BACKGROUND_TASK_DEADLINE_KEY, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
sClock.currentTimeMillis() + oneOffInfo.getWindowEndTimeMs()); return builder.setPeriodic(periodicInfo.getIntervalMs(), periodicInfo.getFlexMs());
}
mBuilder.setExtras(mJobExtras);
if (oneOffInfo.hasWindowStartTimeConstraint()) {
mBuilder.setMinimumLatency(oneOffInfo.getWindowStartTimeMs());
}
long windowEndTimeMs = oneOffInfo.getWindowEndTimeMs();
if (oneOffInfo.expiresAfterWindowEndTime()) {
windowEndTimeMs += DEADLINE_DELTA_MS;
}
mBuilder.setOverrideDeadline(windowEndTimeMs);
}
@Override
public void visit(TaskInfo.PeriodicInfo periodicInfo) {
mBuilder.setExtras(mJobExtras);
if (periodicInfo.hasFlex() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mBuilder.setPeriodic(periodicInfo.getIntervalMs(), periodicInfo.getFlexMs());
return;
} }
mBuilder.setPeriodic(periodicInfo.getIntervalMs()); return builder.setPeriodic(periodicInfo.getIntervalMs());
} }
return builder.setPeriodic(periodicInfo.getIntervalMs());
} }
private static int getJobInfoNetworkTypeFromTaskNetworkType( private static int getJobInfoNetworkTypeFromTaskNetworkType(
......
...@@ -42,11 +42,9 @@ public class BackgroundTaskSchedulerImplWithMockTest { ...@@ -42,11 +42,9 @@ public class BackgroundTaskSchedulerImplWithMockTest {
@Test @Test
@SmallTest @SmallTest
public void testOneOffTaskScheduling() { public void testOneOffTaskScheduling() {
TaskInfo.TimingInfo timingInfo = TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
TaskInfo.OneOffInfo.create() TimeUnit.MINUTES.toMillis(TEST_MINUTES))
.setWindowEndTimeMs(TimeUnit.MINUTES.toMillis(TEST_MINUTES)) .build();
.build();
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
MockBackgroundTaskSchedulerDelegate delegate = new MockBackgroundTaskSchedulerDelegate(); MockBackgroundTaskSchedulerDelegate delegate = new MockBackgroundTaskSchedulerDelegate();
BackgroundTaskScheduler taskScheduler = new BackgroundTaskSchedulerImpl(delegate); BackgroundTaskScheduler taskScheduler = new BackgroundTaskSchedulerImpl(delegate);
...@@ -61,11 +59,9 @@ public class BackgroundTaskSchedulerImplWithMockTest { ...@@ -61,11 +59,9 @@ public class BackgroundTaskSchedulerImplWithMockTest {
@Test @Test
@SmallTest @SmallTest
public void testPeriodicTaskScheduling() { public void testPeriodicTaskScheduling() {
TaskInfo.TimingInfo timingInfo = TaskInfo periodicTask = TaskInfo.createPeriodicTask(TaskIds.TEST, TestBackgroundTask.class,
TaskInfo.PeriodicInfo.create() TimeUnit.MINUTES.toMillis(TEST_MINUTES))
.setIntervalMs(TimeUnit.MINUTES.toMillis(TEST_MINUTES)) .build();
.build();
TaskInfo periodicTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
MockBackgroundTaskSchedulerDelegate delegate = new MockBackgroundTaskSchedulerDelegate(); MockBackgroundTaskSchedulerDelegate delegate = new MockBackgroundTaskSchedulerDelegate();
BackgroundTaskScheduler taskScheduler = new BackgroundTaskSchedulerImpl(delegate); BackgroundTaskScheduler taskScheduler = new BackgroundTaskSchedulerImpl(delegate);
......
...@@ -64,9 +64,9 @@ public class BackgroundTaskSchedulerJobServiceTest { ...@@ -64,9 +64,9 @@ public class BackgroundTaskSchedulerJobServiceTest {
@Test @Test
@SmallTest @SmallTest
public void testOneOffTaskWithDeadline() { public void testOneOffTaskWithDeadline() {
TaskInfo.TimingInfo timingInfo = TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_200_MIN_TO_MS).build(); TIME_200_MIN_TO_MS)
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build(); .build();
JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo( JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo(
InstrumentationRegistry.getTargetContext(), oneOffTask); InstrumentationRegistry.getTargetContext(), oneOffTask);
Assert.assertEquals(oneOffTask.getTaskId(), jobInfo.getId()); Assert.assertEquals(oneOffTask.getTaskId(), jobInfo.getId());
...@@ -77,11 +77,10 @@ public class BackgroundTaskSchedulerJobServiceTest { ...@@ -77,11 +77,10 @@ public class BackgroundTaskSchedulerJobServiceTest {
@Test @Test
@SmallTest @SmallTest
public void testOneOffTaskWithDeadlineAndExpiration() { public void testOneOffTaskWithDeadlineAndExpiration() {
TaskInfo.TimingInfo timingInfo = TaskInfo.OneOffInfo.create() TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
.setWindowEndTimeMs(TIME_200_MIN_TO_MS) TIME_200_MIN_TO_MS)
.setExpiresAfterWindowEndTime(true) .setExpiresAfterWindowEndTime(true)
.build(); .build();
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo( JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo(
InstrumentationRegistry.getTargetContext(), oneOffTask); InstrumentationRegistry.getTargetContext(), oneOffTask);
Assert.assertEquals(END_TIME_WITH_DEADLINE_MS, jobInfo.getMaxExecutionDelayMillis()); Assert.assertEquals(END_TIME_WITH_DEADLINE_MS, jobInfo.getMaxExecutionDelayMillis());
...@@ -93,11 +92,9 @@ public class BackgroundTaskSchedulerJobServiceTest { ...@@ -93,11 +92,9 @@ public class BackgroundTaskSchedulerJobServiceTest {
@Test @Test
@SmallTest @SmallTest
public void testOneOffTaskWithWindow() { public void testOneOffTaskWithWindow() {
TaskInfo.TimingInfo timingInfo = TaskInfo.OneOffInfo.create() TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
.setWindowStartTimeMs(TIME_100_MIN_TO_MS) TIME_100_MIN_TO_MS, TIME_200_MIN_TO_MS)
.setWindowEndTimeMs(TIME_200_MIN_TO_MS) .build();
.build();
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo( JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo(
InstrumentationRegistry.getTargetContext(), oneOffTask); InstrumentationRegistry.getTargetContext(), oneOffTask);
Assert.assertEquals(oneOffTask.getTaskId(), jobInfo.getId()); Assert.assertEquals(oneOffTask.getTaskId(), jobInfo.getId());
...@@ -109,12 +106,10 @@ public class BackgroundTaskSchedulerJobServiceTest { ...@@ -109,12 +106,10 @@ public class BackgroundTaskSchedulerJobServiceTest {
@Test @Test
@SmallTest @SmallTest
public void testOneOffTaskWithWindowAndExpiration() { public void testOneOffTaskWithWindowAndExpiration() {
TaskInfo.TimingInfo timingInfo = TaskInfo.OneOffInfo.create() TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
.setWindowStartTimeMs(TIME_100_MIN_TO_MS) TIME_100_MIN_TO_MS, TIME_200_MIN_TO_MS)
.setWindowEndTimeMs(TIME_200_MIN_TO_MS) .setExpiresAfterWindowEndTime(true)
.setExpiresAfterWindowEndTime(true) .build();
.build();
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo( JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo(
InstrumentationRegistry.getTargetContext(), oneOffTask); InstrumentationRegistry.getTargetContext(), oneOffTask);
Assert.assertEquals( Assert.assertEquals(
...@@ -128,9 +123,9 @@ public class BackgroundTaskSchedulerJobServiceTest { ...@@ -128,9 +123,9 @@ public class BackgroundTaskSchedulerJobServiceTest {
@Test @Test
@SmallTest @SmallTest
public void testPeriodicTaskWithoutFlex() { public void testPeriodicTaskWithoutFlex() {
TaskInfo.TimingInfo timingInfo = TaskInfo periodicTask = TaskInfo.createPeriodicTask(TaskIds.TEST, TestBackgroundTask.class,
TaskInfo.PeriodicInfo.create().setIntervalMs(TIME_200_MIN_TO_MS).build(); TIME_200_MIN_TO_MS)
TaskInfo periodicTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build(); .build();
JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo( JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo(
InstrumentationRegistry.getTargetContext(), periodicTask); InstrumentationRegistry.getTargetContext(), periodicTask);
Assert.assertEquals(periodicTask.getTaskId(), jobInfo.getId()); Assert.assertEquals(periodicTask.getTaskId(), jobInfo.getId());
...@@ -141,11 +136,9 @@ public class BackgroundTaskSchedulerJobServiceTest { ...@@ -141,11 +136,9 @@ public class BackgroundTaskSchedulerJobServiceTest {
@Test @Test
@SmallTest @SmallTest
public void testPeriodicTaskWithFlex() { public void testPeriodicTaskWithFlex() {
TaskInfo.TimingInfo timingInfo = TaskInfo.PeriodicInfo.create() TaskInfo periodicTask = TaskInfo.createPeriodicTask(TaskIds.TEST, TestBackgroundTask.class,
.setIntervalMs(TIME_200_MIN_TO_MS) TIME_200_MIN_TO_MS, TIME_50_MIN_TO_MS)
.setFlexMs(TIME_50_MIN_TO_MS) .build();
.build();
TaskInfo periodicTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo( JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo(
InstrumentationRegistry.getTargetContext(), periodicTask); InstrumentationRegistry.getTargetContext(), periodicTask);
Assert.assertEquals(TIME_200_MIN_TO_MS, jobInfo.getIntervalMillis()); Assert.assertEquals(TIME_200_MIN_TO_MS, jobInfo.getIntervalMillis());
...@@ -161,10 +154,10 @@ public class BackgroundTaskSchedulerJobServiceTest { ...@@ -161,10 +154,10 @@ public class BackgroundTaskSchedulerJobServiceTest {
taskExtras.putString("foo", "bar"); taskExtras.putString("foo", "bar");
taskExtras.putBoolean("bools", true); taskExtras.putBoolean("bools", true);
taskExtras.putLong("longs", 1342543L); taskExtras.putLong("longs", 1342543L);
TaskInfo.TimingInfo timingInfo = TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_200_MIN_TO_MS).build(); TIME_200_MIN_TO_MS)
TaskInfo oneOffTask = .setExtras(taskExtras)
TaskInfo.createTask(TaskIds.TEST, timingInfo).setExtras(taskExtras).build(); .build();
JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo( JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo(
InstrumentationRegistry.getTargetContext(), oneOffTask); InstrumentationRegistry.getTargetContext(), oneOffTask);
Assert.assertEquals(oneOffTask.getTaskId(), jobInfo.getId()); Assert.assertEquals(oneOffTask.getTaskId(), jobInfo.getId());
...@@ -180,9 +173,8 @@ public class BackgroundTaskSchedulerJobServiceTest { ...@@ -180,9 +173,8 @@ public class BackgroundTaskSchedulerJobServiceTest {
@Test @Test
@SmallTest @SmallTest
public void testTaskInfoWithManyConstraints() { public void testTaskInfoWithManyConstraints() {
TaskInfo.TimingInfo timingInfo = TaskInfo.Builder taskBuilder = TaskInfo.createOneOffTask(
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_200_MIN_TO_MS).build(); TaskIds.TEST, TestBackgroundTask.class, TIME_200_MIN_TO_MS);
TaskInfo.Builder taskBuilder = TaskInfo.createTask(TaskIds.TEST, timingInfo);
JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo( JobInfo jobInfo = BackgroundTaskSchedulerJobService.createJobInfoFromTaskInfo(
InstrumentationRegistry.getTargetContext(), InstrumentationRegistry.getTargetContext(),
......
...@@ -199,9 +199,9 @@ public class BackgroundTaskGcmTaskServiceTest { ...@@ -199,9 +199,9 @@ public class BackgroundTaskGcmTaskServiceTest {
ReflectionHelpers.setStaticField( ReflectionHelpers.setStaticField(
Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.LOLLIPOP); Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.LOLLIPOP);
TaskInfo.TimingInfo timingInfo = TaskInfo task = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TimeUnit.DAYS.toMillis(1)).build(); TimeUnit.DAYS.toMillis(1))
TaskInfo task = TaskInfo.createTask(TaskIds.TEST, timingInfo).build(); .build();
BackgroundTaskSchedulerPrefs.addScheduledTask(task); BackgroundTaskSchedulerPrefs.addScheduledTask(task);
assertEquals(0, TestBackgroundTask.getRescheduleCalls()); assertEquals(0, TestBackgroundTask.getRescheduleCalls());
...@@ -215,9 +215,9 @@ public class BackgroundTaskGcmTaskServiceTest { ...@@ -215,9 +215,9 @@ public class BackgroundTaskGcmTaskServiceTest {
BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(new TestBackgroundTaskFactory()); BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(new TestBackgroundTaskFactory());
ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.M); ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.M);
TaskInfo.TimingInfo timingInfo = TaskInfo task = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TimeUnit.DAYS.toMillis(1)).build(); TimeUnit.DAYS.toMillis(1))
TaskInfo task = TaskInfo.createTask(TaskIds.TEST, timingInfo).build(); .build();
BackgroundTaskSchedulerPrefs.addScheduledTask(task); BackgroundTaskSchedulerPrefs.addScheduledTask(task);
assertEquals(0, TestBackgroundTask.getRescheduleCalls()); assertEquals(0, TestBackgroundTask.getRescheduleCalls());
......
...@@ -65,16 +65,13 @@ public class BackgroundTaskSchedulerImplTest { ...@@ -65,16 +65,13 @@ public class BackgroundTaskSchedulerImplTest {
mGcmNetworkManager = (ShadowGcmNetworkManager) Shadow.extract( mGcmNetworkManager = (ShadowGcmNetworkManager) Shadow.extract(
GcmNetworkManager.getInstance(ContextUtils.getApplicationContext())); GcmNetworkManager.getInstance(ContextUtils.getApplicationContext()));
TaskInfo.TimingInfo timingInfo = mTask = TaskInfo.createOneOffTask(
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TimeUnit.DAYS.toMillis(1)).build(); TaskIds.TEST, TestBackgroundTask.class, TimeUnit.DAYS.toMillis(1))
mTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
TaskInfo.TimingInfo expirationTimingInfo =
TaskInfo.OneOffInfo.create()
.setWindowEndTimeMs(TimeUnit.DAYS.toMillis(1))
.setExpiresAfterWindowEndTime(true)
.build(); .build();
mExpirationTask = TaskInfo.createTask(TaskIds.TEST, expirationTimingInfo).build(); mExpirationTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
TimeUnit.DAYS.toMillis(1))
.setExpiresAfterWindowEndTime(true)
.build();
BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(new TestBackgroundTaskFactory()); BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(new TestBackgroundTaskFactory());
} }
......
...@@ -41,28 +41,19 @@ public class BackgroundTaskSchedulerPrefsTest { ...@@ -41,28 +41,19 @@ public class BackgroundTaskSchedulerPrefsTest {
private TaskInfo mTask1; private TaskInfo mTask1;
private TaskInfo mTask2; private TaskInfo mTask2;
private class AllValidTestBackgroundTaskFactory implements BackgroundTaskFactory {
@Override
public BackgroundTask getBackgroundTaskFromTaskId(int taskId) {
return new TestBackgroundTask();
}
}
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
BackgroundTaskSchedulerUma.setInstanceForTesting(mUmaSpy); BackgroundTaskSchedulerUma.setInstanceForTesting(mUmaSpy);
doNothing().when(mUmaSpy).assertNativeIsLoaded(); doNothing().when(mUmaSpy).assertNativeIsLoaded();
TaskInfo.TimingInfo timingInfo1 = mTask1 = TaskInfo.createOneOffTask(
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TimeUnit.DAYS.toMillis(1)).build(); TaskIds.TEST, TestBackgroundTask.class, TimeUnit.DAYS.toMillis(1))
mTask1 = TaskInfo.createTask(TaskIds.TEST, timingInfo1).build(); .build();
TaskInfo.TimingInfo timingInfo2 = mTask2 = TaskInfo.createOneOffTask(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID,
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TimeUnit.DAYS.toMillis(1)).build(); TestBackgroundTask.class, TimeUnit.DAYS.toMillis(1))
mTask2 = TaskInfo.createTask(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID, timingInfo2).build(); .build();
BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(new TestBackgroundTaskFactory());
BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(
new AllValidTestBackgroundTaskFactory());
} }
@Test @Test
...@@ -79,10 +70,9 @@ public class BackgroundTaskSchedulerPrefsTest { ...@@ -79,10 +70,9 @@ public class BackgroundTaskSchedulerPrefsTest {
BackgroundTaskSchedulerPrefs.addScheduledTask(mTask2); BackgroundTaskSchedulerPrefs.addScheduledTask(mTask2);
assertEquals("There should be 2 tasks in shared prefs.", 2, assertEquals("There should be 2 tasks in shared prefs.", 2,
BackgroundTaskSchedulerPrefs.getScheduledTaskIds().size()); BackgroundTaskSchedulerPrefs.getScheduledTaskIds().size());
TaskInfo task3 = TaskInfo.createOneOffTask(TaskIds.OMAHA_JOB_ID, TestBackgroundTask.class,
TaskInfo.TimingInfo timingInfo = TimeUnit.DAYS.toMillis(1))
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TimeUnit.DAYS.toMillis(1)).build(); .build();
TaskInfo task3 = TaskInfo.createTask(TaskIds.OMAHA_JOB_ID, timingInfo).build();
BackgroundTaskSchedulerPrefs.addScheduledTask(task3); BackgroundTaskSchedulerPrefs.addScheduledTask(task3);
assertEquals("There should be 3 tasks in shared prefs.", 3, assertEquals("There should be 3 tasks in shared prefs.", 3,
......
...@@ -6,8 +6,6 @@ package org.chromium.components.background_task_scheduler; ...@@ -6,8 +6,6 @@ package org.chromium.components.background_task_scheduler;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import org.junit.Before; import org.junit.Before;
...@@ -31,42 +29,38 @@ public class TaskInfoTest { ...@@ -31,42 +29,38 @@ public class TaskInfoTest {
@Before @Before
public void setUp() { public void setUp() {
TestBackgroundTask.reset(); TestBackgroundTask.reset();
BackgroundTaskSchedulerFactory.setBackgroundTaskFactory(new TestBackgroundTaskFactory());
} }
private void checkGeneralTaskInfoFields(TaskInfo taskInfo, int taskId) { private void checkGeneralTaskInfoFields(
TaskInfo taskInfo, int taskId, Class<? extends BackgroundTask> backgroundTaskClass) {
assertEquals(taskId, taskInfo.getTaskId()); assertEquals(taskId, taskInfo.getTaskId());
assertEquals(TestBackgroundTask.class, taskInfo.getBackgroundTaskClass()); assertEquals(backgroundTaskClass, taskInfo.getBackgroundTaskClass());
} }
@Test @Test
@Feature({"BackgroundTaskScheduler"}) @Feature({"BackgroundTaskScheduler"})
public void testOneOffExpirationWithinDeadline() { public void testOneOffExpirationWithinDeadline() {
TaskInfo.TimingInfo timingInfo = TaskInfo.OneOffInfo.create() TaskInfo oneOffTask =
.setWindowEndTimeMs(TEST_END_MS) TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class, TEST_END_MS)
.setExpiresAfterWindowEndTime(true) .setExpiresAfterWindowEndTime(true)
.build(); .build();
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
checkGeneralTaskInfoFields(oneOffTask, TaskIds.TEST); checkGeneralTaskInfoFields(oneOffTask, TaskIds.TEST, TestBackgroundTask.class);
assertFalse(oneOffTask.getOneOffInfo().hasWindowStartTimeConstraint()); assertFalse(oneOffTask.getOneOffInfo().hasWindowStartTimeConstraint());
assertEquals(TEST_END_MS, oneOffTask.getOneOffInfo().getWindowEndTimeMs()); assertEquals(TEST_END_MS, oneOffTask.getOneOffInfo().getWindowEndTimeMs());
assertTrue(oneOffTask.getOneOffInfo().expiresAfterWindowEndTime()); assertTrue(oneOffTask.getOneOffInfo().expiresAfterWindowEndTime());
assertNotNull(oneOffTask.getOneOffInfo()); assertEquals(null, oneOffTask.getPeriodicInfo());
assertNull(oneOffTask.getPeriodicInfo());
} }
@Test @Test
@Feature({"BackgroundTaskScheduler"}) @Feature({"BackgroundTaskScheduler"})
public void testOneOffExpirationWithinTimeWindow() { public void testOneOffExpirationWithinTimeWindow() {
TaskInfo.TimingInfo timingInfo = TaskInfo.OneOffInfo.create() TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
.setWindowStartTimeMs(TEST_START_MS) TEST_START_MS, TEST_END_MS)
.setWindowEndTimeMs(TEST_END_MS) .setExpiresAfterWindowEndTime(true)
.setExpiresAfterWindowEndTime(true) .build();
.build();
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
assertTrue(oneOffTask.getOneOffInfo().hasWindowStartTimeConstraint()); assertTrue(oneOffTask.getOneOffInfo().hasWindowStartTimeConstraint());
assertEquals(TEST_START_MS, oneOffTask.getOneOffInfo().getWindowStartTimeMs()); assertEquals(TEST_START_MS, oneOffTask.getOneOffInfo().getWindowStartTimeMs());
...@@ -77,39 +71,25 @@ public class TaskInfoTest { ...@@ -77,39 +71,25 @@ public class TaskInfoTest {
@Test @Test
@Feature({"BackgroundTaskScheduler"}) @Feature({"BackgroundTaskScheduler"})
public void testOneOffExpirationWithinZeroTimeWindow() { public void testOneOffExpirationWithinZeroTimeWindow() {
TaskInfo.TimingInfo timingInfo = TaskInfo.OneOffInfo.create() TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
.setWindowStartTimeMs(TEST_END_MS) TEST_END_MS, TEST_END_MS)
.setWindowEndTimeMs(TEST_END_MS) .setExpiresAfterWindowEndTime(true)
.setExpiresAfterWindowEndTime(true) .build();
.build();
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
assertEquals(TEST_END_MS, oneOffTask.getOneOffInfo().getWindowStartTimeMs()); assertEquals(TEST_END_MS, oneOffTask.getOneOffInfo().getWindowStartTimeMs());
assertEquals(TEST_END_MS, oneOffTask.getOneOffInfo().getWindowEndTimeMs()); assertEquals(TEST_END_MS, oneOffTask.getOneOffInfo().getWindowEndTimeMs());
assertTrue(oneOffTask.getOneOffInfo().expiresAfterWindowEndTime()); assertTrue(oneOffTask.getOneOffInfo().expiresAfterWindowEndTime());
} }
@Test
@Feature({"BackgroundTaskScheduler"})
public void testOneOffNoParamsSet() {
TaskInfo.TimingInfo timingInfo = TaskInfo.OneOffInfo.create().build();
TaskInfo oneOffTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
assertFalse(oneOffTask.getOneOffInfo().hasWindowStartTimeConstraint());
assertEquals(0, oneOffTask.getOneOffInfo().getWindowEndTimeMs());
assertFalse(oneOffTask.getOneOffInfo().expiresAfterWindowEndTime());
}
@Test @Test
@Feature({"BackgroundTaskScheduler"}) @Feature({"BackgroundTaskScheduler"})
public void testPeriodicExpirationWithInterval() { public void testPeriodicExpirationWithInterval() {
TaskInfo.TimingInfo timingInfo = TaskInfo.PeriodicInfo.create() TaskInfo periodicTask =
.setIntervalMs(TEST_END_MS) TaskInfo.createPeriodicTask(TaskIds.TEST, TestBackgroundTask.class, TEST_END_MS)
.setExpiresAfterWindowEndTime(true) .setExpiresAfterWindowEndTime(true)
.build(); .build();
TaskInfo periodicTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
checkGeneralTaskInfoFields(periodicTask, TaskIds.TEST); checkGeneralTaskInfoFields(periodicTask, TaskIds.TEST, TestBackgroundTask.class);
assertFalse(periodicTask.getPeriodicInfo().hasFlex()); assertFalse(periodicTask.getPeriodicInfo().hasFlex());
assertEquals(TEST_END_MS, periodicTask.getPeriodicInfo().getIntervalMs()); assertEquals(TEST_END_MS, periodicTask.getPeriodicInfo().getIntervalMs());
...@@ -121,27 +101,14 @@ public class TaskInfoTest { ...@@ -121,27 +101,14 @@ public class TaskInfoTest {
@Test @Test
@Feature({"BackgroundTaskScheduler"}) @Feature({"BackgroundTaskScheduler"})
public void testPeriodicExpirationWithIntervalAndFlex() { public void testPeriodicExpirationWithIntervalAndFlex() {
TaskInfo.TimingInfo timingInfo = TaskInfo.PeriodicInfo.create() TaskInfo periodicTask = TaskInfo.createPeriodicTask(TaskIds.TEST, TestBackgroundTask.class,
.setIntervalMs(TEST_END_MS) TEST_END_MS, TEST_FLEX_MS)
.setFlexMs(TEST_FLEX_MS) .setExpiresAfterWindowEndTime(true)
.setExpiresAfterWindowEndTime(true) .build();
.build();
TaskInfo periodicTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
assertTrue(periodicTask.getPeriodicInfo().hasFlex()); assertTrue(periodicTask.getPeriodicInfo().hasFlex());
assertEquals(TEST_FLEX_MS, periodicTask.getPeriodicInfo().getFlexMs()); assertEquals(TEST_FLEX_MS, periodicTask.getPeriodicInfo().getFlexMs());
assertEquals(TEST_END_MS, periodicTask.getPeriodicInfo().getIntervalMs()); assertEquals(TEST_END_MS, periodicTask.getPeriodicInfo().getIntervalMs());
assertTrue(periodicTask.getPeriodicInfo().expiresAfterWindowEndTime()); assertTrue(periodicTask.getPeriodicInfo().expiresAfterWindowEndTime());
} }
@Test
@Feature({"BackgroundTaskScheduler"})
public void testPeriodicNoParamsSet() {
TaskInfo.TimingInfo timingInfo = TaskInfo.PeriodicInfo.create().build();
TaskInfo periodicTask = TaskInfo.createTask(TaskIds.TEST, timingInfo).build();
assertFalse(periodicTask.getPeriodicInfo().hasFlex());
assertEquals(0, periodicTask.getPeriodicInfo().getIntervalMs());
assertFalse(periodicTask.getPeriodicInfo().expiresAfterWindowEndTime());
}
} }
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment