| Index: components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskScheduler.java
|
| diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskScheduler.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskScheduler.java
|
| index 2fd58ac3812c438dffc583864270e6bc83ca27ca..e690273845cec8b60d884414c42f4836b2c5325b 100644
|
| --- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskScheduler.java
|
| +++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskScheduler.java
|
| @@ -95,6 +95,41 @@ public class BackgroundTaskScheduler {
|
| mSchedulerDelegate.cancel(context, taskId);
|
| }
|
|
|
| + /**
|
| + * Checks whether OS was upgraded and triggers rescheduling if it is necessary.
|
| + * Rescheduling is necessary if type of background task scheduler delegate is different for a
|
| + * new version of the OS.
|
| + *
|
| + * @param context the current context.
|
| + */
|
| + public void checkForOSUpgrade(Context context) {
|
| + int oldSdkInt = BackgroundTaskSchedulerPrefs.getLastSdkVersion();
|
| + int newSdkInt = Build.VERSION.SDK_INT;
|
| + // No OS upgrade detected.
|
| + if (oldSdkInt == newSdkInt) return;
|
| +
|
| + // Save the current SDK version to preferences.
|
| + BackgroundTaskSchedulerPrefs.setLastSdkVersion(newSdkInt);
|
| +
|
| + // Check for OS upgrades forcing delegate change or "just in case" rescheduling.
|
| + if (!osUpgradeChangesDelegateType(oldSdkInt, newSdkInt)) return;
|
| +
|
| + // Explicitly create and invoke old delegate type to cancel all scheduled tasks.
|
| + // All preference entries are kept until reschedule call, which removes then then.
|
| + BackgroundTaskSchedulerDelegate oldDelegate =
|
| + BackgroundTaskSchedulerFactory.getSchedulerDelegateForSdk(oldSdkInt);
|
| + Set<Integer> scheduledTaskIds = BackgroundTaskSchedulerPrefs.getScheduledTaskIds();
|
| + for (int taskId : scheduledTaskIds) {
|
| + oldDelegate.cancel(context, taskId);
|
| + }
|
| +
|
| + reschedule(context);
|
| + }
|
| +
|
| + /**
|
| + * Reschedules all the tasks currently scheduler through BackgroundTaskSheduler.
|
| + * @param context the current context.
|
| + */
|
| public void reschedule(Context context) {
|
| Set<String> scheduledTasksClassNames = BackgroundTaskSchedulerPrefs.getScheduledTasks();
|
| BackgroundTaskSchedulerPrefs.removeAllTasks();
|
| @@ -108,4 +143,8 @@ public class BackgroundTaskScheduler {
|
| task.reschedule(context);
|
| }
|
| }
|
| +
|
| + private boolean osUpgradeChangesDelegateType(int oldSdkInt, int newSdkInt) {
|
| + return oldSdkInt < Build.VERSION_CODES.M && newSdkInt >= Build.VERSION_CODES.M;
|
| + }
|
| }
|
|
|