From: Wengling Chen Date: Sat, 2 Nov 2019 07:56:44 +0100 Subject: Remove dependency on com.google.android.gms.gcm It also disalbes Snippets, auto-update of offline pages and launching browser from background service. The snippets are already disabled in native codes, this will disable it on Java level. --- chrome/android/BUILD.gn | 3 - .../browser/ChromeBackgroundService.java | 4 - .../gcm/ChromeGcmListenerService.java | 220 ------------------ components/background_task_scheduler/BUILD.gn | 1 - .../internal/BUILD.gn | 3 - .../BackgroundTaskGcmTaskService.java | 160 ------------- ...ackgroundTaskSchedulerFactoryInternal.java | 6 +- ...kgroundTaskSchedulerGcmNetworkManager.java | 55 ----- 8 files changed, 1 insertion(+), 451 deletions(-) delete mode 100644 chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java delete mode 100644 components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskGcmTaskService.java delete mode 100644 components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerGcmNetworkManager.java diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn @@ -287,7 +287,6 @@ android_library("chrome_java") { "$google_play_services_package:google_play_services_cast_framework_java", "$google_play_services_package:google_play_services_cast_java", "$google_play_services_package:google_play_services_fido_java", - "$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_iid_java", "$google_play_services_package:google_play_services_tasks_java", "//base:base_java", @@ -966,7 +965,6 @@ android_library("chrome_test_java") { "$google_play_services_package:google_play_services_cast_framework_java", "$google_play_services_package:google_play_services_cast_java", "$google_play_services_package:google_play_services_fido_java", - "$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_iid_java", "$google_play_services_package:google_play_services_tasks_java", "//base:base_java", @@ -1915,7 +1913,6 @@ android_library("browser_java_test_support") { ] deps = [ ":chrome_java", - "$google_play_services_package:google_play_services_gcm_java", "//base:base_java", "//base:base_java_test_support", "//chrome/browser/profiles/android:java", diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java @@ -8,10 +8,6 @@ import android.content.Context; import androidx.annotation.VisibleForTesting; -import com.google.android.gms.gcm.GcmNetworkManager; -import com.google.android.gms.gcm.GcmTaskService; -import com.google.android.gms.gcm.TaskParams; - import org.chromium.base.Log; import org.chromium.base.task.PostTask; import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTaskScheduler; diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java deleted file mode 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2015 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. - -package org.chromium.chrome.browser.services.gcm; - -import android.content.Context; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.text.TextUtils; - -import com.google.android.gms.gcm.GcmListenerService; - -import org.chromium.base.ContextUtils; -import org.chromium.base.Log; -import org.chromium.base.ThreadUtils; -import org.chromium.base.task.PostTask; -import org.chromium.chrome.browser.device.DeviceConditions; -import org.chromium.chrome.browser.init.ChromeBrowserInitializer; -import org.chromium.chrome.browser.init.ProcessInitializationHandler; -import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory; -import org.chromium.components.background_task_scheduler.TaskIds; -import org.chromium.components.background_task_scheduler.TaskInfo; -import org.chromium.components.gcm_driver.GCMDriver; -import org.chromium.components.gcm_driver.GCMMessage; -import org.chromium.components.gcm_driver.InstanceIDFlags; -import org.chromium.components.gcm_driver.LazySubscriptionsManager; -import org.chromium.components.gcm_driver.SubscriptionFlagManager; -import org.chromium.content_public.browser.UiThreadTaskTraits; - -/** - * Receives Downstream messages and status of upstream messages from GCM. - */ -public class ChromeGcmListenerService extends GcmListenerService { - private static final String TAG = "ChromeGcmListener"; - - @Override - public void onCreate() { - ProcessInitializationHandler.getInstance().initializePreNative(); - super.onCreate(); - } - - @Override - public void onMessageReceived(final String from, final Bundle data) { - boolean hasCollapseKey = !TextUtils.isEmpty(data.getString("collapse_key")); - GcmUma.recordDataMessageReceived(ContextUtils.getApplicationContext(), hasCollapseKey); - - // Dispatch the message to the GCM Driver for native features. - PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { - GCMMessage message = null; - try { - message = new GCMMessage(from, data); - } catch (IllegalArgumentException e) { - Log.e(TAG, "Received an invalid GCM Message", e); - return; - } - - scheduleOrDispatchMessageToDriver(message); - }); - } - - @Override - public void onMessageSent(String msgId) { - Log.d(TAG, "Message sent successfully. Message id: " + msgId); - GcmUma.recordGcmUpstreamHistogram( - ContextUtils.getApplicationContext(), GcmUma.UMA_UPSTREAM_SUCCESS); - } - - @Override - public void onSendError(String msgId, String error) { - Log.w(TAG, "Error in sending message. Message id: " + msgId + " Error: " + error); - GcmUma.recordGcmUpstreamHistogram( - ContextUtils.getApplicationContext(), GcmUma.UMA_UPSTREAM_SEND_FAILED); - } - - @Override - public void onDeletedMessages() { - // TODO(johnme): Ask GCM to include the subtype in this event. - Log.w(TAG, "Push messages were deleted, but we can't tell the Service Worker as we don't" - + "know what subtype (app ID) it occurred for."); - GcmUma.recordDeletedMessages(ContextUtils.getApplicationContext()); - } - - /** - * Returns if we deliver the GCMMessage with a background service by calling - * Context#startService. This will only work if Android has put us in a whitelist to allow - * background services to be started. - */ - private static boolean maybeBypassScheduler(GCMMessage message) { - // Android only puts us on a whitelist for high priority messages. - if (message.getOriginalPriority() != GCMMessage.Priority.HIGH) { - return false; - } - - final String subscriptionId = SubscriptionFlagManager.buildSubscriptionUniqueId( - message.getAppId(), message.getSenderId()); - if (!SubscriptionFlagManager.hasFlags(subscriptionId, InstanceIDFlags.BYPASS_SCHEDULER)) { - return false; - } - - try { - Context context = ContextUtils.getApplicationContext(); - Intent intent = new Intent(context, GCMBackgroundService.class); - intent.putExtras(message.toBundle()); - context.startService(intent); - return true; - } catch (IllegalStateException e) { - // Failed to start service, maybe we're not whitelisted? Fallback to using - // BackgroundTaskScheduler to start Chrome. - // TODO(knollr): Add metrics for this. - Log.e(TAG, "Could not start background service", e); - return false; - } - } - - /** - * Returns if the |message| is sent from a lazy subscription and we persist it to be delivered - * the next time Chrome is launched into foreground. - */ - private static boolean maybePersistLazyMessage(GCMMessage message) { - if (isFullBrowserLoaded()) { - return false; - } - - final String subscriptionId = LazySubscriptionsManager.buildSubscriptionUniqueId( - message.getAppId(), message.getSenderId()); - - boolean isSubscriptionLazy = LazySubscriptionsManager.isSubscriptionLazy(subscriptionId); - boolean isHighPriority = message.getOriginalPriority() == GCMMessage.Priority.HIGH; - // TODO(crbug.com/945402): Add metrics for the new high priority message logic. - boolean shouldPersistMessage = isSubscriptionLazy && !isHighPriority; - if (shouldPersistMessage) { - LazySubscriptionsManager.persistMessage(subscriptionId, message); - } - - return shouldPersistMessage; - } - - /** - * Schedules a background task via Job Scheduler to deliver the |message|. Delivery might get - * delayed by Android if the device is currently in doze mode. - */ - private static void scheduleBackgroundTask(GCMMessage message) { - // TODO(peter): Add UMA for measuring latency introduced by the BackgroundTaskScheduler. - TaskInfo backgroundTask = - TaskInfo.createOneOffTask(TaskIds.GCM_BACKGROUND_TASK_JOB_ID, 0 /* immediately */) - .setExtras(message.toBundle()) - .build(); - BackgroundTaskSchedulerFactory.getScheduler().schedule( - ContextUtils.getApplicationContext(), backgroundTask); - } - - private static void recordWebPushMetrics(GCMMessage message) { - Context context = ContextUtils.getApplicationContext(); - boolean inIdleMode = DeviceConditions.isCurrentlyInIdleMode(context); - boolean isHighPriority = message.getOriginalPriority() == GCMMessage.Priority.HIGH; - - @GcmUma.WebPushDeviceState - int state; - if (inIdleMode) { - state = isHighPriority ? GcmUma.WebPushDeviceState.IDLE_HIGH_PRIORITY - : GcmUma.WebPushDeviceState.IDLE_NOT_HIGH_PRIORITY; - } else { - state = isHighPriority ? GcmUma.WebPushDeviceState.NOT_IDLE_HIGH_PRIORITY - : GcmUma.WebPushDeviceState.NOT_IDLE_NOT_HIGH_PRIORITY; - } - GcmUma.recordWebPushReceivedDeviceState(state); - } - - /** - * If Chrome is backgrounded, messages coming from lazy subscriptions are - * persisted on disk and replayed next time Chrome is forgrounded. If Chrome is forgrounded or - * if the message isn't coming from a lazy subscription, this method either schedules |message| - * to be dispatched through the Job Scheduler, which we use on Android N and beyond, or - * immediately dispatches the message on other versions of Android. Some subscriptions bypass - * the Job Scheduler and use Context#startService instead if the |message| has a high priority. - * Must be called on the UI thread both for the BackgroundTaskScheduler and for dispatching the - * |message| to the GCMDriver. - */ - static void scheduleOrDispatchMessageToDriver(GCMMessage message) { - ThreadUtils.assertOnUiThread(); - - // GCMMessage#getAppId never returns null. - if (message.getAppId().startsWith("wp:")) { - recordWebPushMetrics(message); - } - - // Check if we should only persist the message for now. - if (maybePersistLazyMessage(message)) { - return; - } - - // Dispatch message immediately on pre N versions of Android. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { - dispatchMessageToDriver(message); - return; - } - - // Check if we should bypass the scheduler for high priority messages. - if (!maybeBypassScheduler(message)) { - scheduleBackgroundTask(message); - } - } - - /** - * To be called when a GCM message is ready to be dispatched. Will initialise the native code - * of the browser process, and forward the message to the GCM Driver. Must be called on the UI - * thread. - */ - static void dispatchMessageToDriver(GCMMessage message) { - ThreadUtils.assertOnUiThread(); - ChromeBrowserInitializer.getInstance().handleSynchronousStartup(); - GCMDriver.dispatchMessage(message); - } - - private static boolean isFullBrowserLoaded() { - return ChromeBrowserInitializer.getInstance().isFullBrowserInitialized(); - } -} diff --git a/components/background_task_scheduler/BUILD.gn b/components/background_task_scheduler/BUILD.gn --- a/components/background_task_scheduler/BUILD.gn +++ b/components/background_task_scheduler/BUILD.gn @@ -123,7 +123,6 @@ if (is_android) { "$google_play_services_package:google_play_services_auth_base_java", "$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_basement_java", - "$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_tasks_java", "internal:internal_java", "internal:proto_java", diff --git a/components/background_task_scheduler/internal/BUILD.gn b/components/background_task_scheduler/internal/BUILD.gn --- a/components/background_task_scheduler/internal/BUILD.gn +++ b/components/background_task_scheduler/internal/BUILD.gn @@ -11,7 +11,6 @@ if (is_android) { android_library("internal_java") { sources = [ "android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskBroadcastReceiver.java", - "android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskGcmTaskService.java", "android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskJobService.java", "android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerAlarmManager.java", "android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerDelegate.java", @@ -28,7 +27,6 @@ if (is_android) { ":proto_java", "$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_basement_java", - "$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_tasks_java", "//base:base_java", "//components/background_task_scheduler:background_task_scheduler_task_ids_java", @@ -99,7 +97,6 @@ if (is_android) { ":internal_java", "$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_basement_java", - "$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_tasks_java", "//base:base_java", "//base:base_java_test_support", diff --git a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskGcmTaskService.java b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskGcmTaskService.java deleted file mode 100644 --- a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskGcmTaskService.java +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2017 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. - -package org.chromium.components.background_task_scheduler.internal; - -import android.os.Build; - -import androidx.annotation.VisibleForTesting; - -import com.google.android.gms.gcm.GcmNetworkManager; -import com.google.android.gms.gcm.GcmTaskService; -import com.google.android.gms.gcm.TaskParams; - -import org.chromium.base.ContextUtils; -import org.chromium.base.Log; -import org.chromium.base.ThreadUtils; -import org.chromium.components.background_task_scheduler.BackgroundTask; -import org.chromium.components.background_task_scheduler.TaskParameters; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -/** Delegates calls out to various tasks that need to run in the background. */ -public class BackgroundTaskGcmTaskService extends GcmTaskService { - private static final String TAG = "BkgrdTaskGcmTS"; - - private BackgroundTaskSchedulerGcmNetworkManager.Clock mClock = System::currentTimeMillis; - - @VisibleForTesting - void setClockForTesting(BackgroundTaskSchedulerGcmNetworkManager.Clock clock) { - mClock = clock; - } - - /** Class that waits for the processing to be done. */ - private static class Waiter { - // Wakelock is only held for 3 minutes by default for GcmTaskService. - private static final long MAX_TIMEOUT_SECONDS = 179; - private final CountDownLatch mLatch; - private long mWaiterTimeoutSeconds; - private boolean mIsRescheduleNeeded; - private boolean mHasTaskTimedOut; - - public Waiter(long waiterTimeoutSeconds) { - mLatch = new CountDownLatch(1); - mWaiterTimeoutSeconds = Math.min(waiterTimeoutSeconds, MAX_TIMEOUT_SECONDS); - } - - /** Start waiting for the processing to finish. */ - public void startWaiting() { - try { - mHasTaskTimedOut = !mLatch.await(mWaiterTimeoutSeconds, TimeUnit.SECONDS); - } catch (InterruptedException e) { - Log.d(TAG, "Waiter interrupted while waiting."); - } - } - - /** Called to finish waiting. */ - public void onWaitDone(boolean needsRescheduling) { - mIsRescheduleNeeded = needsRescheduling; - mLatch.countDown(); - } - - /** @return Whether last task timed out. */ - public boolean hasTaskTimedOut() { - return mHasTaskTimedOut; - } - - /** @return Whether task needs to be rescheduled. */ - public boolean isRescheduleNeeded() { - return mIsRescheduleNeeded; - } - } - - private static class TaskFinishedCallbackGcmTaskService - implements BackgroundTask.TaskFinishedCallback { - private final Waiter mWaiter; - - public TaskFinishedCallbackGcmTaskService(Waiter waiter) { - mWaiter = waiter; - } - - @Override - public void taskFinished(final boolean needsReschedule) { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mWaiter.onWaitDone(needsReschedule); - } - }); - } - } - - @Override - public int onRunTask(TaskParams params) { - final TaskParameters taskParams = - BackgroundTaskSchedulerGcmNetworkManager.getTaskParametersFromTaskParams(params); - - final BackgroundTask backgroundTask = - BackgroundTaskSchedulerFactoryInternal.getBackgroundTaskFromTaskId( - taskParams.getTaskId()); - if (backgroundTask == null) { - Log.w(TAG, "Failed to start task. Could not instantiate BackgroundTask class."); - // Cancel task if the BackgroundTask class is not found anymore. We assume this means - // that the task has been deprecated. - BackgroundTaskSchedulerFactoryInternal.getScheduler().cancel( - ContextUtils.getApplicationContext(), taskParams.getTaskId()); - return GcmNetworkManager.RESULT_FAILURE; - } - - if (BackgroundTaskSchedulerGcmNetworkManager.didTaskExpire( - params, mClock.currentTimeMillis())) { - BackgroundTaskSchedulerUma.getInstance().reportTaskExpired(taskParams.getTaskId()); - return GcmNetworkManager.RESULT_FAILURE; - } - - final Waiter waiter = new Waiter(Waiter.MAX_TIMEOUT_SECONDS); - - final AtomicBoolean taskNeedsBackgroundProcessing = new AtomicBoolean(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - BackgroundTaskSchedulerUma.getInstance().reportTaskStarted(taskParams.getTaskId()); - taskNeedsBackgroundProcessing.set( - backgroundTask.onStartTask(ContextUtils.getApplicationContext(), taskParams, - new TaskFinishedCallbackGcmTaskService(waiter))); - } - }); - - if (!taskNeedsBackgroundProcessing.get()) return GcmNetworkManager.RESULT_SUCCESS; - - waiter.startWaiting(); - - if (waiter.isRescheduleNeeded()) return GcmNetworkManager.RESULT_RESCHEDULE; - if (!waiter.hasTaskTimedOut()) return GcmNetworkManager.RESULT_SUCCESS; - - final AtomicBoolean taskNeedsRescheduling = new AtomicBoolean(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - BackgroundTaskSchedulerUma.getInstance().reportTaskStopped(taskParams.getTaskId()); - taskNeedsRescheduling.set(backgroundTask.onStopTask( - ContextUtils.getApplicationContext(), taskParams)); - } - }); - - if (taskNeedsRescheduling.get()) return GcmNetworkManager.RESULT_RESCHEDULE; - - return GcmNetworkManager.RESULT_SUCCESS; - } - - @Override - public void onInitializeTasks() { - // Ignore the event on OSs supporting JobScheduler. - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) return; - BackgroundTaskSchedulerFactoryInternal.getScheduler().reschedule( - ContextUtils.getApplicationContext()); - } -} diff --git a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerFactoryInternal.java b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerFactoryInternal.java --- a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerFactoryInternal.java +++ b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerFactoryInternal.java @@ -21,11 +21,7 @@ public final class BackgroundTaskSchedulerFactoryInternal { private static BackgroundTaskFactory sBackgroundTaskFactory; static BackgroundTaskSchedulerDelegate getSchedulerDelegateForSdk(int sdkInt) { - if (sdkInt >= Build.VERSION_CODES.M) { - return new BackgroundTaskSchedulerJobService(); - } else { - return new BackgroundTaskSchedulerGcmNetworkManager(); - } + return new BackgroundTaskSchedulerJobService(); } /** diff --git a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerGcmNetworkManager.java b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerGcmNetworkManager.java deleted file mode 100644 --- a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerGcmNetworkManager.java +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2017 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. - -package org.chromium.components.background_task_scheduler.internal; - -import android.content.Context; -import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.VisibleForTesting; - -import org.chromium.base.Log; -import org.chromium.base.ThreadUtils; -import org.chromium.components.background_task_scheduler.TaskInfo; -import org.chromium.components.background_task_scheduler.TaskParameters; - -import java.util.concurrent.TimeUnit; - -/** - * An implementation of {@link BackgroundTaskSchedulerDelegate} that uses the Play Services - * {@link GcmNetworkManager} to schedule jobs. - */ -class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedulerDelegate { - private static final String TAG = "BkgrdTaskSchedGcmNM"; - - /** Delta time for expiration checks, after the end time. */ - static final long DEADLINE_DELTA_MS = 1000; - - /** Clock to use so we can mock time in tests. */ - public interface Clock { long currentTimeMillis(); } - - private static Clock sClock = System::currentTimeMillis; - - @VisibleForTesting - static void setClockForTesting(Clock clock) { - sClock = clock; - } - - @Override - public boolean schedule(Context context, @NonNull TaskInfo taskInfo) { - ThreadUtils.assertOnUiThread(); - - return false; - } - - @Override - public void cancel(Context context, int taskId) { - ThreadUtils.assertOnUiThread(); - } - - private static String taskIdToTaskTag(int taskId) { - return Integer.toString(taskId); - } -} -- 2.17.1