Utils.java revision 18d2b32423855bb9dceb044d87e5d3543c4575a0
1package com.android.settingslib;
2
3import android.content.Context;
4import android.content.Intent;
5import android.content.pm.PackageInfo;
6import android.content.pm.PackageManager;
7import android.content.pm.PackageManager.NameNotFoundException;
8import android.content.pm.UserInfo;
9import android.content.pm.Signature;
10import android.content.res.Resources;
11import android.graphics.Bitmap;
12import android.graphics.BitmapFactory;
13import android.graphics.drawable.Drawable;
14import android.net.ConnectivityManager;
15import android.os.BatteryManager;
16import android.os.UserManager;
17import com.android.internal.util.UserIcons;
18import com.android.settingslib.drawable.CircleFramedDrawable;
19
20import java.text.NumberFormat;
21
22public class Utils {
23
24    /**
25     * Return string resource that best describes combination of tethering
26     * options available on this device.
27     */
28    public static int getTetheringLabel(ConnectivityManager cm) {
29        String[] usbRegexs = cm.getTetherableUsbRegexs();
30        String[] wifiRegexs = cm.getTetherableWifiRegexs();
31        String[] bluetoothRegexs = cm.getTetherableBluetoothRegexs();
32
33        boolean usbAvailable = usbRegexs.length != 0;
34        boolean wifiAvailable = wifiRegexs.length != 0;
35        boolean bluetoothAvailable = bluetoothRegexs.length != 0;
36
37        if (wifiAvailable && usbAvailable && bluetoothAvailable) {
38            return R.string.tether_settings_title_all;
39        } else if (wifiAvailable && usbAvailable) {
40            return R.string.tether_settings_title_all;
41        } else if (wifiAvailable && bluetoothAvailable) {
42            return R.string.tether_settings_title_all;
43        } else if (wifiAvailable) {
44            return R.string.tether_settings_title_wifi;
45        } else if (usbAvailable && bluetoothAvailable) {
46            return R.string.tether_settings_title_usb_bluetooth;
47        } else if (usbAvailable) {
48            return R.string.tether_settings_title_usb;
49        } else {
50            return R.string.tether_settings_title_bluetooth;
51        }
52    }
53
54    /**
55     * Returns a label for the user, in the form of "User: user name" or "Work profile".
56     */
57    public static String getUserLabel(Context context, UserInfo info) {
58        String name = info != null ? info.name : null;
59        if (info.isManagedProfile()) {
60            // We use predefined values for managed profiles
61            return context.getString(R.string.managed_user_title);
62        } else if (info.isGuest()) {
63            name = context.getString(R.string.user_guest);
64        }
65        if (name == null && info != null) {
66            name = Integer.toString(info.id);
67        } else if (info == null) {
68            name = context.getString(R.string.unknown);
69        }
70        return context.getResources().getString(R.string.running_process_item_user_label, name);
71    }
72
73    /**
74     * Returns a circular icon for a user.
75     */
76    public static Drawable getUserIcon(Context context, UserManager um, UserInfo user) {
77        if (user.isManagedProfile()) {
78            // We use predefined values for managed profiles
79            Bitmap b = BitmapFactory.decodeResource(context.getResources(),
80                    com.android.internal.R.drawable.ic_corp_icon);
81            return CircleFramedDrawable.getInstance(context, b);
82        }
83        if (user.iconPath != null) {
84            Bitmap icon = um.getUserIcon(user.id);
85            if (icon != null) {
86                return CircleFramedDrawable.getInstance(context, icon);
87            }
88        }
89        return CircleFramedDrawable.getInstance(context, UserIcons.convertToBitmap(
90                UserIcons.getDefaultUserIcon(user.id, /* light= */ false)));
91    }
92
93    /** Formats the ratio of amount/total as a percentage. */
94    public static String formatPercentage(long amount, long total) {
95        return formatPercentage(((double) amount) / total);
96    }
97
98    /** Formats an integer from 0..100 as a percentage. */
99    public static String formatPercentage(int percentage) {
100        return formatPercentage(((double) percentage) / 100.0);
101    }
102
103    /** Formats a double from 0.0..1.0 as a percentage. */
104    private static String formatPercentage(double percentage) {
105      return NumberFormat.getPercentInstance().format(percentage);
106    }
107
108    public static int getBatteryLevel(Intent batteryChangedIntent) {
109        int level = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
110        int scale = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
111        return (level * 100) / scale;
112    }
113
114    public static String getBatteryStatus(Resources res, Intent batteryChangedIntent) {
115        return Utils.getBatteryStatus(res, batteryChangedIntent, false);
116    }
117
118    public static String getBatteryStatus(Resources res, Intent batteryChangedIntent,
119            boolean shortString) {
120        int plugType = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
121        int status = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_STATUS,
122                BatteryManager.BATTERY_STATUS_UNKNOWN);
123        String statusString;
124        if (status == BatteryManager.BATTERY_STATUS_CHARGING) {
125            int resId;
126            if (plugType == BatteryManager.BATTERY_PLUGGED_AC) {
127                resId = shortString ? R.string.battery_info_status_charging_ac_short
128                        : R.string.battery_info_status_charging_ac;
129            } else if (plugType == BatteryManager.BATTERY_PLUGGED_USB) {
130                resId = shortString ? R.string.battery_info_status_charging_usb_short
131                        : R.string.battery_info_status_charging_usb;
132            } else if (plugType == BatteryManager.BATTERY_PLUGGED_WIRELESS) {
133                resId = shortString ? R.string.battery_info_status_charging_wireless_short
134                        : R.string.battery_info_status_charging_wireless;
135            } else {
136                resId = R.string.battery_info_status_charging;
137            }
138            statusString = res.getString(resId);
139        } else if (status == BatteryManager.BATTERY_STATUS_DISCHARGING) {
140            statusString = res.getString(R.string.battery_info_status_discharging);
141        } else if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING) {
142            statusString = res.getString(R.string.battery_info_status_not_charging);
143        } else if (status == BatteryManager.BATTERY_STATUS_FULL) {
144            statusString = res.getString(R.string.battery_info_status_full);
145        } else {
146            statusString = res.getString(R.string.battery_info_status_unknown);
147        }
148
149        return statusString;
150    }
151
152    /**
153     * Determine whether a package is a "system package", in which case certain things (like
154     * disabling notifications or disabling the package altogether) should be disallowed.
155     */
156    public static boolean isSystemPackage(PackageManager pm, PackageInfo pkg) {
157        if (sSystemSignature == null) {
158            sSystemSignature = new Signature[]{ getSystemSignature(pm) };
159        }
160        if (sPermissionControllerPackageName == null) {
161            sPermissionControllerPackageName = pm.getPermissionControllerPackageName();
162        }
163        return (sSystemSignature[0] != null
164                        && sSystemSignature[0].equals(getFirstSignature(pkg)))
165                || (sPermissionControllerPackageName != null
166                        && sPermissionControllerPackageName.equals(pkg.packageName));
167    }
168
169    private static Signature[] sSystemSignature;
170    private static String sPermissionControllerPackageName;
171
172    private static Signature getFirstSignature(PackageInfo pkg) {
173        if (pkg != null && pkg.signatures != null && pkg.signatures.length > 0) {
174            return pkg.signatures[0];
175        }
176        return null;
177    }
178
179    private static Signature getSystemSignature(PackageManager pm) {
180        try {
181            final PackageInfo sys = pm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
182            return getFirstSignature(sys);
183        } catch (NameNotFoundException e) {
184        }
185        return null;
186    }
187}
188