1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2012 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpackage org.chromium.base; 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.Context; 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.pm.ApplicationInfo; 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.pm.PackageInfo; 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.pm.PackageManager; 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.content.pm.PackageManager.NameNotFoundException; 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.os.Build; 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.os.StrictMode; 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.util.Log; 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.base.annotations.CalledByNative; 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/** 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * BuildInfo is a utility class providing easy access to {@link PackageInfo} information. This is 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * primarily of use for accessing package information from native code. 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpublic class BuildInfo { 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private static final String TAG = "BuildInfo"; 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private static final int MAX_FINGERPRINT_LENGTH = 128; 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * BuildInfo is a static utility class and therefore shouldn't be instantiated. 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private BuildInfo() {} 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getDevice() { 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.DEVICE; 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getBrand() { 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.BRAND; 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getAndroidBuildId() { 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.ID; 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * @return The build fingerprint for the current Android install. The value is truncated to a 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * 128 characters as this is used for crash and UMA reporting, which should avoid huge 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * strings. 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getAndroidBuildFingerprint() { 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.FINGERPRINT.substring( 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 0, Math.min(Build.FINGERPRINT.length(), MAX_FINGERPRINT_LENGTH)); 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getDeviceManufacturer() { 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.MANUFACTURER; 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getDeviceModel() { 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.MODEL; 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getGMSVersionCode(Context context) { 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez String msg = "gms versionCode not available."; 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez try { 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PackageManager packageManager = context.getPackageManager(); 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PackageInfo packageInfo = packageManager.getPackageInfo("com.google.android.gms", 0); 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez msg = Integer.toString(packageInfo.versionCode); 74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } catch (NameNotFoundException e) { 75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Log.d(TAG, "GMS package is not found: %s", e); 76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return msg; 78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getPackageVersionCode(Context context) { 82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez String msg = "versionCode not available."; 83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez try { 84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PackageManager pm = context.getPackageManager(); 85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); 86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez msg = ""; 87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (pi.versionCode > 0) { 88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez msg = Integer.toString(pi.versionCode); 89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } catch (NameNotFoundException e) { 91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Log.d(TAG, msg); 92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return msg; 94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getPackageVersionName(Context context) { 98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez String msg = "versionName not available"; 99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez try { 100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PackageManager pm = context.getPackageManager(); 101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); 102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez msg = ""; 103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (pi.versionName != null) { 104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez msg = pi.versionName; 105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } catch (NameNotFoundException e) { 107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Log.d(TAG, msg); 108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return msg; 110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getPackageLabel(Context context) { 114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Third-party code does disk read on the getApplicationInfo call. http://crbug.com/614343 115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); 116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez try { 117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PackageManager packageManager = context.getPackageManager(); 118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ApplicationInfo appInfo = packageManager.getApplicationInfo(context.getPackageName(), 119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PackageManager.GET_META_DATA); 120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez CharSequence label = packageManager.getApplicationLabel(appInfo); 121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return label != null ? label.toString() : ""; 122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } catch (NameNotFoundException e) { 123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return ""; 124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } finally { 125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez StrictMode.setThreadPolicy(oldPolicy); 126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getPackageName(Context context) { 131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez String packageName = context != null ? context.getPackageName() : null; 132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return packageName != null ? packageName : ""; 133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static String getBuildType() { 137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.TYPE; 138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez @CalledByNative 141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static int getSdkInt() { 142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.VERSION.SDK_INT; 143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez /** 146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * @return Whether the current build version is greater than Android N. 147645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 148645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public static boolean isGreaterThanN() { 149645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return Build.VERSION.SDK_INT > 24 || Build.VERSION.CODENAME.equals("NMR1"); 150645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 151645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 152