summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/BatteryStats.java2
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java12
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java106
3 files changed, 110 insertions, 10 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 0e26ca215993..54d5860048ad 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -207,7 +207,7 @@ public abstract class BatteryStats implements Parcelable {
* New in version 22:
* - BLE scan result background count, BLE unoptimized scan time
*/
- static final String CHECKIN_VERSION = "23";
+ static final String CHECKIN_VERSION = "24";
/**
* Old version, we hit 9 and ran out of room, need to remove.
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 5129cf5c1ef3..cad1b7c51a54 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -6616,9 +6616,12 @@ public class BatteryStatsImpl extends BatteryStats {
* inactive so can be dropped.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
- public boolean reset() {
+ public boolean reset(long uptime, long realtime) {
boolean active = false;
+ mOnBatteryBackgroundTimeBase.init(uptime, realtime);
+ mOnBatteryScreenOffBackgroundTimeBase.init(uptime, realtime);
+
if (mWifiRunningTimer != null) {
active |= !mWifiRunningTimer.reset(false);
active |= mWifiRunning;
@@ -6806,11 +6809,6 @@ public class BatteryStatsImpl extends BatteryStats {
mLastStepUserTime = mLastStepSystemTime = 0;
mCurStepUserTime = mCurStepSystemTime = 0;
- mOnBatteryBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000,
- mBsi.mClocks.uptimeMillis() * 1000);
- mOnBatteryScreenOffBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000,
- mBsi.mClocks.uptimeMillis() * 1000);
-
if (!active) {
if (mWifiRunningTimer != null) {
mWifiRunningTimer.detach();
@@ -9463,7 +9461,7 @@ public class BatteryStatsImpl extends BatteryStats {
mNumConnectivityChange = mLoadedNumConnectivityChange = mUnpluggedNumConnectivityChange = 0;
for (int i=0; i<mUidStats.size(); i++) {
- if (mUidStats.valueAt(i).reset()) {
+ if (mUidStats.valueAt(i).reset(uptimeMillis * 1000, elapsedRealtimeMillis * 1000)) {
mUidStats.remove(mUidStats.keyAt(i));
i--;
}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
index af4a6d92cea6..8fd4e3110569 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
@@ -400,7 +400,7 @@ public class BatteryStatsSensorTest extends TestCase {
assertNotNull(sensor.getSensorBackgroundTime());
// Reset the stats. Since the sensor is still running, we should still see the timer
- bi.getUidStatsLocked(UID).reset();
+ bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000);
sensor = uid.getSensorStats().get(SENSOR_ID);
assertNotNull(sensor);
@@ -410,9 +410,111 @@ public class BatteryStatsSensorTest extends TestCase {
bi.noteStopSensorLocked(UID, SENSOR_ID);
// Now the sensor timer has stopped so this reset should also take out the sensor.
- bi.getUidStatsLocked(UID).reset();
+ bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000);
sensor = uid.getSensorStats().get(SENSOR_ID);
assertNull(sensor);
}
+
+ @SmallTest
+ public void testSensorResetTimes() throws Exception {
+ final MockClocks clocks = new MockClocks();
+ MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
+ final int which = BatteryStats.STATS_SINCE_CHARGED;
+ bi.mForceOnBattery = true;
+ clocks.realtime = 100; // in ms
+ clocks.uptime = 100; // in ms
+
+ // TimeBases are on for some time.
+ BatteryStatsImpl.TimeBase timeBase = bi.getOnBatteryTimeBase();
+ BatteryStatsImpl.TimeBase bgTimeBase = bi.getOnBatteryBackgroundTimeBase(UID);
+ timeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000);
+ bgTimeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000);
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ // TimeBases are turned off
+ timeBase.setRunning(false, clocks.uptime * 1000, clocks.realtime * 1000);
+ bgTimeBase.setRunning(false, clocks.uptime * 1000, clocks.realtime * 1000);
+
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ // Timer is turned on
+ bi.noteStartSensorLocked(UID, SENSOR_ID);
+
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ // Timebase was off so times are all 0.
+ BatteryStats.Uid.Sensor sensor = bi.getUidStats().get(UID).getSensorStats().get(SENSOR_ID);
+ BatteryStats.Timer timer = sensor.getSensorTime();
+ BatteryStats.Timer bgTimer = sensor.getSensorBackgroundTime();
+ assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime));
+ assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime));
+
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ // Reset the stats. Since the sensor is still running, we should still see the timer
+ // but still with 0 times.
+ bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000);
+ assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime));
+ assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime));
+
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ // Now stop the timer. The times should still be 0.
+ bi.noteStopSensorLocked(UID, SENSOR_ID);
+ assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime));
+ assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime));
+
+ // Now repeat with the TimeBases turned on the entire time.
+ timeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000);
+ bgTimeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000);
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ // Timer is turned on
+ bi.noteStartSensorLocked(UID, SENSOR_ID);
+
+ clocks.realtime += 111;
+ clocks.uptime += 1111;
+
+ // Timebase and timer was on so times have increased.
+ assertEquals(111_000, timer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(111, timer.getTotalDurationMsLocked(clocks.realtime));
+ assertEquals(111_000, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(111, bgTimer.getTotalDurationMsLocked(clocks.realtime));
+
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ // Reset the stats. Since the sensor is still running, we should still see the timer
+ // but with 0 times.
+ bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000);
+ assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime));
+ assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime));
+
+ clocks.realtime += 112;
+ clocks.uptime += 112;
+
+ // Now stop the timer. The times should have increased since the timebase was on.
+ bi.noteStopSensorLocked(UID, SENSOR_ID);
+ assertEquals(112_000, timer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(112, timer.getTotalDurationMsLocked(clocks.realtime));
+ assertEquals(112_000, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which));
+ assertEquals(112, bgTimer.getTotalDurationMsLocked(clocks.realtime));
+ }
}