blob: cc6489eebba661b9238f69d8b4386686ba555768 [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 Lakhanife82692b2019-02-08 13:08:4016#include "chrome/browser/android/chrome_feature_list.h"
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3217#include "chrome/browser/profiles/profile_manager.h"
18#include "content/public/browser/background_sync_context.h"
19#include "content/public/browser/browser_context.h"
jkarlindb185222015-05-29 12:02:0020#include "content/public/browser/browser_thread.h"
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3221#include "content/public/browser/storage_partition.h"
jkarlindb185222015-05-29 12:02:0022
iclelland8467f462015-10-21 14:03:1323using content::BrowserThread;
jkarlindb185222015-05-29 12:02:0024
25namespace {
scottmg5e65e3a2017-03-08 08:48:4626base::LazyInstance<BackgroundSyncLauncherAndroid>::DestructorAtExit
27 g_background_sync_launcher = LAZY_INSTANCE_INITIALIZER;
iclellandd054a6f2016-01-11 20:16:1428
29// Disables the Play Services version check for testing on Chromium build bots.
30// TODO(iclelland): Remove this once the bots have their play services package
31// updated before every test run. (https://crbug.com/514449)
32bool disable_play_services_version_check_for_tests = false;
33
34} // namespace
jkarlindb185222015-05-29 12:02:0035
36// static
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3237void JNI_BackgroundSyncBackgroundTask_FireBackgroundSyncEvents(
38 JNIEnv* env,
39 const base::android::JavaParamRef<jobject>& j_runnable) {
40 if (!base::FeatureList::IsEnabled(
41 chrome::android::kBackgroundTaskSchedulerForBackgroundSync)) {
42 return;
43 }
44
45 BackgroundSyncLauncherAndroid::Get()->FireBackgroundSyncEvents(j_runnable);
46}
47
48// static
jkarlindb185222015-05-29 12:02:0049BackgroundSyncLauncherAndroid* BackgroundSyncLauncherAndroid::Get() {
50 DCHECK_CURRENTLY_ON(BrowserThread::UI);
51
52 return g_background_sync_launcher.Pointer();
53}
54
55// static
Mugdha Lakhanieef76422019-03-22 18:04:4956void BackgroundSyncLauncherAndroid::LaunchBrowserIfStopped() {
jkarlindb185222015-05-29 12:02:0057 DCHECK_CURRENTLY_ON(BrowserThread::UI);
58
Mugdha Lakhanieef76422019-03-22 18:04:4959 Get()->LaunchBrowserIfStoppedImpl();
jkarlindb185222015-05-29 12:02:0060}
61
Mugdha Lakhani1f1ea8e2019-02-27 16:01:3262// static
63void BackgroundSyncLauncherAndroid::SetPlayServicesVersionCheckDisabledForTests(
64 bool disabled) {
65 DCHECK_CURRENTLY_ON(BrowserThread::UI);
66 disable_play_services_version_check_for_tests = disabled;
67}
68
69// static
70bool BackgroundSyncLauncherAndroid::ShouldDisableBackgroundSync() {
71 DCHECK_CURRENTLY_ON(BrowserThread::UI);
72 if (disable_play_services_version_check_for_tests)
73 return false;
74 return Java_BackgroundSyncLauncher_shouldDisableBackgroundSync(
75 base::android::AttachCurrentThread());
76}
77
Mugdha Lakhanieef76422019-03-22 18:04:4978void BackgroundSyncLauncherAndroid::LaunchBrowserIfStoppedImpl() {
79 DCHECK_CURRENTLY_ON(BrowserThread::UI);
80
81 auto* profile = ProfileManager::GetLastUsedProfile();
82 DCHECK(profile);
83
84 content::BackgroundSyncContext::GetSoonestWakeupDeltaAcrossPartitions(
85 profile, base::BindOnce(
86 &BackgroundSyncLauncherAndroid::LaunchBrowserWithWakeupDelta,
87 base::Unretained(this)));
88}
89
90void BackgroundSyncLauncherAndroid::LaunchBrowserWithWakeupDelta(
91 base::TimeDelta soonest_wakeup_delta) {
jkarlindb185222015-05-29 12:02:0092 DCHECK_CURRENTLY_ON(BrowserThread::UI);
93
jkarlinfe08f132015-11-06 13:18:4194 JNIEnv* env = base::android::AttachCurrentThread();
Mugdha Lakhanieef76422019-03-22 18:04:4995 int64_t min_delay_ms = soonest_wakeup_delta.InMilliseconds();
Mugdha Lakhanife82692b2019-02-08 13:08:4096
97 if (!base::FeatureList::IsEnabled(
98 chrome::android::kBackgroundTaskSchedulerForBackgroundSync)) {
99 Java_BackgroundSyncLauncher_launchBrowserIfStopped(
Mugdha Lakhanieef76422019-03-22 18:04:49100 env, java_gcm_network_manager_launcher_,
101 /* shouldLaunch= */ !soonest_wakeup_delta.is_max(), min_delay_ms);
Mugdha Lakhanife82692b2019-02-08 13:08:40102 return;
103 }
104
105 Java_BackgroundSyncBackgroundTaskScheduler_launchBrowserIfStopped(
106 env, java_background_sync_background_task_scheduler_launcher_,
Mugdha Lakhanieef76422019-03-22 18:04:49107 !soonest_wakeup_delta.is_max(), min_delay_ms);
jkarlindb185222015-05-29 12:02:00108}
109
Mugdha Lakhani1f1ea8e2019-02-27 16:01:32110void BackgroundSyncLauncherAndroid::FireBackgroundSyncEvents(
111 const base::android::JavaParamRef<jobject>& j_runnable) {
iclellandd054a6f2016-01-11 20:16:14112 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Mugdha Lakhani1f1ea8e2019-02-27 16:01:32113
114 auto* profile = ProfileManager::GetLastUsedProfile();
115 DCHECK(profile);
116
Mugdha Lakhanieef76422019-03-22 18:04:49117 content::BackgroundSyncContext::FireBackgroundSyncEventsAcrossPartitions(
118 profile, j_runnable);
iclellandd054a6f2016-01-11 20:16:14119}
120
iclellandd054a6f2016-01-11 20:16:14121
jkarlindb185222015-05-29 12:02:00122BackgroundSyncLauncherAndroid::BackgroundSyncLauncherAndroid() {
123 DCHECK_CURRENTLY_ON(BrowserThread::UI);
124
125 JNIEnv* env = base::android::AttachCurrentThread();
Mugdha Lakhanife82692b2019-02-08 13:08:40126
127 if (!base::FeatureList::IsEnabled(
128 chrome::android::kBackgroundTaskSchedulerForBackgroundSync)) {
129 java_gcm_network_manager_launcher_.Reset(
130 Java_BackgroundSyncLauncher_create(env));
131 return;
132 }
133
134 java_background_sync_background_task_scheduler_launcher_.Reset(
135 Java_BackgroundSyncBackgroundTaskScheduler_getInstance(env));
jkarlindb185222015-05-29 12:02:00136}
137
138BackgroundSyncLauncherAndroid::~BackgroundSyncLauncherAndroid() {
139 DCHECK_CURRENTLY_ON(BrowserThread::UI);
140
Mugdha Lakhanife82692b2019-02-08 13:08:40141 if (base::FeatureList::IsEnabled(
142 chrome::android::kBackgroundTaskSchedulerForBackgroundSync)) {
143 return;
144 }
145
jkarlindb185222015-05-29 12:02:00146 JNIEnv* env = base::android::AttachCurrentThread();
Mugdha Lakhanife82692b2019-02-08 13:08:40147 Java_BackgroundSyncLauncher_destroy(env, java_gcm_network_manager_launcher_);
jkarlindb185222015-05-29 12:02:00148}