Commit 0eeafca7 authored by Sam Maier's avatar Sam Maier Committed by Commit Bot

Fixing GMSCore version incompatibility

Calling GMSCore's isGooglePlayServicesAvailable(context) uses our SDK to
check what corresponding version of the GMSCore app we need on the
device. This assumption (that we need the GMSCore app to be ahead of the
SDK) hasn't been true for years for most Google apps, and that
requirement is breaking us when we update to bleeding-edge GMSCore SDKs.

This is currently blocking new users from signing into Canary.

Testing: Was able to reproduce error message with local build:
https://photos.app.goo.gl/e9PJ9cmhRaeH7THt6
With this change, error message did not appear, and signin button was
not greyed out. This is consistent with another local build made before
the breaking roll occurred.

TBR: nyquist, mattreynolds, bsazonov for urgent refactor
Bug: 1144669, 1145211
Change-Id: Iea18fc7340222bbf6027e210318cca6c68105a4c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2518219
Commit-Queue: Sam Maier <smaier@chromium.org>
Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#824035}
parent 21e4b95e
......@@ -505,6 +505,7 @@ android_library("chrome_java") {
"//third_party/android_deps:androidx_preference_preference_java",
"//third_party/android_deps:androidx_recyclerview_recyclerview_java",
"//third_party/android_deps:androidx_viewpager_viewpager_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//third_party/android_deps:com_google_code_findbugs_jsr305_java",
"//third_party/android_deps:com_google_dagger_dagger_java",
"//third_party/android_deps:com_google_guava_listenablefuture_java",
......@@ -915,6 +916,7 @@ junit_binary("chrome_junit_tests") {
"//third_party/android_deps:androidx_swiperefreshlayout_swiperefreshlayout_java",
"//third_party/android_deps:androidx_test_core_java",
"//third_party/android_deps:androidx_test_runner_java",
"//third_party/android_deps:chromium_play_services_availability_shadows_java",
"//third_party/android_deps:com_google_dagger_dagger_java",
"//third_party/android_deps:com_googlecode_java_diff_utils_diffutils_java",
"//third_party/android_deps:protobuf_lite_runtime_java",
......
......@@ -6,9 +6,6 @@ package org.chromium.chrome.browser.component_updater;
import android.os.Build;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
......@@ -17,6 +14,7 @@ import org.chromium.components.background_task_scheduler.BackgroundTask.TaskFini
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.gms.ChromiumPlayServicesAvailability;
/** Java-side implementation of the component update scheduler using the BackgroundTaskScheduler. */
@JNINamespace("component_updater")
......@@ -37,9 +35,8 @@ public class UpdateScheduler {
@CalledByNative
/* package */ static boolean isAvailable() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
|| GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
ContextUtils.getApplicationContext())
== ConnectionResult.SUCCESS;
|| ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext());
}
/* package */ void onStartTaskBeforeNativeLoaded(TaskFinishedCallback callback) {
......
......@@ -26,6 +26,7 @@ import org.chromium.base.task.PostTask;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.components.embedder_support.util.Origin;
import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.gms.ChromiumPlayServicesAvailability;
/**
* Utility class for external authentication tools.
......@@ -251,7 +252,7 @@ public class ExternalAuthUtils {
protected int checkGooglePlayServicesAvailable(final Context context) {
// TODO(crbug.com/577190): Temporarily allowing disk access until more permanent fix is in.
try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
return ChromiumPlayServicesAvailability.isGooglePlayServicesAvailable(context);
}
}
......
......@@ -8,35 +8,32 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.gms.Shadows;
import org.robolectric.shadows.gms.common.ShadowGoogleApiAvailability;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature;
import org.chromium.gms.shadows.ShadowChromiumPlayServicesAvailability;
/** Unit tests for GooglePlayServicesChecker. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE, shadows = {ShadowGoogleApiAvailability.class})
@Config(manifest = Config.NONE, shadows = {ShadowChromiumPlayServicesAvailability.class})
public class BackgroundSyncGooglePlayServicesCheckerTest {
@Test
@Feature("BackgroundSync")
public void testDisableLogicWhenGooglePlayServicesReturnsSuccess() {
Shadows.shadowOf(GoogleApiAvailability.getInstance())
.setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS);
ShadowChromiumPlayServicesAvailability.setIsGooglePlayServicesAvailable(
ConnectionResult.SUCCESS);
assertFalse(GooglePlayServicesChecker.shouldDisableBackgroundSync());
}
@Test
@Feature("BackgroundSync")
public void testDisableLogicWhenGooglePlayServicesReturnsError() {
Shadows.shadowOf(GoogleApiAvailability.getInstance())
.setIsGooglePlayServicesAvailable(ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED);
ShadowChromiumPlayServicesAvailability.setIsGooglePlayServicesAvailable(
ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED);
assertTrue(GooglePlayServicesChecker.shouldDisableBackgroundSync());
}
}
......@@ -309,6 +309,7 @@ android_library("chrome_java_test_support") {
"//third_party/android_deps:androidx_fragment_fragment_java",
"//third_party/android_deps:androidx_lifecycle_lifecycle_common_java",
"//third_party/android_deps:androidx_recyclerview_recyclerview_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//third_party/android_deps:com_google_code_findbugs_jsr305_java",
"//third_party/android_deps:espresso_java",
"//third_party/android_deps:material_design_java",
......
......@@ -9,9 +9,6 @@ import android.os.Build;
import android.support.test.InstrumentationRegistry;
import android.text.TextUtils;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import org.junit.rules.TestRule;
import org.junit.runners.model.InitializationError;
......@@ -26,6 +23,7 @@ import org.chromium.chrome.test.util.browser.Features;
import org.chromium.components.policy.test.annotations.Policies;
import org.chromium.content_public.browser.test.ContentJUnit4ClassRunner;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
......@@ -154,9 +152,8 @@ public class ChromeJUnit4ClassRunner extends ContentJUnit4ClassRunner {
protected boolean restrictionApplies(String restriction) {
if (TextUtils.equals(
restriction, ChromeRestriction.RESTRICTION_TYPE_GOOGLE_PLAY_SERVICES)
&& (ConnectionResult.SUCCESS
!= GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
getTargetContext()))) {
&& (!ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
getTargetContext()))) {
return true;
}
if (TextUtils.equals(restriction, ChromeRestriction.RESTRICTION_TYPE_OFFICIAL_BUILD)
......
......@@ -132,6 +132,7 @@ if (is_android) {
"//base:base_java_test_support",
"//base:base_junit_test_support",
"//components/background_task_scheduler:public_java",
"//third_party/android_deps:chromium_play_services_availability_shadows_java",
"//third_party/android_deps:robolectric_all_java",
"//third_party/junit",
"//third_party/mockito:mockito_java",
......
......@@ -36,6 +36,7 @@ if (is_android) {
"//components/background_task_scheduler:public_java",
"//content/public/android:content_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//third_party/android_deps:protobuf_lite_runtime_java",
]
}
......
......@@ -10,8 +10,6 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.gcm.GcmNetworkManager;
import com.google.android.gms.gcm.OneoffTask;
import com.google.android.gms.gcm.PeriodicTask;
......@@ -22,6 +20,7 @@ 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 org.chromium.gms.ChromiumPlayServicesAvailability;
import java.util.concurrent.TimeUnit;
......@@ -246,8 +245,7 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule
}
private GcmNetworkManager getGcmNetworkManager(Context context) {
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
== ConnectionResult.SUCCESS) {
if (ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(context)) {
return GcmNetworkManager.getInstance(context);
}
return null;
......
......@@ -12,8 +12,6 @@ import static org.junit.Assert.assertTrue;
import android.os.Bundle;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.gcm.GcmNetworkManager;
import com.google.android.gms.gcm.OneoffTask;
import com.google.android.gms.gcm.PeriodicTask;
......@@ -25,8 +23,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.gms.Shadows;
import org.robolectric.shadows.gms.common.ShadowGoogleApiAvailability;
import org.chromium.base.ContextUtils;
import org.chromium.base.test.BaseRobolectricTestRunner;
......@@ -35,13 +31,14 @@ import org.chromium.components.background_task_scheduler.BackgroundTask;
import org.chromium.components.background_task_scheduler.TaskIds;
import org.chromium.components.background_task_scheduler.TaskInfo;
import org.chromium.components.background_task_scheduler.TaskParameters;
import org.chromium.gms.shadows.ShadowChromiumPlayServicesAvailability;
import java.util.concurrent.TimeUnit;
/** Unit tests for {@link BackgroundTaskSchedulerGcmNetworkManager}. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE,
shadows = {ShadowGcmNetworkManager.class, ShadowGoogleApiAvailability.class})
shadows = {ShadowGcmNetworkManager.class, ShadowChromiumPlayServicesAvailability.class})
public class BackgroundTaskSchedulerGcmNetworkManagerTest {
ShadowGcmNetworkManager mGcmNetworkManager;
......@@ -59,8 +56,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest {
@Before
public void setUp() {
Shadows.shadowOf(GoogleApiAvailability.getInstance())
.setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS);
ShadowChromiumPlayServicesAvailability.setChromiumIsGooglePlayServicesAvailable(true);
mGcmNetworkManager = (ShadowGcmNetworkManager) Shadow.extract(
GcmNetworkManager.getInstance(ContextUtils.getApplicationContext()));
BackgroundTaskSchedulerGcmNetworkManager.setClockForTesting(mClock);
......@@ -301,8 +297,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest {
@Test
@Feature("BackgroundTaskScheduler")
public void testScheduleNoGooglePlayServices() {
Shadows.shadowOf(GoogleApiAvailability.getInstance())
.setIsGooglePlayServicesAvailable(ConnectionResult.SERVICE_MISSING);
ShadowChromiumPlayServicesAvailability.setChromiumIsGooglePlayServicesAvailable(false);
TaskInfo.TimingInfo timingInfo =
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_24_H_TO_MS).build();
......@@ -332,8 +327,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest {
@Feature("BackgroundTaskScheduler")
public void testCancelNoGooglePlayServices() {
// This simulates situation where Google Play Services is uninstalled.
Shadows.shadowOf(GoogleApiAvailability.getInstance())
.setIsGooglePlayServicesAvailable(ConnectionResult.SERVICE_MISSING);
ShadowChromiumPlayServicesAvailability.setChromiumIsGooglePlayServicesAvailable(false);
TaskInfo.TimingInfo timingInfo =
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_24_H_TO_MS).build();
......
......@@ -15,8 +15,6 @@ import static org.mockito.Mockito.verify;
import android.os.Build;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.gcm.GcmNetworkManager;
import org.junit.Before;
......@@ -27,8 +25,6 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.gms.Shadows;
import org.robolectric.shadows.gms.common.ShadowGoogleApiAvailability;
import org.robolectric.util.ReflectionHelpers;
import org.chromium.base.ContextUtils;
......@@ -37,13 +33,14 @@ import org.chromium.base.test.util.Feature;
import org.chromium.components.background_task_scheduler.BackgroundTaskScheduler;
import org.chromium.components.background_task_scheduler.TaskIds;
import org.chromium.components.background_task_scheduler.TaskInfo;
import org.chromium.gms.shadows.ShadowChromiumPlayServicesAvailability;
import java.util.concurrent.TimeUnit;
/** Unit tests for {@link BackgroundTaskScheduler}. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE,
shadows = {ShadowGcmNetworkManager.class, ShadowGoogleApiAvailability.class})
shadows = {ShadowGcmNetworkManager.class, ShadowChromiumPlayServicesAvailability.class})
public class BackgroundTaskSchedulerImplTest {
@Mock
private BackgroundTaskSchedulerDelegate mDelegate;
......@@ -66,8 +63,7 @@ public class BackgroundTaskSchedulerImplTest {
TestBackgroundTask.reset();
// Initialize Google Play Services and GCM Network Manager for upgrade testing.
Shadows.shadowOf(GoogleApiAvailability.getInstance())
.setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS);
ShadowChromiumPlayServicesAvailability.setChromiumIsGooglePlayServicesAvailable(true);
mGcmNetworkManager = (ShadowGcmNetworkManager) Shadow.extract(
GcmNetworkManager.getInstance(ContextUtils.getApplicationContext()));
......
......@@ -22,6 +22,7 @@ android_library("java") {
"//net/android:net_java",
"//third_party/android_deps:android_support_v4_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//ui/android:ui_java",
]
......
......@@ -41,6 +41,7 @@ import org.chromium.base.StrictModeContext;
import org.chromium.base.ThreadUtils;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import java.io.IOException;
......@@ -90,7 +91,7 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
protected void checkCanUseGooglePlayServices() throws AccountManagerDelegateException {
Context context = ContextUtils.getApplicationContext();
final int resultCode =
GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
ChromiumPlayServicesAvailability.isGooglePlayServicesAvailable(context);
if (resultCode == ConnectionResult.SUCCESS) {
return;
}
......@@ -263,9 +264,8 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
public boolean isGooglePlayServicesAvailable() {
// TODO(http://crbug.com/577190): Remove StrictMode override.
try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
int resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
return ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext());
return resultCode == ConnectionResult.SUCCESS;
}
}
......
......@@ -151,6 +151,7 @@ if (is_android) {
"//skia/public/mojom:mojom_java",
"//third_party/android_deps:androidx_test_monitor_java",
"//third_party/android_deps:androidx_test_runner_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//third_party/android_support_test_runner:runner_java",
"//third_party/junit",
"//ui/gfx/geometry/mojom:mojom_java",
......
......@@ -164,6 +164,7 @@ if (is_android) {
"//components/location/android:location_java",
"//services/device/public/java:geolocation_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:chromium_play_services_availability_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
}
......
......@@ -9,7 +9,6 @@ import android.location.Location;
import android.os.Bundle;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
......@@ -21,6 +20,7 @@ import com.google.android.gms.location.LocationServices;
import org.chromium.base.Log;
import org.chromium.base.ThreadUtils;
import org.chromium.components.location.LocationUtils;
import org.chromium.gms.ChromiumPlayServicesAvailability;
/**
* This is a LocationProvider using Google Play Services.
......@@ -42,8 +42,7 @@ public class LocationProviderGmsCore implements ConnectionCallbacks, OnConnectio
private LocationRequest mLocationRequest;
public static boolean isGooglePlayServicesAvailable(Context context) {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
== ConnectionResult.SUCCESS;
return ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(context);
}
LocationProviderGmsCore(Context context) {
......
......@@ -124,6 +124,7 @@ if (is_android) {
"//mojo/public/java/system:system_impl_java",
"//services/shape_detection/public/mojom:mojom_java",
"//skia/public/mojom:mojom_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//ui/gfx/geometry/mojom:mojom_java",
]
}
......
......@@ -8,11 +8,11 @@ import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import org.chromium.mojo.bindings.InterfaceRequest;
import org.chromium.mojo.system.MojoException;
import org.chromium.shape_detection.mojom.BarcodeDetection;
......@@ -55,8 +55,7 @@ public class BarcodeDetectionProviderImpl implements BarcodeDetectionProvider {
public static BarcodeDetectionProvider create() {
Context ctx = ContextUtils.getApplicationContext();
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(ctx)
!= ConnectionResult.SUCCESS) {
if (!ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(ctx)) {
Log.w(TAG, "Google Play Services not available");
return null;
}
......
......@@ -4,10 +4,8 @@
package org.chromium.shape_detection;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import org.chromium.base.ContextUtils;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import org.chromium.mojo.bindings.InterfaceRequest;
import org.chromium.mojo.system.MojoException;
import org.chromium.shape_detection.mojom.FaceDetection;
......@@ -24,9 +22,8 @@ public class FaceDetectionProviderImpl implements FaceDetectionProvider {
public void createFaceDetection(
InterfaceRequest<FaceDetection> request, FaceDetectorOptions options) {
final boolean isGmsCoreSupported =
GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
ContextUtils.getApplicationContext())
== ConnectionResult.SUCCESS;
ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext());
if (isGmsCoreSupported) {
FaceDetection.MANAGER.bind(new FaceDetectionImplGmsCore(options), request);
......
......@@ -8,8 +8,6 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.util.SparseArray;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.text.TextBlock;
import com.google.android.gms.vision.text.TextRecognizer;
......@@ -18,11 +16,11 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.gfx.mojom.PointF;
import org.chromium.gfx.mojom.RectF;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import org.chromium.mojo.system.MojoException;
import org.chromium.shape_detection.mojom.TextDetection;
import org.chromium.shape_detection.mojom.TextDetectionResult;
/**
* Implementation of mojo TextDetection, using Google Play Services vision package.
*/
......@@ -89,9 +87,8 @@ public class TextDetectionImpl implements TextDetection {
}
public static TextDetection create() {
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
ContextUtils.getApplicationContext())
!= ConnectionResult.SUCCESS) {
if (!ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext())) {
Log.e(TAG, "Google Play Services not available");
return null;
}
......
......@@ -10,11 +10,9 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import org.chromium.base.ContextUtils;
import org.chromium.base.test.util.UrlUtils;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import org.chromium.skia.mojom.ColorType;
import org.chromium.skia.mojom.ImageInfo;
......@@ -29,9 +27,8 @@ public class TestUtils {
public static final boolean IS_GMS_CORE_SUPPORTED = isGmsCoreSupported();
private static boolean isGmsCoreSupported() {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
ContextUtils.getApplicationContext())
== ConnectionResult.SUCCESS;
return ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext());
}
public static org.chromium.skia.mojom.Bitmap mojoBitmapFromBitmap(Bitmap bitmap) {
......
......@@ -80,6 +80,24 @@ java_annotation_processor("dagger_processor") {
deps = [ ":com_google_dagger_dagger_compiler_java" ]
}
android_library("chromium_play_services_availability_java") {
sources = [ "util/org/chromium/gms/ChromiumPlayServicesAvailability.java" ]
deps = [ "$google_play_services_package:google_play_services_base_java" ]
}
android_library("chromium_play_services_availability_shadows_java") {
# Platform checks are broken for Robolectric. See https://crbug.com/1071638.
bypass_platform_checks = true
testonly = true
sources = [
"util/org/chromium/gms/shadows/ShadowChromiumPlayServicesAvailability.java",
]
deps = [
":chromium_play_services_availability_java",
"//third_party/android_deps:robolectric_all_java",
]
}
# The section below is generated by running
# `//tools/android/roll/android_deps/fetch_all.py`
......
// Copyright 2020 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.gms;
import android.content.Context;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
public final class ChromiumPlayServicesAvailability {
/**
* The minimum GMS version we're requesting. isGooglePlayServicesAvailable will fail if the
* found version on the devices is lower than this number. This number should only be updated
* when using an API introduced in a newer GMS version, and that API usage is gated by this
* class. To see how this number originated, see
* https://bugs.chromium.org/p/chromium/issues/detail?id=1145211#c3.
*/
private static final int GMS_VERSION_NUMBER = 20415000;
/**
* Checks, with an appropriate version number, if Play Services is available in this context.
* This is intended to replace anyone manually calling isGooglePlayServicesAvailable(context),
* as it causes bugs without an appropriate version number (crbug.com/1145211).
*
* If at all possible, do not use this. From a GMSCore team member: "we would not recommend
* checking availability upfront. You should be able to just call the API directly, and it
* should handle the availability for you. If the API is not available, it should either prompt
* the user to update GMS Core or fail with exception." If in doubt, please consult with your
* PM/UX.
*/
public static int isGooglePlayServicesAvailable(final Context context) {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
context, GMS_VERSION_NUMBER);
}
/**
* Checks if Play Services is available in this context.
*
* If at all possible, do not use this. From a GMSCore team member: "we would not recommend
* checking availability upfront. You should be able to just call the API directly, and it
* should handle the availability for you. If the API is not available, it should either prompt
* the user to update GMS Core or fail with exception." If in doubt, please consult with your
* PM/UX.
*/
public static boolean chromiumIsGooglePlayServicesAvailable(final Context context) {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
context, GMS_VERSION_NUMBER)
== ConnectionResult.SUCCESS;
}
}
// Copyright 2020 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.gms.shadows;
import android.content.Context;
import com.google.android.gms.common.GoogleApiAvailability;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.chromium.gms.ChromiumPlayServicesAvailability;
@Implements(ChromiumPlayServicesAvailability.class)
public class ShadowChromiumPlayServicesAvailability {
private static boolean sChromiumSuccess;
private static int sConnectionResult;
public static void setChromiumIsGooglePlayServicesAvailable(boolean value) {
sChromiumSuccess = value;
}
public static void setIsGooglePlayServicesAvailable(int value) {
sConnectionResult = value;
}
@Implementation
public static int isGooglePlayServicesAvailable(final Context context) {
return sConnectionResult;
}
@Implementation
public static boolean chromiumIsGooglePlayServicesAvailable(final Context context) {
return sChromiumSuccess;
}
}
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