Index: chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5da7d7dd4e1fa21cdb7de6f93ad5ca133911d693 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java |
@@ -0,0 +1,88 @@ |
+// Copyright 2011 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.util; |
+ |
+import android.annotation.SuppressLint; |
+import android.annotation.TargetApi; |
+import android.content.Context; |
+import android.content.Intent; |
+import android.content.pm.PackageManager; |
+import android.content.pm.ResolveInfo; |
+import android.os.Build; |
+import android.os.Bundle; |
+import android.os.UserManager; |
+import android.speech.RecognizerIntent; |
+ |
+import com.google.common.annotations.VisibleForTesting; |
+ |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.sync.signin.AccountManagerHelper; |
+ |
+import java.util.List; |
+ |
+/** |
+ * A utility {@code class} meant to help determine whether or not certain features are supported by |
+ * this device. |
+ */ |
+public class FeatureUtilities { |
+ private static Boolean sHasGoogleAccountAuthenticator; |
+ private static Boolean sHasRecognitionIntentHandler; |
+ |
+ /** |
+ * Determines whether or not the {@link RecognizerIntent#ACTION_WEB_SEARCH} {@link Intent} |
+ * is handled by any {@link android.app.Activity}s in the system. The result will be cached for |
+ * future calls. Passing {@code false} to {@code useCachedValue} will force it to re-query any |
+ * {@link android.app.Activity}s that can process the {@link Intent}. |
+ * @param context The {@link Context} to use to check to see if the {@link Intent} will |
+ * be handled. |
+ * @param useCachedValue Whether or not to use the cached value from a previous result. |
+ * @return {@code true} if recognition is supported. {@code false} otherwise. |
+ */ |
+ public static boolean isRecognitionIntentPresent(Context context, boolean useCachedValue) { |
+ ThreadUtils.assertOnUiThread(); |
+ if (sHasRecognitionIntentHandler == null || !useCachedValue) { |
+ PackageManager pm = context.getPackageManager(); |
+ List<ResolveInfo> activities = pm.queryIntentActivities( |
+ new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); |
+ sHasRecognitionIntentHandler = activities.size() > 0; |
+ } |
+ |
+ return sHasRecognitionIntentHandler; |
+ } |
+ |
+ /** |
+ * Determines whether or not the user has a Google account (so we can sync) or can add one. |
+ * @param context The {@link Context} that we should check accounts under. |
+ * @return Whether or not sync is allowed on this device. |
+ */ |
+ public static boolean canAllowSync(Context context) { |
+ return (hasGoogleAccountAuthenticator(context) && hasSyncPermissions(context)) || |
+ hasGoogleAccounts(context); |
+ } |
+ |
+ @VisibleForTesting |
+ static boolean hasGoogleAccountAuthenticator(Context context) { |
+ if (sHasGoogleAccountAuthenticator == null) { |
+ AccountManagerHelper accountHelper = AccountManagerHelper.get(context); |
+ sHasGoogleAccountAuthenticator = accountHelper.hasGoogleAccountAuthenticator(); |
+ } |
+ return sHasGoogleAccountAuthenticator; |
+ } |
+ |
+ @VisibleForTesting |
+ static boolean hasGoogleAccounts(Context context) { |
+ return AccountManagerHelper.get(context).hasGoogleAccounts(); |
+ } |
+ |
+ @SuppressLint("InlinedApi") |
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) |
+ private static boolean hasSyncPermissions(Context context) { |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) return true; |
+ |
+ UserManager manager = (UserManager) context.getSystemService(Context.USER_SERVICE); |
+ Bundle userRestrictions = manager.getUserRestrictions(); |
+ return !userRestrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false); |
+ } |
+} |