diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-09-16 01:29:54 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2010-09-17 11:28:08 -0700 |
commit | cb818619c669d4257a4df969dd03eff479ba84d0 (patch) | |
tree | a3d3258e5bfc2090e38d905742b7f63203bf49cb /src/com/android | |
parent | 213d579f98a83145989f11cfdbd47631b64de000 (diff) | |
download | packages_apps_Settings-cb818619c669d4257a4df969dd03eff479ba84d0.tar.gz packages_apps_Settings-cb818619c669d4257a4df969dd03eff479ba84d0.tar.bz2 packages_apps_Settings-cb818619c669d4257a4df969dd03eff479ba84d0.zip |
Update power usage UI to follow WIFI data changes.
Now handles WIFI start times being distributed across applications,
and collapses all work done in WIFI uid procs (esp that supplicant
thing) into the apps and overall WIFI category.
Change-Id: I341e5d63c45eeb0fb4121beed62474d947f9de11
Diffstat (limited to 'src/com/android')
3 files changed, 92 insertions, 20 deletions
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java index acd9ee447..fd36a9d71 100644 --- a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java +++ b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java @@ -563,15 +563,17 @@ public class BatteryHistoryChart extends View { } } - } else if (curLevelPath != null) { - finishPaths(x+1, h, levelh, startX, lastY, curLevelPath, lastX, - lastCharging, lastScreenOn, lastGpsOn, lastWifiRunning, - lastWakeLock, lastPhoneSignalBin, lastLinePath); - lastX = lastY = -1; - curLevelPath = null; - lastLinePath = null; - lastCharging = lastScreenOn = lastGpsOn = lastWakeLock = false; - lastPhoneSignalBin = 0; + } else if (rec.cmd != BatteryStats.HistoryItem.CMD_OVERFLOW) { + if (curLevelPath != null) { + finishPaths(x+1, h, levelh, startX, lastY, curLevelPath, lastX, + lastCharging, lastScreenOn, lastGpsOn, lastWifiRunning, + lastWakeLock, lastPhoneSignalBin, lastLinePath); + lastX = lastY = -1; + curLevelPath = null; + lastLinePath = null; + lastCharging = lastScreenOn = lastGpsOn = lastWakeLock = false; + lastPhoneSignalBin = 0; + } } rec = rec.next; diff --git a/src/com/android/settings/fuelgauge/BatterySipper.java b/src/com/android/settings/fuelgauge/BatterySipper.java index fc967d3bb..dbd664a64 100644 --- a/src/com/android/settings/fuelgauge/BatterySipper.java +++ b/src/com/android/settings/fuelgauge/BatterySipper.java @@ -45,8 +45,11 @@ class BatterySipper implements Comparable<BatterySipper> { long usageTime; long cpuTime; long gpsTime; + long wifiRunningTime; long cpuFgTime; long wakeLockTime; + long tcpBytesReceived; + long tcpBytesSent; double percent; double noCoveragePercent; String defaultPackageName; diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index 5d4c1b9a0..ac9401d6e 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -25,6 +25,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcel; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; @@ -67,7 +68,8 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { IBatteryStats mBatteryInfo; BatteryStatsImpl mStats; - private List<BatterySipper> mUsageList = new ArrayList<BatterySipper>(); + private final List<BatterySipper> mUsageList = new ArrayList<BatterySipper>(); + private final List<BatterySipper> mWifiSippers = new ArrayList<BatterySipper>(); private PreferenceGroup mAppListGroup; @@ -79,8 +81,12 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { private long mStatsPeriod = 0; private double mMaxPower = 1; private double mTotalPower; + private double mWifiPower; private PowerProfile mPowerProfile; + // How much the apps together have left WIFI running. + private long mAppWifiRunning; + /** Queue for fetching name and icon for an application */ private ArrayList<BatterySipper> mRequestQueue = new ArrayList<BatterySipper>(); private Thread mRequestThread; @@ -162,6 +168,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { R.string.usage_type_cpu_foreground, R.string.usage_type_wake_lock, R.string.usage_type_gps, + R.string.usage_type_wifi_running, R.string.usage_type_data_send, R.string.usage_type_data_recv, R.string.usage_type_audio, @@ -172,8 +179,9 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { sipper.cpuFgTime, sipper.wakeLockTime, sipper.gpsTime, - uid != null? uid.getTcpBytesSent(mStatsType) : 0, - uid != null? uid.getTcpBytesReceived(mStatsType) : 0, + sipper.wifiRunningTime, + sipper.tcpBytesSent, + sipper.tcpBytesReceived, 0, 0 }; @@ -201,6 +209,25 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { }; } break; + case WIFI: + { + types = new int[] { + R.string.usage_type_wifi_running, + R.string.usage_type_cpu, + R.string.usage_type_cpu_foreground, + R.string.usage_type_wake_lock, + R.string.usage_type_data_send, + R.string.usage_type_data_recv, + }; + values = new double[] { + sipper.usageTime, + sipper.cpuTime, + sipper.cpuFgTime, + sipper.wakeLockTime, + sipper.tcpBytesSent, + sipper.tcpBytesReceived, + }; + } break; default: { types = new int[] { @@ -267,9 +294,12 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { } mMaxPower = 0; mTotalPower = 0; + mWifiPower = 0; + mAppWifiRunning = 0; mAppListGroup.removeAll(); mUsageList.clear(); + mWifiSippers.clear(); processAppUsage(); processMiscUsage(); @@ -402,8 +432,15 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { wakelockTime /= 1000; // convert to millis // Add cost of data traffic - power += (u.getTcpBytesReceived(mStatsType) + u.getTcpBytesSent(mStatsType)) - * averageCostPerByte; + long tcpBytesReceived = u.getTcpBytesReceived(mStatsType); + long tcpBytesSent = u.getTcpBytesSent(mStatsType); + power += (tcpBytesReceived+tcpBytesSent) * averageCostPerByte; + + // Add cost of keeping WIFI running. + long wifiRunningTimeMs = u.getWifiRunningTime(uSecTime, which) / 1000; + mAppWifiRunning += wifiRunningTimeMs; + power += (wifiRunningTimeMs + * mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_ON)) / 1000; // Process Sensor usage Map<Integer, ? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats(); @@ -433,6 +470,8 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { power += (multiplier * sensorTime) / 1000; } + if (DEBUG) Log.i(TAG, "UID " + u.getUid() + ": power=" + power); + // Add the app to the list if it is consuming power if (power != 0) { BatterySipper app = new BatterySipper(this, mRequestQueue, mHandler, @@ -440,12 +479,23 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { new double[] {power}); app.cpuTime = cpuTime; app.gpsTime = gpsTime; + app.wifiRunningTime = wifiRunningTimeMs; app.cpuFgTime = cpuFgTime; app.wakeLockTime = wakelockTime; - mUsageList.add(app); + app.tcpBytesReceived = tcpBytesReceived; + app.tcpBytesSent = tcpBytesSent; + if (u.getUid() == Process.WIFI_UID) { + mWifiSippers.add(app); + } else { + mUsageList.add(app); + } + } + if (u.getUid() == Process.WIFI_UID) { + mWifiPower += power; + } else { + if (power > mMaxPower) mMaxPower = power; + mTotalPower += power; } - if (power > mMaxPower) mMaxPower = power; - mTotalPower += power; if (DEBUG) Log.i(TAG, "Added power = " + power); } } @@ -503,12 +553,28 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { private void addWiFiUsage(long uSecNow) { long onTimeMs = mStats.getWifiOnTime(uSecNow, mStatsType) / 1000; - long runningTimeMs = mStats.getWifiRunningTime(uSecNow, mStatsType) / 1000; + long runningTimeMs = mStats.getGlobalWifiRunningTime(uSecNow, mStatsType) / 1000; + if (DEBUG) Log.i(TAG, "WIFI runningTime=" + runningTimeMs + + " app runningTime=" + mAppWifiRunning); + runningTimeMs -= mAppWifiRunning; + if (runningTimeMs < 0) runningTimeMs = 0; double wifiPower = (onTimeMs * 0 /* TODO */ * mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_ON) + runningTimeMs * mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_ON)) / 1000; - addEntry(getString(R.string.power_wifi), DrainType.WIFI, runningTimeMs, - R.drawable.ic_settings_wifi, wifiPower); + if (DEBUG) Log.i(TAG, "WIFI power=" + wifiPower + " from procs=" + mWifiPower); + BatterySipper bs = addEntry(getString(R.string.power_wifi), DrainType.WIFI, runningTimeMs, + R.drawable.ic_settings_wifi, wifiPower + mWifiPower); + for (int i=0; i<mWifiSippers.size(); i++) { + BatterySipper wbs = mWifiSippers.get(i); + if (DEBUG) Log.i(TAG, "WIFI adding sipper " + wbs + ": cpu=" + wbs.cpuTime); + bs.cpuTime += wbs.cpuTime; + bs.gpsTime += wbs.gpsTime; + bs.wifiRunningTime += wbs.wifiRunningTime; + bs.cpuFgTime += wbs.cpuFgTime; + bs.wakeLockTime += wbs.wakeLockTime; + bs.tcpBytesReceived += wbs.tcpBytesReceived; + bs.tcpBytesSent += wbs.tcpBytesSent; + } } private void addIdleUsage(long uSecNow) { @@ -594,6 +660,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable { parcel.setDataPosition(0); mStats = com.android.internal.os.BatteryStatsImpl.CREATOR .createFromParcel(parcel); + mStats.distributeWorkLocked(BatteryStats.STATS_SINCE_CHARGED); } catch (RemoteException e) { Log.e(TAG, "RemoteException:", e); } |