blob: 8e46fe8ca809b03dbcb4194d512111b11b55b28d [file] [log] [blame]
jkarlindb185222015-05-29 12:02:001// Copyright 2015 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
iclelland8467f462015-10-21 14:03:135#include "chrome/browser/android/background_sync_launcher_android.h"
jkarlindb185222015-05-29 12:02:006
Mugdha Lakhani1f1ea8e2019-02-27 16:01:327#include <utility>
8
9#include "base/android/callback_android.h"
10#include "base/barrier_closure.h"
Mugdha Lakhanieef76422019-03-22 18:04:4911#include "base/bind.h"
Mugdha Lakhanife82692b2019-02-08 13:08:4012#include "base/feature_list.h"
Andrew Grieve4a42c22e2019-06-24 16:14:2913#include "chrome/android/chrome_jni_headers/BackgroundSyncBackgroundTaskScheduler_jni.h"
14#include "chrome/android/chrome_jni_headers/BackgroundSyncBackgroundTask_jni.h"
15#include "chrome/android/chrome_jni_headers/BackgroundSyncLauncher_jni.h"
Mugdha Lakhanieab4b182019-06-25 10:52:1616#include "chrome/android/chrome_jni_headers/PeriodicBackgroundSyncChromeWakeUpTask_jni.h"
Mugdha Lakhanife82692b2019-02-08 13:08:4017#include "chrome/browser/android/chrome_feature_list.h"
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3218#include "chrome/browser/profiles/profile_manager.h"
19#include "content/public/browser/background_sync_context.h"
Mugdha Lakhanie07dd9e2019-07-18 17:25:2320#include "content/public/browser/background_sync_parameters.h"
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3221#include "content/public/browser/browser_context.h"
jkarlindb185222015-05-29 12:02:0022#include "content/public/browser/browser_thread.h"
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3223#include "content/public/browser/storage_partition.h"
jkarlindb185222015-05-29 12:02:0024
iclelland8467f462015-10-21 14:03:1325using content::BrowserThread;
jkarlindb185222015-05-29 12:02:0026
27namespace {
scottmg5e65e3a2017-03-08 08:48:4628base::LazyInstance<BackgroundSyncLauncherAndroid>::DestructorAtExit
29 g_background_sync_launcher = LAZY_INSTANCE_INITIALIZER;
iclellandd054a6f2016-01-11 20:16:1430
31// Disables the Play Services version check for testing on Chromium build bots.
32// TODO(iclelland): Remove this once the bots have their play services package
33// updated before every test run. (https://crbug.com/514449)
34bool disable_play_services_version_check_for_tests = false;
35
Mugdha Lakhanie07dd9e2019-07-18 17:25:2336// Returns 0 to create a ONE_SHOT_SYNC_CHROME_WAKE_UP task, or 1 to create a
37// PERIODIC_SYNC_CHROME_WAKE_UP task, based on |sync_type|.
38int GetBackgroundTaskType(blink::mojom::BackgroundSyncType sync_type) {
39 return static_cast<int>(sync_type);
40}
41
iclellandd054a6f2016-01-11 20:16:1442} // namespace
jkarlindb185222015-05-29 12:02:0043
44// static
Mugdha Lakhanieab4b182019-06-25 10:52:1645void JNI_BackgroundSyncBackgroundTask_FireOneShotBackgroundSyncEvents(
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3246 JNIEnv* env,
47 const base::android::JavaParamRef<jobject>& j_runnable) {
48 if (!base::FeatureList::IsEnabled(
49 chrome::android::kBackgroundTaskSchedulerForBackgroundSync)) {
50 return;
51 }
52
Mugdha Lakhanieab4b182019-06-25 10:52:1653 BackgroundSyncLauncherAndroid::Get()->FireBackgroundSyncEvents(
54 blink::mojom::BackgroundSyncType::ONE_SHOT, j_runnable);
55}
56
57void JNI_PeriodicBackgroundSyncChromeWakeUpTask_FirePeriodicBackgroundSyncEvents(
58 JNIEnv* env,
59 const base::android::JavaParamRef<jobject>& j_runnable) {
60 BackgroundSyncLauncherAndroid::Get()->FireBackgroundSyncEvents(
61 blink::mojom::BackgroundSyncType::PERIODIC, j_runnable);
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3262}
63
Mugdha Lakhanib7d218f02019-09-09 14:48:2364void JNI_BackgroundSyncBackgroundTaskScheduler_SetPlayServicesVersionCheckDisabledForTests(
65 JNIEnv* env,
66 jboolean disabled) {
67 BackgroundSyncLauncherAndroid::SetPlayServicesVersionCheckDisabledForTests(
68 disabled);
69}
70
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3271// static
jkarlindb185222015-05-29 12:02:0072BackgroundSyncLauncherAndroid* BackgroundSyncLauncherAndroid::Get() {
73 DCHECK_CURRENTLY_ON(BrowserThread::UI);
74
75 return g_background_sync_launcher.Pointer();
76}
77
78// static
Mugdha Lakhanie07dd9e2019-07-18 17:25:2379void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUp(
80 blink::mojom::BackgroundSyncType sync_type) {
jkarlindb185222015-05-29 12:02:0081 DCHECK_CURRENTLY_ON(BrowserThread::UI);
82
Mugdha Lakhanie07dd9e2019-07-18 17:25:2383 Get()->ScheduleBrowserWakeUpImpl(sync_type);
84}
85
86// static
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3287void BackgroundSyncLauncherAndroid::SetPlayServicesVersionCheckDisabledForTests(
88 bool disabled) {
89 DCHECK_CURRENTLY_ON(BrowserThread::UI);
90 disable_play_services_version_check_for_tests = disabled;
91}
92
93// static
94bool BackgroundSyncLauncherAndroid::ShouldDisableBackgroundSync() {
95 DCHECK_CURRENTLY_ON(BrowserThread::UI);
96 if (disable_play_services_version_check_for_tests)
97 return false;
98 return Java_BackgroundSyncLauncher_shouldDisableBackgroundSync(
99 base::android::AttachCurrentThread());
100}
101
Mugdha Lakhanie07dd9e2019-07-18 17:25:23102void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUpImpl(
103 blink::mojom::BackgroundSyncType sync_type) {
Mugdha Lakhanieef76422019-03-22 18:04:49104 DCHECK_CURRENTLY_ON(BrowserThread::UI);
105
106 auto* profile = ProfileManager::GetLastUsedProfile();
107 DCHECK(profile);
108
109 content::BackgroundSyncContext::GetSoonestWakeupDeltaAcrossPartitions(
Mugdha Lakhanie07dd9e2019-07-18 17:25:23110 sync_type, profile,
111 base::BindOnce(&BackgroundSyncLauncherAndroid::
112 ScheduleBrowserWakeUpWithWakeUpDeltaImpl,
113 base::Unretained(this), sync_type));
Mugdha Lakhanieef76422019-03-22 18:04:49114}
115
Mugdha Lakhanie07dd9e2019-07-18 17:25:23116void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUpWithWakeUpDeltaImpl(
117 blink::mojom::BackgroundSyncType sync_type,
Mugdha Lakhanieef76422019-03-22 18:04:49118 base::TimeDelta soonest_wakeup_delta) {
jkarlindb185222015-05-29 12:02:00119 DCHECK_CURRENTLY_ON(BrowserThread::UI);
120
jkarlinfe08f132015-11-06 13:18:41121 JNIEnv* env = base::android::AttachCurrentThread();
Mugdha Lakhanieef76422019-03-22 18:04:49122 int64_t min_delay_ms = soonest_wakeup_delta.InMilliseconds();
Mugdha Lakhanife82692b2019-02-08 13:08:40123
124 if (!base::FeatureList::IsEnabled(
125 chrome::android::kBackgroundTaskSchedulerForBackgroundSync)) {
126 Java_BackgroundSyncLauncher_launchBrowserIfStopped(
Mugdha Lakhanieef76422019-03-22 18:04:49127 env, java_gcm_network_manager_launcher_,
128 /* shouldLaunch= */ !soonest_wakeup_delta.is_max(), min_delay_ms);
Mugdha Lakhanife82692b2019-02-08 13:08:40129 return;
130 }
131
132 Java_BackgroundSyncBackgroundTaskScheduler_launchBrowserIfStopped(
133 env, java_background_sync_background_task_scheduler_launcher_,
Mugdha Lakhanie07dd9e2019-07-18 17:25:23134 GetBackgroundTaskType(sync_type), !soonest_wakeup_delta.is_max(),
135 min_delay_ms);
jkarlindb185222015-05-29 12:02:00136}
137
Mugdha Lakhani1f1ea8e2019-02-27 16:01:32138void BackgroundSyncLauncherAndroid::FireBackgroundSyncEvents(
Mugdha Lakhanieab4b182019-06-25 10:52:16139 blink::mojom::BackgroundSyncType sync_type,
Mugdha Lakhani1f1ea8e2019-02-27 16:01:32140 const base::android::JavaParamRef<jobject>& j_runnable) {
iclellandd054a6f2016-01-11 20:16:14141 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Mugdha Lakhani1f1ea8e2019-02-27 16:01:32142
143 auto* profile = ProfileManager::GetLastUsedProfile();
144 DCHECK(profile);
145
Mugdha Lakhanieef76422019-03-22 18:04:49146 content::BackgroundSyncContext::FireBackgroundSyncEventsAcrossPartitions(
Mugdha Lakhanieab4b182019-06-25 10:52:16147 profile, sync_type, j_runnable);
iclellandd054a6f2016-01-11 20:16:14148}
149
jkarlindb185222015-05-29 12:02:00150BackgroundSyncLauncherAndroid::BackgroundSyncLauncherAndroid() {
151 DCHECK_CURRENTLY_ON(BrowserThread::UI);
152
153 JNIEnv* env = base::android::AttachCurrentThread();
Mugdha Lakhanife82692b2019-02-08 13:08:40154
155 if (!base::FeatureList::IsEnabled(
156 chrome::android::kBackgroundTaskSchedulerForBackgroundSync)) {
157 java_gcm_network_manager_launcher_.Reset(
158 Java_BackgroundSyncLauncher_create(env));
159 return;
160 }
161
162 java_background_sync_background_task_scheduler_launcher_.Reset(
163 Java_BackgroundSyncBackgroundTaskScheduler_getInstance(env));
jkarlindb185222015-05-29 12:02:00164}
165
166BackgroundSyncLauncherAndroid::~BackgroundSyncLauncherAndroid() {
167 DCHECK_CURRENTLY_ON(BrowserThread::UI);
168
Mugdha Lakhanife82692b2019-02-08 13:08:40169 if (base::FeatureList::IsEnabled(
170 chrome::android::kBackgroundTaskSchedulerForBackgroundSync)) {
171 return;
172 }
173
jkarlindb185222015-05-29 12:02:00174 JNIEnv* env = base::android::AttachCurrentThread();
Mugdha Lakhanife82692b2019-02-08 13:08:40175 Java_BackgroundSyncLauncher_destroy(env, java_gcm_network_manager_launcher_);
jkarlindb185222015-05-29 12:02:00176}