@@ -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