130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liupackage com.android.settingslib;
230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
35c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sappersteinimport android.annotation.ColorInt;
430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.content.Context;
5c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monkimport android.content.Intent;
621c30548ba11c40fe71df375911dad2e0316ad19Julia Reynoldsimport android.content.pm.PackageInfo;
721c30548ba11c40fe71df375911dad2e0316ad19Julia Reynoldsimport android.content.pm.PackageManager;
821c30548ba11c40fe71df375911dad2e0316ad19Julia Reynoldsimport android.content.pm.PackageManager.NameNotFoundException;
921c30548ba11c40fe71df375911dad2e0316ad19Julia Reynoldsimport android.content.pm.Signature;
1073b161ddc123544174cbec5254b3cd77e5d34c18Fan Zhangimport android.content.pm.UserInfo;
11b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyuleiimport android.content.res.ColorStateList;
12c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monkimport android.content.res.Resources;
135c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sappersteinimport android.content.res.TypedArray;
1430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.Bitmap;
1530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.BitmapFactory;
163250885c9feb9b42d60058a823c57a027c0dcf58Jason Monkimport android.graphics.Color;
1730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.graphics.drawable.Drawable;
18f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghumanimport android.graphics.drawable.LayerDrawable;
1930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.net.ConnectivityManager;
20699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghumanimport android.net.NetworkBadging;
21c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monkimport android.os.BatteryManager;
2230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport android.os.UserManager;
23545a58ab6b15596c6c1fdad523459889322f3b61Philip P. Moltmannimport android.print.PrintManager;
24d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghumanimport android.view.View;
25d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman
2630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liuimport com.android.internal.util.UserIcons;
27aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Roskyimport com.android.settingslib.drawable.UserIconDrawable;
2830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
29c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monkimport java.text.NumberFormat;
30c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk
31c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monkpublic class Utils {
32a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov    private static Signature[] sSystemSignature;
33a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov    private static String sPermissionControllerPackageName;
34a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov    private static String sServicesSystemSharedLibPackageName;
35a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov    private static String sSharedSystemSharedLibPackageName;
3630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
37d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman    public static final int[] WIFI_PIE_FOR_BADGING = {
38f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman          com.android.internal.R.drawable.ic_signal_wifi_badged_0_bars,
39f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman          com.android.internal.R.drawable.ic_signal_wifi_badged_1_bar,
40f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman          com.android.internal.R.drawable.ic_signal_wifi_badged_2_bars,
41f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman          com.android.internal.R.drawable.ic_signal_wifi_badged_3_bars,
42f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman          com.android.internal.R.drawable.ic_signal_wifi_badged_4_bars
43f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman    };
44f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman
4530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    /**
4630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu     * Return string resource that best describes combination of tethering
4730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu     * options available on this device.
4830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu     */
4930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public static int getTetheringLabel(ConnectivityManager cm) {
5030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        String[] usbRegexs = cm.getTetherableUsbRegexs();
5130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        String[] wifiRegexs = cm.getTetherableWifiRegexs();
5230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        String[] bluetoothRegexs = cm.getTetherableBluetoothRegexs();
5330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
5430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        boolean usbAvailable = usbRegexs.length != 0;
5530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        boolean wifiAvailable = wifiRegexs.length != 0;
5630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        boolean bluetoothAvailable = bluetoothRegexs.length != 0;
5730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
5830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        if (wifiAvailable && usbAvailable && bluetoothAvailable) {
5930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            return R.string.tether_settings_title_all;
6030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        } else if (wifiAvailable && usbAvailable) {
6130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            return R.string.tether_settings_title_all;
6230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        } else if (wifiAvailable && bluetoothAvailable) {
6330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            return R.string.tether_settings_title_all;
6430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        } else if (wifiAvailable) {
6530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            return R.string.tether_settings_title_wifi;
6630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        } else if (usbAvailable && bluetoothAvailable) {
6730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            return R.string.tether_settings_title_usb_bluetooth;
6830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        } else if (usbAvailable) {
6930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            return R.string.tether_settings_title_usb;
7030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        } else {
7130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            return R.string.tether_settings_title_bluetooth;
7230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        }
7330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
7430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
7530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    /**
7630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu     * Returns a label for the user, in the form of "User: user name" or "Work profile".
7730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu     */
7830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    public static String getUserLabel(Context context, UserInfo info) {
7930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        String name = info != null ? info.name : null;
8030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        if (info.isManagedProfile()) {
8130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            // We use predefined values for managed profiles
8230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            return context.getString(R.string.managed_user_title);
8330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        } else if (info.isGuest()) {
8430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            name = context.getString(R.string.user_guest);
8530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        }
8630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        if (name == null && info != null) {
8730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            name = Integer.toString(info.id);
8830275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        } else if (info == null) {
8930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            name = context.getString(R.string.unknown);
9030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        }
9130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        return context.getResources().getString(R.string.running_process_item_user_label, name);
9230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
9330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu
9430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    /**
9530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu     * Returns a circular icon for a user.
9630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu     */
97aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky    public static UserIconDrawable getUserIcon(Context context, UserManager um, UserInfo user) {
98aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky        final int iconSize = UserIconDrawable.getSizeForList(context);
9930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        if (user.isManagedProfile()) {
10030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            // We use predefined values for managed profiles
10130275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            Bitmap b = BitmapFactory.decodeResource(context.getResources(),
10230275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu                    com.android.internal.R.drawable.ic_corp_icon);
103aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky            return new UserIconDrawable(iconSize).setIcon(b).bake();
10430275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        }
10530275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        if (user.iconPath != null) {
10630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            Bitmap icon = um.getUserIcon(user.id);
10730275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            if (icon != null) {
108aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky                return new UserIconDrawable(iconSize).setIcon(icon).bake();
10930275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu            }
11030275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu        }
111aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky        return new UserIconDrawable(iconSize).setIconDrawable(
112aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky                UserIcons.getDefaultUserIcon(user.id, /* light= */ false)).bake();
11330275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu    }
114c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk
1155dc1f365994375c97340c89eee68616c40457623jackqdyulei    /** Formats a double from 0.0..100.0 with an option to round **/
1165dc1f365994375c97340c89eee68616c40457623jackqdyulei    public static String formatPercentage(double percentage, boolean round) {
1175dc1f365994375c97340c89eee68616c40457623jackqdyulei        final int localPercentage = round ? Math.round((float) percentage) : (int) percentage;
1185dc1f365994375c97340c89eee68616c40457623jackqdyulei        return formatPercentage(localPercentage);
1195dc1f365994375c97340c89eee68616c40457623jackqdyulei    }
1205dc1f365994375c97340c89eee68616c40457623jackqdyulei
121c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    /** Formats the ratio of amount/total as a percentage. */
122c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    public static String formatPercentage(long amount, long total) {
123c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        return formatPercentage(((double) amount) / total);
124c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    }
125c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk
126c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    /** Formats an integer from 0..100 as a percentage. */
127c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    public static String formatPercentage(int percentage) {
128c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        return formatPercentage(((double) percentage) / 100.0);
129c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    }
130c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk
131c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    /** Formats a double from 0.0..1.0 as a percentage. */
132c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    private static String formatPercentage(double percentage) {
1335dc1f365994375c97340c89eee68616c40457623jackqdyulei        return NumberFormat.getPercentInstance().format(percentage);
134c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    }
135c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk
136c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    public static int getBatteryLevel(Intent batteryChangedIntent) {
137c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        int level = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
138c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        int scale = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
139c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        return (level * 100) / scale;
140c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    }
141c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk
142c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    public static String getBatteryStatus(Resources res, Intent batteryChangedIntent) {
14318d2b32423855bb9dceb044d87e5d3543c4575a0Muyuan Li        int status = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_STATUS,
144c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk                BatteryManager.BATTERY_STATUS_UNKNOWN);
145c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        String statusString;
146c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        if (status == BatteryManager.BATTERY_STATUS_CHARGING) {
147806f78d9887d2b41939735997a526d7d3a8a9ed5jackqdyulei            statusString = res.getString(R.string.battery_info_status_charging);
148c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        } else if (status == BatteryManager.BATTERY_STATUS_DISCHARGING) {
149c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk            statusString = res.getString(R.string.battery_info_status_discharging);
150c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        } else if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING) {
151c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk            statusString = res.getString(R.string.battery_info_status_not_charging);
152c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        } else if (status == BatteryManager.BATTERY_STATUS_FULL) {
153c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk            statusString = res.getString(R.string.battery_info_status_full);
154c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        } else {
155c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk            statusString = res.getString(R.string.battery_info_status_unknown);
156c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        }
157c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk
158c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk        return statusString;
159c06fbb12984a3d3e4c80ab9f819841acae5b0133Jason Monk    }
16021c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds
1615c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein    @ColorInt
1625c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein    public static int getColorAccent(Context context) {
1633250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        return getColorAttr(context, android.R.attr.colorAccent);
1645c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein    }
1655c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein
166b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei    @ColorInt
167b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei    public static int getColorError(Context context) {
16858be7a675b7aa505255f0c91fee755f8290e8363Jason Monk        return getColorAttr(context, android.R.attr.colorError);
169b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei    }
170b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei
171b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei    @ColorInt
172b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei    public static int getDefaultColor(Context context, int resId) {
173b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei        final ColorStateList list =
174b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei                context.getResources().getColorStateList(resId, context.getTheme());
175b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei
176b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei        return list.getDefaultColor();
177b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei    }
178b68fd7ae0a395f00c7f280e8040382639eaa69f9jackqdyulei
1793250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    @ColorInt
1803250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    public static int getDisabled(Context context, int inputColor) {
1813250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        return applyAlphaAttr(context, android.R.attr.disabledAlpha, inputColor);
1823250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    }
1833250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk
1843250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    @ColorInt
1853250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    public static int applyAlphaAttr(Context context, int attr, int inputColor) {
1863250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
1873250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        float alpha = ta.getFloat(0, 0);
1883250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        ta.recycle();
189824ffffcc41ae9dcdcc8cb344a95a0fd8487e3e0Jason Monk        return applyAlpha(alpha, inputColor);
190824ffffcc41ae9dcdcc8cb344a95a0fd8487e3e0Jason Monk    }
191824ffffcc41ae9dcdcc8cb344a95a0fd8487e3e0Jason Monk
192824ffffcc41ae9dcdcc8cb344a95a0fd8487e3e0Jason Monk    @ColorInt
193824ffffcc41ae9dcdcc8cb344a95a0fd8487e3e0Jason Monk    public static int applyAlpha(float alpha, int inputColor) {
1943250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        alpha *= Color.alpha(inputColor);
1953250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        return Color.argb((int) (alpha), Color.red(inputColor), Color.green(inputColor),
1963250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk                Color.blue(inputColor));
1973250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    }
1983250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk
1993250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    @ColorInt
2003250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    public static int getColorAttr(Context context, int attr) {
2013250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
2023250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        @ColorInt int colorAccent = ta.getColor(0, 0);
2033250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        ta.recycle();
2043250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        return colorAccent;
2053250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    }
2063250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk
2079a376bcd4576029a8d0ad03254a6240cd1422c2eJason Monk    public static int getThemeAttr(Context context, int attr) {
2089a376bcd4576029a8d0ad03254a6240cd1422c2eJason Monk        TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
2099a376bcd4576029a8d0ad03254a6240cd1422c2eJason Monk        int theme = ta.getResourceId(0, 0);
2109a376bcd4576029a8d0ad03254a6240cd1422c2eJason Monk        ta.recycle();
2119a376bcd4576029a8d0ad03254a6240cd1422c2eJason Monk        return theme;
2129a376bcd4576029a8d0ad03254a6240cd1422c2eJason Monk    }
2139a376bcd4576029a8d0ad03254a6240cd1422c2eJason Monk
214790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    public static Drawable getDrawable(Context context, int attr) {
215790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
216790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        Drawable drawable = ta.getDrawable(0);
217790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        ta.recycle();
218790442e4cd8106cf2c69d23ff185953b620b087aJason Monk        return drawable;
219790442e4cd8106cf2c69d23ff185953b620b087aJason Monk    }
220790442e4cd8106cf2c69d23ff185953b620b087aJason Monk
22121c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds    /**
22221c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds     * Determine whether a package is a "system package", in which case certain things (like
22321c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds     * disabling notifications or disabling the package altogether) should be disallowed.
22421c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds     */
225bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak    public static boolean isSystemPackage(Resources resources, PackageManager pm, PackageInfo pkg) {
22621c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        if (sSystemSignature == null) {
22721c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds            sSystemSignature = new Signature[]{ getSystemSignature(pm) };
22821c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        }
22981fb0d4acdc93c9bfb77972a7610b12acb949aa2Svet Ganov        if (sPermissionControllerPackageName == null) {
23081fb0d4acdc93c9bfb77972a7610b12acb949aa2Svet Ganov            sPermissionControllerPackageName = pm.getPermissionControllerPackageName();
23181fb0d4acdc93c9bfb77972a7610b12acb949aa2Svet Ganov        }
232a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov        if (sServicesSystemSharedLibPackageName == null) {
233a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov            sServicesSystemSharedLibPackageName = pm.getServicesSystemSharedLibraryPackageName();
234a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov        }
235a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov        if (sSharedSystemSharedLibPackageName == null) {
236a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov            sSharedSystemSharedLibPackageName = pm.getSharedSystemSharedLibraryPackageName();
237a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov        }
23881fb0d4acdc93c9bfb77972a7610b12acb949aa2Svet Ganov        return (sSystemSignature[0] != null
23981fb0d4acdc93c9bfb77972a7610b12acb949aa2Svet Ganov                        && sSystemSignature[0].equals(getFirstSignature(pkg)))
240a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov                || pkg.packageName.equals(sPermissionControllerPackageName)
241a9c2500a6863dabdd786f17a25ce0bf3683109a2Svetoslav Ganov                || pkg.packageName.equals(sServicesSystemSharedLibPackageName)
242545a58ab6b15596c6c1fdad523459889322f3b61Philip P. Moltmann                || pkg.packageName.equals(sSharedSystemSharedLibPackageName)
243bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak                || pkg.packageName.equals(PrintManager.PRINT_SPOOLER_PACKAGE_NAME)
244bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak                || isDeviceProvisioningPackage(resources, pkg.packageName);
24521c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds    }
24621c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds
24721c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds    private static Signature getFirstSignature(PackageInfo pkg) {
24821c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        if (pkg != null && pkg.signatures != null && pkg.signatures.length > 0) {
24921c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds            return pkg.signatures[0];
25021c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        }
25121c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        return null;
25221c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds    }
25321c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds
25421c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds    private static Signature getSystemSignature(PackageManager pm) {
25521c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        try {
25621c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds            final PackageInfo sys = pm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
25721c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds            return getFirstSignature(sys);
25821c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        } catch (NameNotFoundException e) {
25921c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        }
26021c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds        return null;
26121c30548ba11c40fe71df375911dad2e0316ad19Julia Reynolds    }
262bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak
263bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak    /**
264bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak     * Returns {@code true} if the supplied package is the device provisioning app. Otherwise,
265bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak     * returns {@code false}.
266bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak     */
267bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak    public static boolean isDeviceProvisioningPackage(Resources resources, String packageName) {
268bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak        String deviceProvisioningPackage = resources.getString(
269bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak                com.android.internal.R.string.config_deviceProvisioningPackage);
270bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak        return deviceProvisioningPackage != null && deviceProvisioningPackage.equals(packageName);
271bfba9d485eb54e896bfd0234647e0020401c1491Tony Mak    }
272f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman
273f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman    /**
274f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     * Returns a badged Wifi icon drawable.
275f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     *
276f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     * <p>The first layer contains the Wifi pie and the second layer contains the badge. Callers
277f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     * should set the drawable to the appropriate size and tint color.
278f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     *
279f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     * @param context The caller's context (must have access to internal resources)
280f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     * @param level The number of bars to show (0-4)
281f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     * @param badge The badge enum {@see android.net.ScoredNetwork}
282f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     *
283f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     * @throws IllegalArgumentException if an invalid badge enum is given
284f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     *
285f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     * @deprecated TODO(sghuman): Finalize the form of this method and then move it to a new
286f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     *         location.
287f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman     */
288f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman    public static LayerDrawable getBadgedWifiIcon(Context context, int level, int badge) {
289f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman        return new LayerDrawable(
290f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                new Drawable[] {
291f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                        context.getDrawable(WIFI_PIE_FOR_BADGING[level]),
292f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                        context.getDrawable(getWifiBadgeResource(badge))
293f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                });
294f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman    }
295f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman
296d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman    /**
297d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman     * Returns the resource id for the given badge or {@link View.NO_ID} if no badge is to be shown.
298d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman     *
299d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman     * @throws IllegalArgumentException if the given badge value is not supported.
300d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman     */
301d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman    public static int getWifiBadgeResource(int badge) {
302f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman        switch (badge) {
303699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman            case NetworkBadging.BADGING_NONE:
304d57f3247766d7e5f2a5c2cbe7be6d241526a9ebaSundeep Ghuman                return View.NO_ID;
305699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman            case NetworkBadging.BADGING_SD:
306f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                return com.android.internal.R.drawable.ic_signal_wifi_badged_sd;
307699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman            case NetworkBadging.BADGING_HD:
308f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                return com.android.internal.R.drawable.ic_signal_wifi_badged_hd;
309699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman            case NetworkBadging.BADGING_4K:
310f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                return com.android.internal.R.drawable.ic_signal_wifi_badged_4k;
311f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman            default:
312f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                throw new IllegalArgumentException(
313f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman                    "No badge resource found for badge value: " + badge);
314f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman        }
315f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman    }
31630275c1924b2bd45b05bd9c98f8648ecbc71374fWei Liu}
317