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