Commit bf31a52a authored by Nick Burris's avatar Nick Burris Committed by Chromium LUCI CQ

Make ExternalAuthUtils a singleton instance

* Make ExternalAuthUtils provide its own instance instead of callers
  having to use AppHooks. A follow up patch will remove the
  ExternalAuthUtils instance from AppHooks.
* This is patch 3/5 for providing ExternalAuthUtils as a singleton
  instead of from AppHooks.

Change-Id: I6527d93dbce453626aa0c02f7093d7686f67266a
Bug: 1154371
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2587430
Commit-Queue: Nick Burris <nburris@chromium.org>
Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#837354}
parent fac68744
......@@ -28,7 +28,7 @@ public class AppHooksModule {
@Provides
public ExternalAuthUtils provideExternalAuthUtils() {
return AppHooks.get().getExternalAuthUtils();
return ExternalAuthUtils.getInstance();
}
@Provides
......
......@@ -53,6 +53,7 @@ import org.chromium.chrome.browser.webapps.WebappActivity;
import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.external_intents.ExternalNavigationHandler;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.content_public.browser.BrowserStartupController;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.common.ContentUrlConstants;
......@@ -1070,7 +1071,7 @@ public class IntentHandler {
if (isChromeToken(token)) {
return true;
}
if (AppHooks.get().getExternalAuthUtils().isGoogleSigned(token.getCreatorPackage())) {
if (ExternalAuthUtils.getInstance().isGoogleSigned(token.getCreatorPackage())) {
return true;
}
return false;
......
......@@ -33,7 +33,7 @@ public class PlayServicesVersionInfo {
final long installedGmsVersion = getApkVersionNumber(context);
final String accessType;
ExternalAuthUtils externalAuthUtils = AppHooks.get().getExternalAuthUtils();
ExternalAuthUtils externalAuthUtils = ExternalAuthUtils.getInstance();
if (externalAuthUtils.canUseFirstPartyGooglePlayServices()) {
accessType = "1p";
} else if (externalAuthUtils.canUseGooglePlayServices()) {
......
......@@ -24,6 +24,7 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.util.BrowserControlsVisibilityDelegate;
import org.chromium.components.browser_ui.util.ComposedBrowserControlsVisibilityDelegate;
import org.chromium.components.external_intents.ExternalNavigationHandler;
import org.chromium.components.externalauth.ExternalAuthUtils;
/**
* {@link TabDelegateFactory} class to be used in all {@link Tab} instances owned by a
......@@ -68,7 +69,7 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
mEphemeralTabCoordinatorSupplier, mContextMenuCopyLinkObserver,
mActivity::getSnackbarManager),
mShareDelegateSupplier, ChromeContextMenuPopulator.ContextMenuMode.NORMAL,
AppHooks.get().getExternalAuthUtils());
ExternalAuthUtils.getInstance());
}
@Override
......
......@@ -9,7 +9,7 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.Log;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.components.externalauth.ExternalAuthUtils;
/**
* Used to check whether Google Play Services version on the device is as
......@@ -29,7 +29,7 @@ final class GooglePlayServicesChecker {
@VisibleForTesting
protected static boolean shouldDisableBackgroundSync() {
boolean isAvailable = true;
if (!AppHooks.get().getExternalAuthUtils().canUseGooglePlayServices()) {
if (!ExternalAuthUtils.getInstance().canUseGooglePlayServices()) {
Log.i(TAG, "Disabling Background Sync because Play Services is not up to date.");
isAvailable = false;
}
......
......@@ -21,7 +21,6 @@ import org.chromium.base.Log;
import org.chromium.base.PackageManagerUtils;
import org.chromium.base.supplier.Supplier;
import org.chromium.cc.input.BrowserControlsState;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.app.ChromeActivity;
......@@ -494,7 +493,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
Supplier<ShareDelegate> shareDelegateSupplier =
mActivity == null ? null : mActivity.getShareDelegateSupplier();
return new ChromeContextMenuPopulatorFactory(createTabContextMenuItemDelegate(tab),
shareDelegateSupplier, contextMenuMode, AppHooks.get().getExternalAuthUtils());
shareDelegateSupplier, contextMenuMode, ExternalAuthUtils.getInstance());
}
@Override
......
......@@ -70,6 +70,7 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.content_settings.CookieControlsMode;
import org.chromium.components.embedder_support.util.Origin;
import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.BrowserStartupController;
import org.chromium.content_public.browser.ChildProcessLauncherHelper;
......@@ -1081,7 +1082,7 @@ public class CustomTabsConnection {
public boolean isSessionFirstParty(CustomTabsSessionToken session) {
String packageName = getClientPackageNameForSession(session);
if (packageName == null) return false;
return AppHooks.get().getExternalAuthUtils().isGoogleSigned(packageName);
return ExternalAuthUtils.getInstance().isGoogleSigned(packageName);
}
void setIgnoreUrlFragmentsForSession(CustomTabsSessionToken session, boolean value) {
......
......@@ -9,7 +9,6 @@ import android.app.Activity;
import androidx.annotation.Nullable;
import org.chromium.base.Log;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.services.AndroidChildAccountHelper;
......@@ -17,6 +16,7 @@ import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
import org.chromium.chrome.browser.signin.services.SigninManager;
import org.chromium.chrome.browser.sync.ProfileSyncService;
import org.chromium.chrome.browser.sync.settings.AccountManagementFragment;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.components.externalauth.UserRecoverableErrorHandler;
import org.chromium.components.signin.AccountManagerFacadeProvider;
import org.chromium.components.signin.ChildAccountStatus;
......@@ -119,7 +119,7 @@ public final class ForcedSigninProcessor {
if (IdentityServicesProvider.get()
.getSigninManager(Profile.getLastUsedRegularProfile())
.isForceSigninEnabled()) {
AppHooks.get().getExternalAuthUtils().canUseGooglePlayServices(
ExternalAuthUtils.getInstance().canUseGooglePlayServices(
new UserRecoverableErrorHandler.ModalDialog(activity, false));
}
}
......
......@@ -11,7 +11,6 @@ import com.google.android.gms.common.api.GoogleApiClient;
import org.chromium.base.Log;
import org.chromium.base.TraceEvent;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.components.externalauth.ExternalAuthUtils;
import java.util.concurrent.TimeUnit;
......@@ -37,7 +36,7 @@ public class ChromeGoogleApiClientImpl implements ChromeGoogleApiClient {
boolean requireFirstPartyBuild) {
mApplicationContext = context.getApplicationContext();
mClient = client;
mExternalAuthUtils = AppHooks.get().getExternalAuthUtils();
mExternalAuthUtils = ExternalAuthUtils.getInstance();
if (requireFirstPartyBuild && !mExternalAuthUtils.isChromeGoogleSigned()) {
throw new IllegalStateException("GoogleApiClient requires first-party build");
}
......
......@@ -16,7 +16,6 @@ import android.view.ViewGroup;
import androidx.annotation.ColorInt;
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.gsa.GSAState;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.Destroyable;
......@@ -25,6 +24,7 @@ import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.components.browser_ui.styles.ChromeColors;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.ui.base.ViewUtils;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
......@@ -81,7 +81,7 @@ class SearchBoxMediator
@Override
public void onFinishNativeInitialization() {
mAssistantVoiceSearchService = new AssistantVoiceSearchService(mContext,
AppHooks.get().getExternalAuthUtils(), TemplateUrlServiceFactory.get(),
ExternalAuthUtils.getInstance(), TemplateUrlServiceFactory.get(),
GSAState.getInstance(mContext), this, SharedPreferencesManager.getInstance());
onAssistantVoiceSearchServiceChanged();
}
......
......@@ -23,7 +23,6 @@ import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.base.supplier.OneshotSupplierImpl;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.gsa.GSAState;
import org.chromium.chrome.browser.locale.LocaleManager;
......@@ -43,6 +42,7 @@ import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.KeyNavigationUtil;
import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.components.search_engines.TemplateUrl;
import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.components.search_engines.TemplateUrlService.TemplateUrlServiceObserver;
......@@ -147,7 +147,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
mOmniboxPrerender = new OmniboxPrerender();
Context context = mLocationBarLayout.getContext();
mAssistantVoiceSearchService = new AssistantVoiceSearchService(context,
AppHooks.get().getExternalAuthUtils(), mTemplateUrlServiceSupplier.get(),
ExternalAuthUtils.getInstance(), mTemplateUrlServiceSupplier.get(),
GSAState.getInstance(context), this, SharedPreferencesManager.getInstance());
mAssistantVoiceSearchSupplier.set(mAssistantVoiceSearchService);
mLocationBarLayout.onFinishNativeInitialization();
......
......@@ -11,7 +11,6 @@ import android.os.Message;
import android.os.Messenger;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.version.ChromeVersionInfo;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.components.externalauth.VerifiedHandler;
......@@ -26,7 +25,7 @@ public class ChromePrerenderServiceImpl extends ChromePrerenderService.Impl {
*/
static class IncomingHandler extends VerifiedHandler {
IncomingHandler(Context context) {
super(context, AppHooks.get().getExternalAuthUtils(),
super(context, ExternalAuthUtils.getInstance(),
ChromeVersionInfo.isLocalBuild()
? 0
: ExternalAuthUtils.FLAG_SHOULD_BE_GOOGLE_SIGNED);
......
......@@ -32,7 +32,6 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.task.PostTask;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.database.SQLiteCursor;
import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
......@@ -1133,10 +1132,9 @@ public class ChromeBrowserProviderImpl extends ChromeBrowserProvider.Impl {
}
private boolean hasPermission(String permission) {
boolean isSystemOrGoogleCaller =
AppHooks.get().getExternalAuthUtils().isCallerValid(getContext(),
ExternalAuthUtils.FLAG_SHOULD_BE_GOOGLE_SIGNED
| ExternalAuthUtils.FLAG_SHOULD_BE_SYSTEM);
boolean isSystemOrGoogleCaller = ExternalAuthUtils.getInstance().isCallerValid(getContext(),
ExternalAuthUtils.FLAG_SHOULD_BE_GOOGLE_SIGNED
| ExternalAuthUtils.FLAG_SHOULD_BE_SYSTEM);
if (isSystemOrGoogleCaller) {
recordPermissionWasGranted("SignaturePassed", permission);
......
......@@ -21,7 +21,6 @@ import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.task.PostTask;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.signin.services.SigninManager;
import org.chromium.chrome.browser.signin.services.SigninPreferencesManager;
......@@ -108,7 +107,7 @@ class SigninManagerImpl implements AccountTrackerService.OnSystemAccountsSeededL
assert identityMutator != null;
return new SigninManagerImpl(nativeSigninManagerAndroid, accountTrackerService,
identityManager, identityMutator, AndroidSyncSettings.get(),
AppHooks.get().getExternalAuthUtils());
ExternalAuthUtils.getInstance());
}
@VisibleForTesting
......
......@@ -32,8 +32,8 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.blink.mojom.AuthenticatorStatus;
import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.components.externalauth.UserRecoverableErrorHandler;
import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.content_public.browser.WebContents;
......@@ -254,7 +254,7 @@ public class Fido2CredentialRequest implements WindowAndroid.IntentCallback {
return true;
}
if (!AppHooks.get().getExternalAuthUtils().canUseGooglePlayServices(
if (!ExternalAuthUtils.getInstance().canUseGooglePlayServices(
new UserRecoverableErrorHandler.Silent())) {
return false;
}
......
......@@ -19,7 +19,6 @@ import org.junit.runner.RunWith;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTaskScheduler.BackgroundSyncTask;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.Tab;
......@@ -27,6 +26,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.browser.TabTitleObserver;
import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.content_public.browser.test.NativeLibraryTestUtils;
import org.chromium.content_public.browser.test.util.BackgroundSyncNetworkUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
......@@ -75,7 +75,7 @@ public final class BackgroundSyncTest {
// fixed.
// Note that this should be done before the startMainActivityOnBlankPage(), because Chrome
// will otherwise run this check on startup and disable BackgroundSync code.
if (!AppHooks.get().getExternalAuthUtils().canUseGooglePlayServices()) {
if (!ExternalAuthUtils.getInstance().canUseGooglePlayServices()) {
NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
disableGooglePlayServicesVersionCheck();
}
......
......@@ -19,7 +19,6 @@ import org.junit.runner.RunWith;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.background_sync.BackgroundSyncBackgroundTaskScheduler.BackgroundSyncTask;
import org.chromium.chrome.browser.engagement.SiteEngagementService;
import org.chromium.chrome.browser.flags.ChromeSwitches;
......@@ -29,6 +28,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.browser.TabTitleObserver;
import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.content_public.browser.test.NativeLibraryTestUtils;
import org.chromium.content_public.browser.test.util.BackgroundSyncNetworkUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
......@@ -82,7 +82,7 @@ public final class PeriodicBackgroundSyncTest {
// been fixed.
// Note that this should be done before the startMainActivityOnBlankPage(), because Chrome
// will otherwise run this check on startup and disable Periodic Background Sync code.
if (!AppHooks.get().getExternalAuthUtils().canUseGooglePlayServices()) {
if (!ExternalAuthUtils.getInstance().canUseGooglePlayServices()) {
NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
disableGooglePlayServicesVersionCheck();
}
......
......@@ -26,6 +26,7 @@ android_library("google_delegate_public_impl_java") {
android_library("java") {
deps = [
":google_delegate_java",
"$google_play_services_package:google_play_services_base_java",
"$google_play_services_package:google_play_services_basement_java",
"//base:base_java",
......
......@@ -35,6 +35,20 @@ public class ExternalAuthUtils {
public static final int FLAG_SHOULD_BE_GOOGLE_SIGNED = 1 << 0;
public static final int FLAG_SHOULD_BE_SYSTEM = 1 << 1;
private static final String TAG = "ExternalAuthUtils";
private static ExternalAuthUtils sInstance = new ExternalAuthUtils();
private final ExternalAuthGoogleDelegate mGoogleDelegate;
public ExternalAuthUtils() {
mGoogleDelegate = new ExternalAuthGoogleDelegateImpl();
}
/**
* @return The singleton instance of ExternalAuthUtils.
*/
public static ExternalAuthUtils getInstance() {
return sInstance;
}
/**
* Gets the calling package names for the current transaction.
......@@ -84,8 +98,7 @@ public class ExternalAuthUtils {
* @param packageName The package name to inquire about.
*/
public boolean isGoogleSigned(String packageName) {
// This is overridden in a subclass.
return false;
return mGoogleDelegate.isGoogleSigned(packageName);
}
/**
......@@ -231,6 +244,14 @@ public class ExternalAuthUtils {
return canUseFirstPartyGooglePlayServices(new UserRecoverableErrorHandler.Silent());
}
/**
* @return this object's {@link ExternalAuthGoogleDelegate} instance.
*/
@VisibleForTesting
public ExternalAuthGoogleDelegate getGoogleDelegateForTesting() {
return mGoogleDelegate;
}
/**
* Invokes whatever external code is necessary to check if Google Play Services is available
* and returns the code produced by the attempt. Subclasses can override to force the behavior
......
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