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") { ...@@ -505,6 +505,7 @@ android_library("chrome_java") {
"//third_party/android_deps:androidx_preference_preference_java", "//third_party/android_deps:androidx_preference_preference_java",
"//third_party/android_deps:androidx_recyclerview_recyclerview_java", "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
"//third_party/android_deps:androidx_viewpager_viewpager_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_code_findbugs_jsr305_java",
"//third_party/android_deps:com_google_dagger_dagger_java", "//third_party/android_deps:com_google_dagger_dagger_java",
"//third_party/android_deps:com_google_guava_listenablefuture_java", "//third_party/android_deps:com_google_guava_listenablefuture_java",
...@@ -915,6 +916,7 @@ junit_binary("chrome_junit_tests") { ...@@ -915,6 +916,7 @@ junit_binary("chrome_junit_tests") {
"//third_party/android_deps:androidx_swiperefreshlayout_swiperefreshlayout_java", "//third_party/android_deps:androidx_swiperefreshlayout_swiperefreshlayout_java",
"//third_party/android_deps:androidx_test_core_java", "//third_party/android_deps:androidx_test_core_java",
"//third_party/android_deps:androidx_test_runner_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_google_dagger_dagger_java",
"//third_party/android_deps:com_googlecode_java_diff_utils_diffutils_java", "//third_party/android_deps:com_googlecode_java_diff_utils_diffutils_java",
"//third_party/android_deps:protobuf_lite_runtime_java", "//third_party/android_deps:protobuf_lite_runtime_java",
......
...@@ -6,9 +6,6 @@ package org.chromium.chrome.browser.component_updater; ...@@ -6,9 +6,6 @@ package org.chromium.chrome.browser.component_updater;
import android.os.Build; 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.ContextUtils;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
...@@ -17,6 +14,7 @@ import org.chromium.components.background_task_scheduler.BackgroundTask.TaskFini ...@@ -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.BackgroundTaskSchedulerFactory;
import org.chromium.components.background_task_scheduler.TaskIds; import org.chromium.components.background_task_scheduler.TaskIds;
import org.chromium.components.background_task_scheduler.TaskInfo; import org.chromium.components.background_task_scheduler.TaskInfo;
import org.chromium.gms.ChromiumPlayServicesAvailability;
/** Java-side implementation of the component update scheduler using the BackgroundTaskScheduler. */ /** Java-side implementation of the component update scheduler using the BackgroundTaskScheduler. */
@JNINamespace("component_updater") @JNINamespace("component_updater")
...@@ -37,9 +35,8 @@ public class UpdateScheduler { ...@@ -37,9 +35,8 @@ public class UpdateScheduler {
@CalledByNative @CalledByNative
/* package */ static boolean isAvailable() { /* package */ static boolean isAvailable() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
|| GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable( || ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext()) ContextUtils.getApplicationContext());
== ConnectionResult.SUCCESS;
} }
/* package */ void onStartTaskBeforeNativeLoaded(TaskFinishedCallback callback) { /* package */ void onStartTaskBeforeNativeLoaded(TaskFinishedCallback callback) {
......
...@@ -26,6 +26,7 @@ import org.chromium.base.task.PostTask; ...@@ -26,6 +26,7 @@ import org.chromium.base.task.PostTask;
import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.components.embedder_support.util.Origin; import org.chromium.components.embedder_support.util.Origin;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.gms.ChromiumPlayServicesAvailability;
/** /**
* Utility class for external authentication tools. * Utility class for external authentication tools.
...@@ -251,7 +252,7 @@ public class ExternalAuthUtils { ...@@ -251,7 +252,7 @@ public class ExternalAuthUtils {
protected int checkGooglePlayServicesAvailable(final Context context) { protected int checkGooglePlayServicesAvailable(final Context context) {
// TODO(crbug.com/577190): Temporarily allowing disk access until more permanent fix is in. // TODO(crbug.com/577190): Temporarily allowing disk access until more permanent fix is in.
try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) { try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context); return ChromiumPlayServicesAvailability.isGooglePlayServicesAvailable(context);
} }
} }
......
...@@ -8,35 +8,32 @@ import static org.junit.Assert.assertFalse; ...@@ -8,35 +8,32 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.annotation.Config; 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.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.gms.shadows.ShadowChromiumPlayServicesAvailability;
/** Unit tests for GooglePlayServicesChecker. */ /** Unit tests for GooglePlayServicesChecker. */
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE, shadows = {ShadowGoogleApiAvailability.class}) @Config(manifest = Config.NONE, shadows = {ShadowChromiumPlayServicesAvailability.class})
public class BackgroundSyncGooglePlayServicesCheckerTest { public class BackgroundSyncGooglePlayServicesCheckerTest {
@Test @Test
@Feature("BackgroundSync") @Feature("BackgroundSync")
public void testDisableLogicWhenGooglePlayServicesReturnsSuccess() { public void testDisableLogicWhenGooglePlayServicesReturnsSuccess() {
Shadows.shadowOf(GoogleApiAvailability.getInstance()) ShadowChromiumPlayServicesAvailability.setIsGooglePlayServicesAvailable(
.setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS); ConnectionResult.SUCCESS);
assertFalse(GooglePlayServicesChecker.shouldDisableBackgroundSync()); assertFalse(GooglePlayServicesChecker.shouldDisableBackgroundSync());
} }
@Test @Test
@Feature("BackgroundSync") @Feature("BackgroundSync")
public void testDisableLogicWhenGooglePlayServicesReturnsError() { public void testDisableLogicWhenGooglePlayServicesReturnsError() {
Shadows.shadowOf(GoogleApiAvailability.getInstance()) ShadowChromiumPlayServicesAvailability.setIsGooglePlayServicesAvailable(
.setIsGooglePlayServicesAvailable(ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED); ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED);
assertTrue(GooglePlayServicesChecker.shouldDisableBackgroundSync()); assertTrue(GooglePlayServicesChecker.shouldDisableBackgroundSync());
} }
} }
...@@ -309,6 +309,7 @@ android_library("chrome_java_test_support") { ...@@ -309,6 +309,7 @@ android_library("chrome_java_test_support") {
"//third_party/android_deps:androidx_fragment_fragment_java", "//third_party/android_deps:androidx_fragment_fragment_java",
"//third_party/android_deps:androidx_lifecycle_lifecycle_common_java", "//third_party/android_deps:androidx_lifecycle_lifecycle_common_java",
"//third_party/android_deps:androidx_recyclerview_recyclerview_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:com_google_code_findbugs_jsr305_java",
"//third_party/android_deps:espresso_java", "//third_party/android_deps:espresso_java",
"//third_party/android_deps:material_design_java", "//third_party/android_deps:material_design_java",
......
...@@ -9,9 +9,6 @@ import android.os.Build; ...@@ -9,9 +9,6 @@ import android.os.Build;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.text.TextUtils; 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.rules.TestRule;
import org.junit.runners.model.InitializationError; import org.junit.runners.model.InitializationError;
...@@ -26,6 +23,7 @@ import org.chromium.chrome.test.util.browser.Features; ...@@ -26,6 +23,7 @@ import org.chromium.chrome.test.util.browser.Features;
import org.chromium.components.policy.test.annotations.Policies; import org.chromium.components.policy.test.annotations.Policies;
import org.chromium.content_public.browser.test.ContentJUnit4ClassRunner; import org.chromium.content_public.browser.test.ContentJUnit4ClassRunner;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
...@@ -154,8 +152,7 @@ public class ChromeJUnit4ClassRunner extends ContentJUnit4ClassRunner { ...@@ -154,8 +152,7 @@ public class ChromeJUnit4ClassRunner extends ContentJUnit4ClassRunner {
protected boolean restrictionApplies(String restriction) { protected boolean restrictionApplies(String restriction) {
if (TextUtils.equals( if (TextUtils.equals(
restriction, ChromeRestriction.RESTRICTION_TYPE_GOOGLE_PLAY_SERVICES) restriction, ChromeRestriction.RESTRICTION_TYPE_GOOGLE_PLAY_SERVICES)
&& (ConnectionResult.SUCCESS && (!ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
!= GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
getTargetContext()))) { getTargetContext()))) {
return true; return true;
} }
......
...@@ -132,6 +132,7 @@ if (is_android) { ...@@ -132,6 +132,7 @@ if (is_android) {
"//base:base_java_test_support", "//base:base_java_test_support",
"//base:base_junit_test_support", "//base:base_junit_test_support",
"//components/background_task_scheduler:public_java", "//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/android_deps:robolectric_all_java",
"//third_party/junit", "//third_party/junit",
"//third_party/mockito:mockito_java", "//third_party/mockito:mockito_java",
......
...@@ -36,6 +36,7 @@ if (is_android) { ...@@ -36,6 +36,7 @@ if (is_android) {
"//components/background_task_scheduler:public_java", "//components/background_task_scheduler:public_java",
"//content/public/android:content_java", "//content/public/android:content_java",
"//third_party/android_deps:androidx_annotation_annotation_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", "//third_party/android_deps:protobuf_lite_runtime_java",
] ]
} }
......
...@@ -10,8 +10,6 @@ import android.os.Bundle; ...@@ -10,8 +10,6 @@ import android.os.Bundle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting; 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.GcmNetworkManager;
import com.google.android.gms.gcm.OneoffTask; import com.google.android.gms.gcm.OneoffTask;
import com.google.android.gms.gcm.PeriodicTask; import com.google.android.gms.gcm.PeriodicTask;
...@@ -22,6 +20,7 @@ import org.chromium.base.Log; ...@@ -22,6 +20,7 @@ import org.chromium.base.Log;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.components.background_task_scheduler.TaskInfo; import org.chromium.components.background_task_scheduler.TaskInfo;
import org.chromium.components.background_task_scheduler.TaskParameters; import org.chromium.components.background_task_scheduler.TaskParameters;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -246,8 +245,7 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule ...@@ -246,8 +245,7 @@ class BackgroundTaskSchedulerGcmNetworkManager implements BackgroundTaskSchedule
} }
private GcmNetworkManager getGcmNetworkManager(Context context) { private GcmNetworkManager getGcmNetworkManager(Context context) {
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) if (ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(context)) {
== ConnectionResult.SUCCESS) {
return GcmNetworkManager.getInstance(context); return GcmNetworkManager.getInstance(context);
} }
return null; return null;
......
...@@ -12,8 +12,6 @@ import static org.junit.Assert.assertTrue; ...@@ -12,8 +12,6 @@ import static org.junit.Assert.assertTrue;
import android.os.Bundle; 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.GcmNetworkManager;
import com.google.android.gms.gcm.OneoffTask; import com.google.android.gms.gcm.OneoffTask;
import com.google.android.gms.gcm.PeriodicTask; import com.google.android.gms.gcm.PeriodicTask;
...@@ -25,8 +23,6 @@ import org.junit.Test; ...@@ -25,8 +23,6 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow; 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.ContextUtils;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
...@@ -35,13 +31,14 @@ import org.chromium.components.background_task_scheduler.BackgroundTask; ...@@ -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.TaskIds;
import org.chromium.components.background_task_scheduler.TaskInfo; import org.chromium.components.background_task_scheduler.TaskInfo;
import org.chromium.components.background_task_scheduler.TaskParameters; import org.chromium.components.background_task_scheduler.TaskParameters;
import org.chromium.gms.shadows.ShadowChromiumPlayServicesAvailability;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** Unit tests for {@link BackgroundTaskSchedulerGcmNetworkManager}. */ /** Unit tests for {@link BackgroundTaskSchedulerGcmNetworkManager}. */
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE, @Config(manifest = Config.NONE,
shadows = {ShadowGcmNetworkManager.class, ShadowGoogleApiAvailability.class}) shadows = {ShadowGcmNetworkManager.class, ShadowChromiumPlayServicesAvailability.class})
public class BackgroundTaskSchedulerGcmNetworkManagerTest { public class BackgroundTaskSchedulerGcmNetworkManagerTest {
ShadowGcmNetworkManager mGcmNetworkManager; ShadowGcmNetworkManager mGcmNetworkManager;
...@@ -59,8 +56,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest { ...@@ -59,8 +56,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest {
@Before @Before
public void setUp() { public void setUp() {
Shadows.shadowOf(GoogleApiAvailability.getInstance()) ShadowChromiumPlayServicesAvailability.setChromiumIsGooglePlayServicesAvailable(true);
.setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS);
mGcmNetworkManager = (ShadowGcmNetworkManager) Shadow.extract( mGcmNetworkManager = (ShadowGcmNetworkManager) Shadow.extract(
GcmNetworkManager.getInstance(ContextUtils.getApplicationContext())); GcmNetworkManager.getInstance(ContextUtils.getApplicationContext()));
BackgroundTaskSchedulerGcmNetworkManager.setClockForTesting(mClock); BackgroundTaskSchedulerGcmNetworkManager.setClockForTesting(mClock);
...@@ -301,8 +297,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest { ...@@ -301,8 +297,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest {
@Test @Test
@Feature("BackgroundTaskScheduler") @Feature("BackgroundTaskScheduler")
public void testScheduleNoGooglePlayServices() { public void testScheduleNoGooglePlayServices() {
Shadows.shadowOf(GoogleApiAvailability.getInstance()) ShadowChromiumPlayServicesAvailability.setChromiumIsGooglePlayServicesAvailable(false);
.setIsGooglePlayServicesAvailable(ConnectionResult.SERVICE_MISSING);
TaskInfo.TimingInfo timingInfo = TaskInfo.TimingInfo timingInfo =
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_24_H_TO_MS).build(); TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_24_H_TO_MS).build();
...@@ -332,8 +327,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest { ...@@ -332,8 +327,7 @@ public class BackgroundTaskSchedulerGcmNetworkManagerTest {
@Feature("BackgroundTaskScheduler") @Feature("BackgroundTaskScheduler")
public void testCancelNoGooglePlayServices() { public void testCancelNoGooglePlayServices() {
// This simulates situation where Google Play Services is uninstalled. // This simulates situation where Google Play Services is uninstalled.
Shadows.shadowOf(GoogleApiAvailability.getInstance()) ShadowChromiumPlayServicesAvailability.setChromiumIsGooglePlayServicesAvailable(false);
.setIsGooglePlayServicesAvailable(ConnectionResult.SERVICE_MISSING);
TaskInfo.TimingInfo timingInfo = TaskInfo.TimingInfo timingInfo =
TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_24_H_TO_MS).build(); TaskInfo.OneOffInfo.create().setWindowEndTimeMs(TIME_24_H_TO_MS).build();
......
...@@ -15,8 +15,6 @@ import static org.mockito.Mockito.verify; ...@@ -15,8 +15,6 @@ import static org.mockito.Mockito.verify;
import android.os.Build; 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 com.google.android.gms.gcm.GcmNetworkManager;
import org.junit.Before; import org.junit.Before;
...@@ -27,8 +25,6 @@ import org.mockito.MockitoAnnotations; ...@@ -27,8 +25,6 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow; 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.robolectric.util.ReflectionHelpers;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
...@@ -37,13 +33,14 @@ import org.chromium.base.test.util.Feature; ...@@ -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.BackgroundTaskScheduler;
import org.chromium.components.background_task_scheduler.TaskIds; import org.chromium.components.background_task_scheduler.TaskIds;
import org.chromium.components.background_task_scheduler.TaskInfo; import org.chromium.components.background_task_scheduler.TaskInfo;
import org.chromium.gms.shadows.ShadowChromiumPlayServicesAvailability;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** Unit tests for {@link BackgroundTaskScheduler}. */ /** Unit tests for {@link BackgroundTaskScheduler}. */
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE, @Config(manifest = Config.NONE,
shadows = {ShadowGcmNetworkManager.class, ShadowGoogleApiAvailability.class}) shadows = {ShadowGcmNetworkManager.class, ShadowChromiumPlayServicesAvailability.class})
public class BackgroundTaskSchedulerImplTest { public class BackgroundTaskSchedulerImplTest {
@Mock @Mock
private BackgroundTaskSchedulerDelegate mDelegate; private BackgroundTaskSchedulerDelegate mDelegate;
...@@ -66,8 +63,7 @@ public class BackgroundTaskSchedulerImplTest { ...@@ -66,8 +63,7 @@ public class BackgroundTaskSchedulerImplTest {
TestBackgroundTask.reset(); TestBackgroundTask.reset();
// Initialize Google Play Services and GCM Network Manager for upgrade testing. // Initialize Google Play Services and GCM Network Manager for upgrade testing.
Shadows.shadowOf(GoogleApiAvailability.getInstance()) ShadowChromiumPlayServicesAvailability.setChromiumIsGooglePlayServicesAvailable(true);
.setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS);
mGcmNetworkManager = (ShadowGcmNetworkManager) Shadow.extract( mGcmNetworkManager = (ShadowGcmNetworkManager) Shadow.extract(
GcmNetworkManager.getInstance(ContextUtils.getApplicationContext())); GcmNetworkManager.getInstance(ContextUtils.getApplicationContext()));
......
...@@ -22,6 +22,7 @@ android_library("java") { ...@@ -22,6 +22,7 @@ android_library("java") {
"//net/android:net_java", "//net/android:net_java",
"//third_party/android_deps:android_support_v4_java", "//third_party/android_deps:android_support_v4_java",
"//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//ui/android:ui_java", "//ui/android:ui_java",
] ]
......
...@@ -41,6 +41,7 @@ import org.chromium.base.StrictModeContext; ...@@ -41,6 +41,7 @@ import org.chromium.base.StrictModeContext;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import java.io.IOException; import java.io.IOException;
...@@ -90,7 +91,7 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate { ...@@ -90,7 +91,7 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
protected void checkCanUseGooglePlayServices() throws AccountManagerDelegateException { protected void checkCanUseGooglePlayServices() throws AccountManagerDelegateException {
Context context = ContextUtils.getApplicationContext(); Context context = ContextUtils.getApplicationContext();
final int resultCode = final int resultCode =
GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context); ChromiumPlayServicesAvailability.isGooglePlayServicesAvailable(context);
if (resultCode == ConnectionResult.SUCCESS) { if (resultCode == ConnectionResult.SUCCESS) {
return; return;
} }
...@@ -263,9 +264,8 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate { ...@@ -263,9 +264,8 @@ public class SystemAccountManagerDelegate implements AccountManagerDelegate {
public boolean isGooglePlayServicesAvailable() { public boolean isGooglePlayServicesAvailable() {
// TODO(http://crbug.com/577190): Remove StrictMode override. // TODO(http://crbug.com/577190): Remove StrictMode override.
try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) { try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
int resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable( return ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext()); ContextUtils.getApplicationContext());
return resultCode == ConnectionResult.SUCCESS;
} }
} }
......
...@@ -151,6 +151,7 @@ if (is_android) { ...@@ -151,6 +151,7 @@ if (is_android) {
"//skia/public/mojom:mojom_java", "//skia/public/mojom:mojom_java",
"//third_party/android_deps:androidx_test_monitor_java", "//third_party/android_deps:androidx_test_monitor_java",
"//third_party/android_deps:androidx_test_runner_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/android_support_test_runner:runner_java",
"//third_party/junit", "//third_party/junit",
"//ui/gfx/geometry/mojom:mojom_java", "//ui/gfx/geometry/mojom:mojom_java",
......
...@@ -164,6 +164,7 @@ if (is_android) { ...@@ -164,6 +164,7 @@ if (is_android) {
"//components/location/android:location_java", "//components/location/android:location_java",
"//services/device/public/java:geolocation_java", "//services/device/public/java:geolocation_java",
"//third_party/android_deps:androidx_annotation_annotation_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" ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
} }
......
...@@ -9,7 +9,6 @@ import android.location.Location; ...@@ -9,7 +9,6 @@ import android.location.Location;
import android.os.Bundle; import android.os.Bundle;
import com.google.android.gms.common.ConnectionResult; 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;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks; import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
...@@ -21,6 +20,7 @@ import com.google.android.gms.location.LocationServices; ...@@ -21,6 +20,7 @@ import com.google.android.gms.location.LocationServices;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.components.location.LocationUtils; import org.chromium.components.location.LocationUtils;
import org.chromium.gms.ChromiumPlayServicesAvailability;
/** /**
* This is a LocationProvider using Google Play Services. * This is a LocationProvider using Google Play Services.
...@@ -42,8 +42,7 @@ public class LocationProviderGmsCore implements ConnectionCallbacks, OnConnectio ...@@ -42,8 +42,7 @@ public class LocationProviderGmsCore implements ConnectionCallbacks, OnConnectio
private LocationRequest mLocationRequest; private LocationRequest mLocationRequest;
public static boolean isGooglePlayServicesAvailable(Context context) { public static boolean isGooglePlayServicesAvailable(Context context) {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) return ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(context);
== ConnectionResult.SUCCESS;
} }
LocationProviderGmsCore(Context context) { LocationProviderGmsCore(Context context) {
......
...@@ -124,6 +124,7 @@ if (is_android) { ...@@ -124,6 +124,7 @@ if (is_android) {
"//mojo/public/java/system:system_impl_java", "//mojo/public/java/system:system_impl_java",
"//services/shape_detection/public/mojom:mojom_java", "//services/shape_detection/public/mojom:mojom_java",
"//skia/public/mojom:mojom_java", "//skia/public/mojom:mojom_java",
"//third_party/android_deps:chromium_play_services_availability_java",
"//ui/gfx/geometry/mojom:mojom_java", "//ui/gfx/geometry/mojom:mojom_java",
] ]
} }
......
...@@ -8,11 +8,11 @@ import android.content.Context; ...@@ -8,11 +8,11 @@ import android.content.Context;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.GoogleApiAvailability;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import org.chromium.mojo.bindings.InterfaceRequest; import org.chromium.mojo.bindings.InterfaceRequest;
import org.chromium.mojo.system.MojoException; import org.chromium.mojo.system.MojoException;
import org.chromium.shape_detection.mojom.BarcodeDetection; import org.chromium.shape_detection.mojom.BarcodeDetection;
...@@ -55,8 +55,7 @@ public class BarcodeDetectionProviderImpl implements BarcodeDetectionProvider { ...@@ -55,8 +55,7 @@ public class BarcodeDetectionProviderImpl implements BarcodeDetectionProvider {
public static BarcodeDetectionProvider create() { public static BarcodeDetectionProvider create() {
Context ctx = ContextUtils.getApplicationContext(); Context ctx = ContextUtils.getApplicationContext();
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(ctx) if (!ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(ctx)) {
!= ConnectionResult.SUCCESS) {
Log.w(TAG, "Google Play Services not available"); Log.w(TAG, "Google Play Services not available");
return null; return null;
} }
......
...@@ -4,10 +4,8 @@ ...@@ -4,10 +4,8 @@
package org.chromium.shape_detection; 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.base.ContextUtils;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import org.chromium.mojo.bindings.InterfaceRequest; import org.chromium.mojo.bindings.InterfaceRequest;
import org.chromium.mojo.system.MojoException; import org.chromium.mojo.system.MojoException;
import org.chromium.shape_detection.mojom.FaceDetection; import org.chromium.shape_detection.mojom.FaceDetection;
...@@ -24,9 +22,8 @@ public class FaceDetectionProviderImpl implements FaceDetectionProvider { ...@@ -24,9 +22,8 @@ public class FaceDetectionProviderImpl implements FaceDetectionProvider {
public void createFaceDetection( public void createFaceDetection(
InterfaceRequest<FaceDetection> request, FaceDetectorOptions options) { InterfaceRequest<FaceDetection> request, FaceDetectorOptions options) {
final boolean isGmsCoreSupported = final boolean isGmsCoreSupported =
GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable( ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext()) ContextUtils.getApplicationContext());
== ConnectionResult.SUCCESS;
if (isGmsCoreSupported) { if (isGmsCoreSupported) {
FaceDetection.MANAGER.bind(new FaceDetectionImplGmsCore(options), request); FaceDetection.MANAGER.bind(new FaceDetectionImplGmsCore(options), request);
......
...@@ -8,8 +8,6 @@ import android.graphics.Point; ...@@ -8,8 +8,6 @@ import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
import android.util.SparseArray; 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.Frame;
import com.google.android.gms.vision.text.TextBlock; import com.google.android.gms.vision.text.TextBlock;
import com.google.android.gms.vision.text.TextRecognizer; import com.google.android.gms.vision.text.TextRecognizer;
...@@ -18,11 +16,11 @@ import org.chromium.base.ContextUtils; ...@@ -18,11 +16,11 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.gfx.mojom.PointF; import org.chromium.gfx.mojom.PointF;
import org.chromium.gfx.mojom.RectF; import org.chromium.gfx.mojom.RectF;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import org.chromium.mojo.system.MojoException; import org.chromium.mojo.system.MojoException;
import org.chromium.shape_detection.mojom.TextDetection; import org.chromium.shape_detection.mojom.TextDetection;
import org.chromium.shape_detection.mojom.TextDetectionResult; import org.chromium.shape_detection.mojom.TextDetectionResult;
/** /**
* Implementation of mojo TextDetection, using Google Play Services vision package. * Implementation of mojo TextDetection, using Google Play Services vision package.
*/ */
...@@ -89,9 +87,8 @@ public class TextDetectionImpl implements TextDetection { ...@@ -89,9 +87,8 @@ public class TextDetectionImpl implements TextDetection {
} }
public static TextDetection create() { public static TextDetection create() {
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable( if (!ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext()) ContextUtils.getApplicationContext())) {
!= ConnectionResult.SUCCESS) {
Log.e(TAG, "Google Play Services not available"); Log.e(TAG, "Google Play Services not available");
return null; return null;
} }
......
...@@ -10,11 +10,9 @@ import android.graphics.Canvas; ...@@ -10,11 +10,9 @@ import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; 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.ContextUtils;
import org.chromium.base.test.util.UrlUtils; import org.chromium.base.test.util.UrlUtils;
import org.chromium.gms.ChromiumPlayServicesAvailability;
import org.chromium.skia.mojom.ColorType; import org.chromium.skia.mojom.ColorType;
import org.chromium.skia.mojom.ImageInfo; import org.chromium.skia.mojom.ImageInfo;
...@@ -29,9 +27,8 @@ public class TestUtils { ...@@ -29,9 +27,8 @@ public class TestUtils {
public static final boolean IS_GMS_CORE_SUPPORTED = isGmsCoreSupported(); public static final boolean IS_GMS_CORE_SUPPORTED = isGmsCoreSupported();
private static boolean isGmsCoreSupported() { private static boolean isGmsCoreSupported() {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable( return ChromiumPlayServicesAvailability.chromiumIsGooglePlayServicesAvailable(
ContextUtils.getApplicationContext()) ContextUtils.getApplicationContext());
== ConnectionResult.SUCCESS;
} }
public static org.chromium.skia.mojom.Bitmap mojoBitmapFromBitmap(Bitmap bitmap) { public static org.chromium.skia.mojom.Bitmap mojoBitmapFromBitmap(Bitmap bitmap) {
......
...@@ -80,6 +80,24 @@ java_annotation_processor("dagger_processor") { ...@@ -80,6 +80,24 @@ java_annotation_processor("dagger_processor") {
deps = [ ":com_google_dagger_dagger_compiler_java" ] 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 # The section below is generated by running
# `//tools/android/roll/android_deps/fetch_all.py` # `//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