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; |
+ } |
+} |