Skip to content

Commit 9248e95

Browse files
Dianne HackbornJason Chen
authored andcommitted
DO NOT MERGE Cherry-pick of Ie4026a7c back to GB
Original change description follows: ----------------------------------- Implement issue #3326435: Battery stats improvements Keep track of discharge while screen is on vs. off. Checkin looks like: 5,0,u,dc,1,1,1,0 The last four numbers are, from left: - Maximum battery drain over time period. - Minimum battery drain over time period. - Battery drain while screen was on. - Battery drain while screen was off. Change-Id: Ie3cfe52df29b3f28ba8dc3350abe6cc967c76324
1 parent 99cca89 commit 9248e95

File tree

2 files changed

+162
-6
lines changed

2 files changed

+162
-6
lines changed

core/java/android/os/BatteryStats.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ public abstract class BatteryStats implements Parcelable {
132132
private static final String NETWORK_DATA = "nt";
133133
private static final String USER_ACTIVITY_DATA = "ua";
134134
private static final String BATTERY_DATA = "bt";
135+
private static final String BATTERY_DISCHARGE_DATA = "dc";
135136
private static final String BATTERY_LEVEL_DATA = "lv";
136137
private static final String WIFI_LOCK_DATA = "wfl";
137138
private static final String MISC_DATA = "m";
@@ -800,6 +801,30 @@ public long getRadioDataUptimeMs() {
800801
*/
801802
public abstract int getHighDischargeAmountSinceCharge();
802803

804+
/**
805+
* Get the amount the battery has discharged while the screen was on,
806+
* since the last time power was unplugged.
807+
*/
808+
public abstract int getDischargeAmountScreenOn();
809+
810+
/**
811+
* Get the amount the battery has discharged while the screen was on,
812+
* since the last time the device was charged.
813+
*/
814+
public abstract int getDischargeAmountScreenOnSinceCharge();
815+
816+
/**
817+
* Get the amount the battery has discharged while the screen was off,
818+
* since the last time power was unplugged.
819+
*/
820+
public abstract int getDischargeAmountScreenOff();
821+
822+
/**
823+
* Get the amount the battery has discharged while the screen was off,
824+
* since the last time the device was charged.
825+
*/
826+
public abstract int getDischargeAmountScreenOffSinceCharge();
827+
803828
/**
804829
* Returns the total, last, or current battery uptime in microseconds.
805830
*
@@ -1095,6 +1120,17 @@ public final void dumpCheckinLocked(PrintWriter pw, int which, int reqUid) {
10951120
getDischargeCurrentLevel());
10961121
}
10971122

1123+
if (which == STATS_SINCE_UNPLUGGED) {
1124+
dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA,
1125+
getDischargeStartLevel()-getDischargeCurrentLevel(),
1126+
getDischargeStartLevel()-getDischargeCurrentLevel(),
1127+
getDischargeAmountScreenOn(), getDischargeAmountScreenOff());
1128+
} else {
1129+
dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA,
1130+
getLowDischargeAmountSinceCharge(), getHighDischargeAmountSinceCharge(),
1131+
getDischargeAmountScreenOn(), getDischargeAmountScreenOff());
1132+
}
1133+
10981134
if (reqUid < 0) {
10991135
Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats();
11001136
if (kernelWakelocks.size() > 0) {
@@ -1451,13 +1487,21 @@ public final void dumpLocked(PrintWriter pw, String prefix, int which, int reqUi
14511487
pw.print(prefix); pw.print(" Last discharge cycle end level: ");
14521488
pw.println(getDischargeCurrentLevel());
14531489
}
1490+
pw.print(prefix); pw.print(" Amount discharged while screen on: ");
1491+
pw.println(getDischargeAmountScreenOn());
1492+
pw.print(prefix); pw.print(" Amount discharged while screen off: ");
1493+
pw.println(getDischargeAmountScreenOff());
14541494
pw.println(" ");
14551495
} else {
14561496
pw.print(prefix); pw.println(" Device battery use since last full charge");
14571497
pw.print(prefix); pw.print(" Amount discharged (lower bound): ");
14581498
pw.println(getLowDischargeAmountSinceCharge());
14591499
pw.print(prefix); pw.print(" Amount discharged (upper bound): ");
14601500
pw.println(getHighDischargeAmountSinceCharge());
1501+
pw.print(prefix); pw.print(" Amount discharged while screen on: ");
1502+
pw.println(getDischargeAmountScreenOnSinceCharge());
1503+
pw.print(prefix); pw.print(" Amount discharged while screen off: ");
1504+
pw.println(getDischargeAmountScreenOffSinceCharge());
14611505
pw.println(" ");
14621506
}
14631507

core/java/com/android/internal/os/BatteryStatsImpl.java

Lines changed: 118 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public final class BatteryStatsImpl extends BatteryStats {
6868
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
6969

7070
// Current on-disk Parcel version
71-
private static final int VERSION = 52;
71+
private static final int VERSION = 53;
7272

7373
// Maximum number of items we will record in the history.
7474
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -235,6 +235,12 @@ public void handleMessage(Message msg) {
235235
int mDischargeCurrentLevel;
236236
int mLowDischargeAmountSinceCharge;
237237
int mHighDischargeAmountSinceCharge;
238+
int mDischargeScreenOnUnplugLevel;
239+
int mDischargeScreenOffUnplugLevel;
240+
int mDischargeAmountScreenOn;
241+
int mDischargeAmountScreenOnSinceCharge;
242+
int mDischargeAmountScreenOff;
243+
int mDischargeAmountScreenOffSinceCharge;
238244

239245
long mLastWriteTime = 0; // Milliseconds
240246

@@ -1565,6 +1571,11 @@ public void noteScreenOnLocked() {
15651571
// Fake a wake lock, so we consider the device waked as long
15661572
// as the screen is on.
15671573
noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1574+
1575+
// Update discharge amounts.
1576+
if (mOnBatteryInternal) {
1577+
updateDischargeScreenLevels(false, true);
1578+
}
15681579
}
15691580
}
15701581

@@ -1581,6 +1592,11 @@ public void noteScreenOffLocked() {
15811592
}
15821593

15831594
noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1595+
1596+
// Update discharge amounts.
1597+
if (mOnBatteryInternal) {
1598+
updateDischargeScreenLevels(true, false);
1599+
}
15841600
}
15851601
}
15861602

@@ -3897,8 +3913,7 @@ public BatteryStatsImpl(String filename) {
38973913
mDischargeStartLevel = 0;
38983914
mDischargeUnplugLevel = 0;
38993915
mDischargeCurrentLevel = 0;
3900-
mLowDischargeAmountSinceCharge = 0;
3901-
mHighDischargeAmountSinceCharge = 0;
3916+
initDischarge();
39023917
}
39033918

39043919
public BatteryStatsImpl(Parcel p) {
@@ -3968,6 +3983,15 @@ void initTimes() {
39683983
mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
39693984
mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
39703985
}
3986+
3987+
void initDischarge() {
3988+
mLowDischargeAmountSinceCharge = 0;
3989+
mHighDischargeAmountSinceCharge = 0;
3990+
mDischargeAmountScreenOn = 0;
3991+
mDischargeAmountScreenOnSinceCharge = 0;
3992+
mDischargeAmountScreenOff = 0;
3993+
mDischargeAmountScreenOffSinceCharge = 0;
3994+
}
39713995

39723996
public void resetAllStatsLocked() {
39733997
mStartCount = 0;
@@ -4005,11 +4029,33 @@ public void resetAllStatsLocked() {
40054029
mKernelWakelockStats.clear();
40064030
}
40074031

4008-
mLowDischargeAmountSinceCharge = 0;
4009-
mHighDischargeAmountSinceCharge = 0;
4032+
initDischarge();
40104033

40114034
clearHistoryLocked();
40124035
}
4036+
4037+
void updateDischargeScreenLevels(boolean oldScreenOn, boolean newScreenOn) {
4038+
if (oldScreenOn) {
4039+
int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel;
4040+
if (diff > 0) {
4041+
mDischargeAmountScreenOn += diff;
4042+
mDischargeAmountScreenOnSinceCharge += diff;
4043+
}
4044+
} else {
4045+
int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel;
4046+
if (diff > 0) {
4047+
mDischargeAmountScreenOff += diff;
4048+
mDischargeAmountScreenOffSinceCharge += diff;
4049+
}
4050+
}
4051+
if (newScreenOn) {
4052+
mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel;
4053+
mDischargeScreenOffUnplugLevel = 0;
4054+
} else {
4055+
mDischargeScreenOnUnplugLevel = 0;
4056+
mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel;
4057+
}
4058+
}
40134059

40144060
void setOnBattery(boolean onBattery, int oldStatus, int level) {
40154061
synchronized(this) {
@@ -4045,6 +4091,15 @@ void setOnBattery(boolean onBattery, int oldStatus, int level) {
40454091
mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
40464092
mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
40474093
mDischargeCurrentLevel = mDischargeUnplugLevel = level;
4094+
if (mScreenOn) {
4095+
mDischargeScreenOnUnplugLevel = level;
4096+
mDischargeScreenOffUnplugLevel = 0;
4097+
} else {
4098+
mDischargeScreenOnUnplugLevel = 0;
4099+
mDischargeScreenOffUnplugLevel = level;
4100+
}
4101+
mDischargeAmountScreenOn = 0;
4102+
mDischargeAmountScreenOff = 0;
40484103
doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
40494104
} else {
40504105
updateKernelWakelocksLocked();
@@ -4060,6 +4115,7 @@ void setOnBattery(boolean onBattery, int oldStatus, int level) {
40604115
mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;
40614116
mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level;
40624117
}
4118+
updateDischargeScreenLevels(mScreenOn, mScreenOn);
40634119
doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
40644120
}
40654121
if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
@@ -4348,6 +4404,50 @@ public int getHighDischargeAmountSinceCharge() {
43484404
return val;
43494405
}
43504406
}
4407+
4408+
public int getDischargeAmountScreenOn() {
4409+
synchronized(this) {
4410+
int val = mDischargeAmountScreenOn;
4411+
if (mOnBattery && mScreenOn
4412+
&& mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4413+
val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4414+
}
4415+
return val;
4416+
}
4417+
}
4418+
4419+
public int getDischargeAmountScreenOnSinceCharge() {
4420+
synchronized(this) {
4421+
int val = mDischargeAmountScreenOnSinceCharge;
4422+
if (mOnBattery && mScreenOn
4423+
&& mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4424+
val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4425+
}
4426+
return val;
4427+
}
4428+
}
4429+
4430+
public int getDischargeAmountScreenOff() {
4431+
synchronized(this) {
4432+
int val = mDischargeAmountScreenOff;
4433+
if (mOnBattery && !mScreenOn
4434+
&& mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4435+
val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4436+
}
4437+
return val;
4438+
}
4439+
}
4440+
4441+
public int getDischargeAmountScreenOffSinceCharge() {
4442+
synchronized(this) {
4443+
int val = mDischargeAmountScreenOffSinceCharge;
4444+
if (mOnBattery && !mScreenOn
4445+
&& mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4446+
val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4447+
}
4448+
return val;
4449+
}
4450+
}
43514451

43524452
@Override
43534453
public int getCpuSpeedSteps() {
@@ -4654,7 +4754,9 @@ private void readSummaryFromParcel(Parcel in) {
46544754
mDischargeCurrentLevel = in.readInt();
46554755
mLowDischargeAmountSinceCharge = in.readInt();
46564756
mHighDischargeAmountSinceCharge = in.readInt();
4657-
4757+
mDischargeAmountScreenOnSinceCharge = in.readInt();
4758+
mDischargeAmountScreenOffSinceCharge = in.readInt();
4759+
46584760
mStartCount++;
46594761

46604762
mScreenOn = false;
@@ -4849,6 +4951,8 @@ public void writeSummaryToParcel(Parcel out) {
48494951
out.writeInt(mDischargeCurrentLevel);
48504952
out.writeInt(getLowDischargeAmountSinceCharge());
48514953
out.writeInt(getHighDischargeAmountSinceCharge());
4954+
out.writeInt(getDischargeAmountScreenOnSinceCharge());
4955+
out.writeInt(getDischargeAmountScreenOffSinceCharge());
48524956

48534957
mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
48544958
for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
@@ -5088,6 +5192,10 @@ void readFromParcelLocked(Parcel in) {
50885192
mDischargeCurrentLevel = in.readInt();
50895193
mLowDischargeAmountSinceCharge = in.readInt();
50905194
mHighDischargeAmountSinceCharge = in.readInt();
5195+
mDischargeAmountScreenOn = in.readInt();
5196+
mDischargeAmountScreenOnSinceCharge = in.readInt();
5197+
mDischargeAmountScreenOff = in.readInt();
5198+
mDischargeAmountScreenOffSinceCharge = in.readInt();
50915199
mLastWriteTime = in.readLong();
50925200

50935201
mMobileDataRx[STATS_LAST] = in.readLong();
@@ -5189,6 +5297,10 @@ void writeToParcelLocked(Parcel out, boolean inclUids, int flags) {
51895297
out.writeInt(mDischargeCurrentLevel);
51905298
out.writeInt(mLowDischargeAmountSinceCharge);
51915299
out.writeInt(mHighDischargeAmountSinceCharge);
5300+
out.writeInt(mDischargeAmountScreenOn);
5301+
out.writeInt(mDischargeAmountScreenOnSinceCharge);
5302+
out.writeInt(mDischargeAmountScreenOff);
5303+
out.writeInt(mDischargeAmountScreenOffSinceCharge);
51925304
out.writeLong(mLastWriteTime);
51935305

51945306
out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED));

0 commit comments

Comments
 (0)