summaryrefslogtreecommitdiffstats
path: root/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/HardwareUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/HardwareUtils.java')
-rw-r--r--mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/HardwareUtils.java117
1 files changed, 117 insertions, 0 deletions
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/HardwareUtils.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/HardwareUtils.java
new file mode 100644
index 000000000..ba92d08cb
--- /dev/null
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/HardwareUtils.java
@@ -0,0 +1,117 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.util;
+
+import org.mozilla.gecko.AppConstants;
+import org.mozilla.gecko.SysInfo;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.util.Log;
+import android.view.ViewConfiguration;
+
+public final class HardwareUtils {
+ private static final String LOGTAG = "GeckoHardwareUtils";
+
+ private static final boolean IS_AMAZON_DEVICE = Build.MANUFACTURER.equalsIgnoreCase("Amazon");
+ public static final boolean IS_KINDLE_DEVICE = IS_AMAZON_DEVICE &&
+ (Build.MODEL.equals("Kindle Fire") ||
+ Build.MODEL.startsWith("KF"));
+
+ private static volatile boolean sInited;
+
+ // These are all set once, during init.
+ private static volatile boolean sIsLargeTablet;
+ private static volatile boolean sIsSmallTablet;
+ private static volatile boolean sIsTelevision;
+
+ private HardwareUtils() {
+ }
+
+ public static void init(Context context) {
+ if (sInited) {
+ // This is unavoidable, given that HardwareUtils is called from background services.
+ Log.d(LOGTAG, "HardwareUtils already inited.");
+ return;
+ }
+
+ // Pre-populate common flags from the context.
+ final int screenLayoutSize = context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
+ if (Build.VERSION.SDK_INT >= 11) {
+ if (screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
+ sIsLargeTablet = true;
+ } else if (screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_LARGE) {
+ sIsSmallTablet = true;
+ }
+ if (Build.VERSION.SDK_INT >= 16) {
+ if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION)) {
+ sIsTelevision = true;
+ }
+ }
+ }
+
+ sInited = true;
+ }
+
+ public static boolean isTablet() {
+ return sIsLargeTablet || sIsSmallTablet;
+ }
+
+ public static boolean isLargeTablet() {
+ return sIsLargeTablet;
+ }
+
+ public static boolean isSmallTablet() {
+ return sIsSmallTablet;
+ }
+
+ public static boolean isTelevision() {
+ return sIsTelevision;
+ }
+
+ public static int getMemSize() {
+ return SysInfo.getMemSize();
+ }
+
+ public static boolean isARMSystem() {
+ return Build.CPU_ABI != null && Build.CPU_ABI.equals("armeabi-v7a");
+ }
+
+ public static boolean isX86System() {
+ return Build.CPU_ABI != null && Build.CPU_ABI.equals("x86");
+ }
+
+ /**
+ * @return false if the current system is not supported (e.g. APK/system ABI mismatch).
+ */
+ public static boolean isSupportedSystem() {
+ if (Build.VERSION.SDK_INT < AppConstants.Versions.MIN_SDK_VERSION ||
+ Build.VERSION.SDK_INT > AppConstants.Versions.MAX_SDK_VERSION) {
+ return false;
+ }
+
+ // See http://developer.android.com/ndk/guides/abis.html
+ final boolean isSystemARM = isARMSystem();
+ final boolean isSystemX86 = isX86System();
+
+ final boolean isAppARM = AppConstants.ANDROID_CPU_ARCH.startsWith("armeabi-v7a");
+ final boolean isAppX86 = AppConstants.ANDROID_CPU_ARCH.startsWith("x86");
+
+ // Only reject known incompatible ABIs. Better safe than sorry.
+ if ((isSystemX86 && isAppARM) || (isSystemARM && isAppX86)) {
+ return false;
+ }
+
+ if ((isSystemX86 && isAppX86) || (isSystemARM && isAppARM)) {
+ return true;
+ }
+
+ Log.w(LOGTAG, "Unknown app/system ABI combination: " + AppConstants.MOZ_APP_ABI + " / " + Build.CPU_ABI);
+ return true;
+ }
+}