Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAState.java

Issue 1141283003: Upstream oodles of Chrome for Android code into Chromium. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: final patch? Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAState.java
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAState.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAState.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7b483e93bde906961d856d4e4d3dfdd27d21f3c
--- /dev/null
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAState.java
@@ -0,0 +1,126 @@
+// 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.gsa;
+
+import android.accounts.Account;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.text.TextUtils;
+
+import org.chromium.base.PackageUtils;
+import org.chromium.sync.signin.ChromeSigninController;
+
+/**
+ * A class responsible fore representing the current state of Chrome's integration with GSA.
+ */
+public class GSAState {
+ private static final int GSA_VERSION_FOR_DOCUMENT = 300401021;
+ private static final int GMS_CORE_VERSION = 6577010;
+
+ static final String SEARCH_INTENT_PACKAGE = "com.google.android.googlequicksearchbox";
+ private static final String GMS_CORE_PACKAGE = "com.google.android.gms";
+
+ static final String SEARCH_INTENT_ACTION =
+ "com.google.android.googlequicksearchbox.TEXT_ASSIST";
+
+ /**
+ * An instance of GSAState class encapsulating knowledge about the current status.
+ */
+ private static GSAState sGSAState;
+
+ /**
+ * The application context to use.
+ */
+ private final Context mContext;
+
+ /**
+ * Caches the result of a computation on whether GSA is available.
+ */
+ private Boolean mGsaAvailable;
+
+ /**
+ * The Google account being used by GSA according to the latest update we have received.
+ * This may be null.
+ */
+ private String mGsaAccount;
+
+ /**
+ * Returns the singleton instance of GSAState and creates one if necessary.
+ * @param context The context to use.
+ * @return The state object.
+ */
+ public static GSAState getInstance(Context context) {
+ if (sGSAState == null) {
+ sGSAState = new GSAState(context);
+ }
+ return sGSAState;
+ }
+
+ /* Private constructor, since this is a singleton */
+ private GSAState(Context context) {
+ mContext = context.getApplicationContext();
+ }
+
+ /**
+ * Update the GSA logged in account name and whether we are in GSA holdback.
+ * @param gsaAccount The email address of the logged in account.
+ */
+ public void setGsaAccount(String gsaAccount) {
+ mGsaAccount = gsaAccount;
+ }
+
+ /**
+ * @return Whether GSA and Chrome are logged in with the same account. The situation where
+ * both are logged out is not considered a match.
+ */
+ public boolean doesGsaAccountMatchChrome() {
+ Account chromeUser = ChromeSigninController.get(mContext).getSignedInUser();
+ return chromeUser != null && !TextUtils.isEmpty(mGsaAccount) && TextUtils.equals(
+ chromeUser.name, mGsaAccount);
+ }
+
+ /**
+ * @return The current GSA account. May return null if GSA hasn't replied yet.
+ */
+ public String getGsaAccount() {
+ return mGsaAccount;
+ }
+
+ /**
+ * This is used to check whether GSA package is available to handle search requests and if
+ * the Chrome experiment to do so is enabled.
+ * @return Whether the search intent this class creates will resolve to an activity.
+ */
+ public boolean isGsaAvailable() {
+ if (mGsaAvailable != null) return mGsaAvailable;
+ mGsaAvailable = false;
+ PackageManager pm = mContext.getPackageManager();
+ Intent searchIntent = new Intent(SEARCH_INTENT_ACTION);
+ searchIntent.setPackage(GSAState.SEARCH_INTENT_PACKAGE);
+ ResolveInfo resolveInfo = pm.resolveActivity(searchIntent, 0);
+ if (resolveInfo == null || resolveInfo.activityInfo == null) {
+ mGsaAvailable = false;
+ } else if (!isPackageAboveVersion(SEARCH_INTENT_PACKAGE, GSA_VERSION_FOR_DOCUMENT)
+ || !isPackageAboveVersion(GMS_CORE_PACKAGE, GMS_CORE_VERSION)) {
+ mGsaAvailable = false;
+ } else {
+ mGsaAvailable = true;
+ }
+ return mGsaAvailable;
+ }
+
+ /**
+ * Check whether the given package meets min requirements for using full document mode.
+ * @param packageName The package name we are inquiring about.
+ * @param minVersion The minimum version for the package to be.
+ * @return Whether the package exists on the device and its version is higher than the minimum
+ * required version.
+ */
+ private boolean isPackageAboveVersion(String packageName, int minVersion) {
+ return PackageUtils.getPackageVersion(mContext, packageName) >= minVersion;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698