Merge "Multi-user battery settings." into jb-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b6d7c9c6f9
@@ -3235,6 +3235,9 @@
|
|||||||
<!-- Suggestion for getting apps to consume less power -->
|
<!-- Suggestion for getting apps to consume less power -->
|
||||||
<string name="battery_sugg_apps_settings">The app may offer settings to reduce battery use</string>
|
<string name="battery_sugg_apps_settings">The app may offer settings to reduce battery use</string>
|
||||||
|
|
||||||
|
<!-- [CHAR LIMIT=50] Description for power consumed by users -->
|
||||||
|
<string name="battery_desc_users">Battery used by user</string>
|
||||||
|
|
||||||
<!-- Menu label for viewing battery usage since unplugged -->
|
<!-- Menu label for viewing battery usage since unplugged -->
|
||||||
<string name="menu_stats_unplugged"><xliff:g id="unplugged">%1$s</xliff:g> since unplugged</string>
|
<string name="menu_stats_unplugged"><xliff:g id="unplugged">%1$s</xliff:g> since unplugged</string>
|
||||||
<!-- Menu label for viewing battery usage since unplugged -->
|
<!-- Menu label for viewing battery usage since unplugged -->
|
||||||
|
@@ -105,6 +105,7 @@ public class Settings extends PreferenceActivity
|
|||||||
R.id.display_settings,
|
R.id.display_settings,
|
||||||
R.id.storage_settings,
|
R.id.storage_settings,
|
||||||
R.id.application_settings,
|
R.id.application_settings,
|
||||||
|
R.id.battery_settings,
|
||||||
R.id.personal_section,
|
R.id.personal_section,
|
||||||
R.id.security_settings,
|
R.id.security_settings,
|
||||||
R.id.user_settings,
|
R.id.user_settings,
|
||||||
|
@@ -107,7 +107,6 @@ class BatterySipper implements Comparable<BatterySipper> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PackageManager pm = mContext.getPackageManager();
|
PackageManager pm = mContext.getPackageManager();
|
||||||
final Drawable defaultActivityIcon = pm.getDefaultActivityIcon();
|
|
||||||
String[] packages = pm.getPackagesForUid(uid);
|
String[] packages = pm.getPackagesForUid(uid);
|
||||||
icon = pm.getDefaultActivityIcon();
|
icon = pm.getDefaultActivityIcon();
|
||||||
if (packages == null) {
|
if (packages == null) {
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
package com.android.settings.fuelgauge;
|
package com.android.settings.fuelgauge;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -37,7 +38,7 @@ public class PowerGaugePreference extends Preference {
|
|||||||
public PowerGaugePreference(Context context, Drawable icon, BatterySipper info) {
|
public PowerGaugePreference(Context context, Drawable icon, BatterySipper info) {
|
||||||
super(context);
|
super(context);
|
||||||
setLayoutResource(R.layout.app_percentage_item);
|
setLayoutResource(R.layout.app_percentage_item);
|
||||||
setIcon(icon);
|
setIcon(icon != null ? icon : new ColorDrawable(0));
|
||||||
mInfo = info;
|
mInfo = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -62,7 +62,8 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
|
|||||||
WIFI,
|
WIFI,
|
||||||
BLUETOOTH,
|
BLUETOOTH,
|
||||||
SCREEN,
|
SCREEN,
|
||||||
APP
|
APP,
|
||||||
|
USER
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: Must match the sequence of the DrainType
|
// Note: Must match the sequence of the DrainType
|
||||||
@@ -73,7 +74,8 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
|
|||||||
R.string.battery_desc_wifi,
|
R.string.battery_desc_wifi,
|
||||||
R.string.battery_desc_bluetooth,
|
R.string.battery_desc_bluetooth,
|
||||||
R.string.battery_desc_display,
|
R.string.battery_desc_display,
|
||||||
R.string.battery_desc_apps
|
R.string.battery_desc_apps,
|
||||||
|
R.string.battery_desc_users,
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final int ACTION_DISPLAY_SETTINGS = 1;
|
public static final int ACTION_DISPLAY_SETTINGS = 1;
|
||||||
|
@@ -20,6 +20,8 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
|
import android.content.pm.UserInfo;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.hardware.SensorManager;
|
import android.hardware.SensorManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
@@ -32,6 +34,8 @@ import android.os.Process;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
import android.os.UserHandle;
|
||||||
|
import android.os.UserManager;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
@@ -79,10 +83,14 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
private static BatteryStatsImpl sStatsXfer;
|
private static BatteryStatsImpl sStatsXfer;
|
||||||
|
|
||||||
IBatteryStats mBatteryInfo;
|
IBatteryStats mBatteryInfo;
|
||||||
|
UserManager mUm;
|
||||||
BatteryStatsImpl mStats;
|
BatteryStatsImpl mStats;
|
||||||
private final List<BatterySipper> mUsageList = new ArrayList<BatterySipper>();
|
private final List<BatterySipper> mUsageList = new ArrayList<BatterySipper>();
|
||||||
private final List<BatterySipper> mWifiSippers = new ArrayList<BatterySipper>();
|
private final List<BatterySipper> mWifiSippers = new ArrayList<BatterySipper>();
|
||||||
private final List<BatterySipper> mBluetoothSippers = new ArrayList<BatterySipper>();
|
private final List<BatterySipper> mBluetoothSippers = new ArrayList<BatterySipper>();
|
||||||
|
private final SparseArray<List<BatterySipper>> mUserSippers
|
||||||
|
= new SparseArray<List<BatterySipper>>();
|
||||||
|
private final SparseArray<Double> mUserPower = new SparseArray<Double>();
|
||||||
|
|
||||||
private PreferenceGroup mAppListGroup;
|
private PreferenceGroup mAppListGroup;
|
||||||
private Preference mBatteryStatusPref;
|
private Preference mBatteryStatusPref;
|
||||||
@@ -134,6 +142,7 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
addPreferencesFromResource(R.xml.power_usage_summary);
|
addPreferencesFromResource(R.xml.power_usage_summary);
|
||||||
mBatteryInfo = IBatteryStats.Stub.asInterface(
|
mBatteryInfo = IBatteryStats.Stub.asInterface(
|
||||||
ServiceManager.getService("batteryinfo"));
|
ServiceManager.getService("batteryinfo"));
|
||||||
|
mUm = (UserManager)getActivity().getSystemService(Context.USER_SERVICE);
|
||||||
mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST);
|
mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST);
|
||||||
mBatteryStatusPref = mAppListGroup.findPreference(KEY_BATTERY_STATUS);
|
mBatteryStatusPref = mAppListGroup.findPreference(KEY_BATTERY_STATUS);
|
||||||
mPowerProfile = new PowerProfile(getActivity());
|
mPowerProfile = new PowerProfile(getActivity());
|
||||||
@@ -204,6 +213,7 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
double[] values;
|
double[] values;
|
||||||
switch (sipper.drainType) {
|
switch (sipper.drainType) {
|
||||||
case APP:
|
case APP:
|
||||||
|
case USER:
|
||||||
{
|
{
|
||||||
Uid uid = sipper.uidObj;
|
Uid uid = sipper.uidObj;
|
||||||
types = new int[] {
|
types = new int[] {
|
||||||
@@ -229,6 +239,7 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (sipper.drainType == DrainType.APP) {
|
||||||
Writer result = new StringWriter();
|
Writer result = new StringWriter();
|
||||||
PrintWriter printWriter = new PrintWriter(result);
|
PrintWriter printWriter = new PrintWriter(result);
|
||||||
mStats.dumpLocked(printWriter, "", mStatsType, uid.getUid());
|
mStats.dumpLocked(printWriter, "", mStatsType, uid.getUid());
|
||||||
@@ -237,7 +248,9 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
result = new StringWriter();
|
result = new StringWriter();
|
||||||
printWriter = new PrintWriter(result);
|
printWriter = new PrintWriter(result);
|
||||||
mStats.dumpCheckinLocked(printWriter, mStatsType, uid.getUid());
|
mStats.dumpCheckinLocked(printWriter, mStatsType, uid.getUid());
|
||||||
args.putString(PowerUsageDetail.EXTRA_REPORT_CHECKIN_DETAILS, result.toString());
|
args.putString(PowerUsageDetail.EXTRA_REPORT_CHECKIN_DETAILS,
|
||||||
|
result.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CELL:
|
case CELL:
|
||||||
@@ -373,6 +386,8 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
mUsageList.clear();
|
mUsageList.clear();
|
||||||
mWifiSippers.clear();
|
mWifiSippers.clear();
|
||||||
mBluetoothSippers.clear();
|
mBluetoothSippers.clear();
|
||||||
|
mUserSippers.clear();
|
||||||
|
mUserPower.clear();
|
||||||
mAppListGroup.setOrderingAsAdded(false);
|
mAppListGroup.setOrderingAsAdded(false);
|
||||||
|
|
||||||
mBatteryStatusPref.setOrder(-2);
|
mBatteryStatusPref.setOrder(-2);
|
||||||
@@ -570,6 +585,8 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
if (DEBUG) Log.i(TAG, String.format("UID %d total power=%.2f", u.getUid(), power));
|
if (DEBUG) Log.i(TAG, String.format("UID %d total power=%.2f", u.getUid(), power));
|
||||||
|
|
||||||
// Add the app to the list if it is consuming power
|
// Add the app to the list if it is consuming power
|
||||||
|
boolean isOtherUser = false;
|
||||||
|
final int userId = UserHandle.getUserId(u.getUid());
|
||||||
if (power != 0 || u.getUid() == 0) {
|
if (power != 0 || u.getUid() == 0) {
|
||||||
BatterySipper app = new BatterySipper(getActivity(), mRequestQueue, mHandler,
|
BatterySipper app = new BatterySipper(getActivity(), mRequestQueue, mHandler,
|
||||||
packageWithHighestDrain, DrainType.APP, 0, u,
|
packageWithHighestDrain, DrainType.APP, 0, u,
|
||||||
@@ -585,6 +602,15 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
mWifiSippers.add(app);
|
mWifiSippers.add(app);
|
||||||
} else if (u.getUid() == Process.BLUETOOTH_GID) {
|
} else if (u.getUid() == Process.BLUETOOTH_GID) {
|
||||||
mBluetoothSippers.add(app);
|
mBluetoothSippers.add(app);
|
||||||
|
} else if (userId != UserHandle.myUserId()
|
||||||
|
&& UserHandle.getAppId(u.getUid()) >= Process.FIRST_APPLICATION_UID) {
|
||||||
|
isOtherUser = true;
|
||||||
|
List<BatterySipper> list = mUserSippers.get(userId);
|
||||||
|
if (list == null) {
|
||||||
|
list = new ArrayList<BatterySipper>();
|
||||||
|
mUserSippers.put(userId, list);
|
||||||
|
}
|
||||||
|
list.add(app);
|
||||||
} else {
|
} else {
|
||||||
mUsageList.add(app);
|
mUsageList.add(app);
|
||||||
}
|
}
|
||||||
@@ -592,15 +618,25 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
osApp = app;
|
osApp = app;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (power != 0) {
|
||||||
if (u.getUid() == Process.WIFI_UID) {
|
if (u.getUid() == Process.WIFI_UID) {
|
||||||
mWifiPower += power;
|
mWifiPower += power;
|
||||||
} else if (u.getUid() == Process.BLUETOOTH_GID) {
|
} else if (u.getUid() == Process.BLUETOOTH_GID) {
|
||||||
mBluetoothPower += power;
|
mBluetoothPower += power;
|
||||||
|
} else if (isOtherUser) {
|
||||||
|
Double userPower = mUserPower.get(userId);
|
||||||
|
if (userPower == null) {
|
||||||
|
userPower = power;
|
||||||
|
} else {
|
||||||
|
userPower += power;
|
||||||
|
}
|
||||||
|
mUserPower.put(userId, userPower);
|
||||||
} else {
|
} else {
|
||||||
if (power > mMaxPower) mMaxPower = power;
|
if (power > mMaxPower) mMaxPower = power;
|
||||||
mTotalPower += power;
|
mTotalPower += power;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// The device has probably been awake for longer than the screen on
|
// The device has probably been awake for longer than the screen on
|
||||||
// time and application wake lock time would account for. Assign
|
// time and application wake lock time would account for. Assign
|
||||||
@@ -725,6 +761,32 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
aggregateSippers(bs, mBluetoothSippers, "Bluetooth");
|
aggregateSippers(bs, mBluetoothSippers, "Bluetooth");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addUserUsage() {
|
||||||
|
for (int i=0; i<mUserSippers.size(); i++) {
|
||||||
|
final int userId = mUserSippers.keyAt(i);
|
||||||
|
final List<BatterySipper> sippers = mUserSippers.valueAt(i);
|
||||||
|
UserInfo info = mUm.getUserInfo(userId);
|
||||||
|
Drawable icon = null;
|
||||||
|
if (info != null && info.iconPath != null) {
|
||||||
|
try {
|
||||||
|
icon = Drawable.createFromPath(info.iconPath);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.w(TAG, "Failure loading user picture " + info.iconPath, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String name = info != null ? info.name : null;
|
||||||
|
if (name == null) {
|
||||||
|
name = Integer.toString(info.id);
|
||||||
|
}
|
||||||
|
double power = mUserPower.get(userId);
|
||||||
|
String label = getActivity().getResources().getString(
|
||||||
|
R.string.running_process_item_user_label, name);
|
||||||
|
BatterySipper bs = addEntry(label, DrainType.USER, 0, 0, power);
|
||||||
|
bs.icon = icon;
|
||||||
|
aggregateSippers(bs, sippers, "User");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private double getAverageDataCost() {
|
private double getAverageDataCost() {
|
||||||
final long WIFI_BPS = 1000000; // TODO: Extract average bit rates from system
|
final long WIFI_BPS = 1000000; // TODO: Extract average bit rates from system
|
||||||
final long MOBILE_BPS = 200000; // TODO: Extract average bit rates from system
|
final long MOBILE_BPS = 200000; // TODO: Extract average bit rates from system
|
||||||
@@ -760,6 +822,7 @@ public class PowerUsageSummary extends PreferenceFragment implements Runnable {
|
|||||||
Log.i(TAG, "Uptime since last unplugged = " + (timeSinceUnplugged / 1000));
|
Log.i(TAG, "Uptime since last unplugged = " + (timeSinceUnplugged / 1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addUserUsage();
|
||||||
addPhoneUsage(uSecNow);
|
addPhoneUsage(uSecNow);
|
||||||
addScreenUsage(uSecNow);
|
addScreenUsage(uSecNow);
|
||||||
addWiFiUsage(uSecNow);
|
addWiFiUsage(uSecNow);
|
||||||
|
Reference in New Issue
Block a user