From abded113bde548734600dc1b6e4ce2e94f48e32e Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Mon, 8 Feb 2016 16:49:39 -0800 Subject: Add unit tests for BatteryStatsImpl. - Add a Clocks interface to wrap SystemClock.uptimeMillis and SystemClock.elapsedRealtime. - Make the inner classes static so they can be created independently, which meant passing explicit pointers to the BatteryStatsImpl and the Uid objects in a lot of places. - Make several fields protected so they can be accessed by the tests (they are still @hidden) - Add a test suite for the battery stats. - Add the tests Change-Id: I4e45afedc64f7050985c28a7eb4f5c1ddbaa63fa --- core/java/android/os/BatteryStats.java | 2 +- .../com/android/internal/os/BatteryStatsImpl.java | 1087 +++++++++++--------- .../android/internal/os/BatteryStatsServTest.java | 745 ++++++++++++++ .../com/android/internal/os/BatteryStatsTests.java | 15 + .../internal/os/BatteryStatsTimeBaseTest.java | 339 ++++++ .../android/internal/os/BatteryStatsTimerTest.java | 487 +++++++++ .../android/internal/os/BatteryStatsUidTest.java | 54 + .../android/internal/os/MockBatteryStatsImpl.java | 51 + .../src/com/android/internal/os/MockClocks.java | 32 + 9 files changed, 2339 insertions(+), 473 deletions(-) create mode 100644 core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java create mode 100644 core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java create mode 100644 core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java create mode 100644 core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java create mode 100644 core/tests/coretests/src/com/android/internal/os/BatteryStatsUidTest.java create mode 100644 core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java create mode 100644 core/tests/coretests/src/com/android/internal/os/MockClocks.java diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index a738b2e9bf61..8281279bec68 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -623,7 +623,7 @@ public abstract class BatteryStats implements Parcelable { /** * The statistics associated with a particular service. */ - public abstract class Serv { + public static abstract class Serv { /** * Returns the amount of time spent started. diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 648b1a54927d..81c2540dabc7 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -93,7 +93,7 @@ import java.util.concurrent.locks.ReentrantLock; * battery life. All times are represented in microseconds except where indicated * otherwise. */ -public final class BatteryStatsImpl extends BatteryStats { +public class BatteryStatsImpl extends BatteryStats { private static final String TAG = "BatteryStatsImpl"; private static final boolean DEBUG = false; public static final boolean DEBUG_ENERGY = false; @@ -126,6 +126,8 @@ public final class BatteryStatsImpl extends BatteryStats { // Number of transmit power states the Bluetooth controller can be in. private static final int NUM_BT_TX_LEVELS = 1; + protected Clocks mClocks; + private final JournaledFile mFile; public final AtomicFile mCheckinFile; public final AtomicFile mDailyFile; @@ -185,6 +187,21 @@ public final class BatteryStatsImpl extends BatteryStats { } } + public interface Clocks { + public long elapsedRealtime(); + public long uptimeMillis(); + } + + public static class SystemClocks implements Clocks { + public long elapsedRealtime() { + return SystemClock.elapsedRealtime(); + } + + public long uptimeMillis() { + return SystemClock.uptimeMillis(); + } + } + public interface ExternalStatsSync { public static final int UPDATE_CPU = 0x01; public static final int UPDATE_WIFI = 0x02; @@ -236,7 +253,7 @@ public final class BatteryStatsImpl extends BatteryStats { // These are the objects that will want to do something when the device // is unplugged from power. - final TimeBase mOnBatteryTimeBase = new TimeBase(); + protected final TimeBase mOnBatteryTimeBase = new TimeBase(); // These are the objects that will want to do something when the device // is unplugged from power *and* the screen is off. @@ -541,6 +558,11 @@ public final class BatteryStatsImpl extends BatteryStats { } public BatteryStatsImpl() { + this(new SystemClocks()); + } + + public BatteryStatsImpl(Clocks clocks) { + init(clocks); mFile = null; mCheckinFile = null; mDailyFile = null; @@ -549,25 +571,40 @@ public final class BatteryStatsImpl extends BatteryStats { clearHistoryLocked(); } + private void init(Clocks clocks) { + mClocks = clocks; + mMobileNetworkStats = new NetworkStats[] { + new NetworkStats(mClocks.elapsedRealtime(), 50), + new NetworkStats(mClocks.elapsedRealtime(), 50), + new NetworkStats(mClocks.elapsedRealtime(), 50) + }; + mWifiNetworkStats = new NetworkStats[] { + new NetworkStats(mClocks.elapsedRealtime(), 50), + new NetworkStats(mClocks.elapsedRealtime(), 50), + new NetworkStats(mClocks.elapsedRealtime(), 50) + }; + } + public static interface TimeBaseObs { void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime); void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime); } - static class TimeBase { - private final ArrayList mObservers = new ArrayList<>(); + // methods are protected not private to be VisibleForTesting + public static class TimeBase { + protected final ArrayList mObservers = new ArrayList<>(); - private long mUptime; - private long mRealtime; + protected long mUptime; + protected long mRealtime; - private boolean mRunning; + protected boolean mRunning; - private long mPastUptime; - private long mUptimeStart; - private long mPastRealtime; - private long mRealtimeStart; - private long mUnpluggedUptime; - private long mUnpluggedRealtime; + protected long mPastUptime; + protected long mUptimeStart; + protected long mPastRealtime; + protected long mRealtimeStart; + protected long mUnpluggedUptime; + protected long mUnpluggedRealtime; public void dump(PrintWriter pw, String prefix) { StringBuilder sb = new StringBuilder(128); @@ -608,6 +645,10 @@ public final class BatteryStatsImpl extends BatteryStats { } } + public boolean hasObserver(TimeBaseObs observer) { + return mObservers.contains(observer); + } + public void init(long uptime, long realtime) { mRealtime = 0; mUptime = 0; @@ -626,7 +667,10 @@ public final class BatteryStatsImpl extends BatteryStats { } else { mUptimeStart = uptime; mRealtimeStart = realtime; + // TODO: Since mUptimeStart was just reset and we are running, getUptime will + // just return mPastUptime. Also, are we sure we don't want to reset that? mUnpluggedUptime = getUptime(uptime); + // TODO: likewise. mUnpluggedRealtime = getRealtime(realtime); } } @@ -949,13 +993,14 @@ public final class BatteryStatsImpl extends BatteryStats { * State for keeping track of timing information. */ public static abstract class Timer extends BatteryStats.Timer implements TimeBaseObs { - final int mType; - final TimeBase mTimeBase; + protected final Clocks mClocks; + protected final int mType; + protected final TimeBase mTimeBase; - int mCount; - int mLoadedCount; - int mLastCount; - int mUnpluggedCount; + protected int mCount; + protected int mLoadedCount; + protected int mLastCount; + protected int mUnpluggedCount; // Times are in microseconds for better accuracy when dividing by the // lock count, and are in "battery realtime" units. @@ -965,32 +1010,32 @@ public final class BatteryStatsImpl extends BatteryStats { * boot, to the last time something interesting happened in the * current run. */ - long mTotalTime; + protected long mTotalTime; /** * The total time we loaded for the previous runs. Subtract this from * mTotalTime to find the time for the current run of the system. */ - long mLoadedTime; + protected long mLoadedTime; /** * The run time of the last run of the system, as loaded from the * saved data. */ - long mLastTime; + protected long mLastTime; /** * The value of mTotalTime when unplug() was last called. Subtract * this from mTotalTime to find the time since the last unplug from * power. */ - long mUnpluggedTime; + protected long mUnpluggedTime; /** * The total time this timer has been running until the latest mark has been set. * Subtract this from mTotalTime to get the time spent running since the mark was set. */ - long mTimeBeforeMark; + protected long mTimeBeforeMark; /** * Constructs from a parcel. @@ -998,7 +1043,8 @@ public final class BatteryStatsImpl extends BatteryStats { * @param timeBase * @param in */ - Timer(int type, TimeBase timeBase, Parcel in) { + public Timer(Clocks clocks, int type, TimeBase timeBase, Parcel in) { + mClocks = clocks; mType = type; mTimeBase = timeBase; @@ -1015,7 +1061,8 @@ public final class BatteryStatsImpl extends BatteryStats { if (DEBUG) Log.i(TAG, "**** READ TIMER #" + mType + ": mTotalTime=" + mTotalTime); } - Timer(int type, TimeBase timeBase) { + public Timer(Clocks clocks, int type, TimeBase timeBase) { + mClocks = clocks; mType = type; mTimeBase = timeBase; timeBase.add(this); @@ -1029,7 +1076,7 @@ public final class BatteryStatsImpl extends BatteryStats { * Clear state of this timer. Returns true if the timer is inactive * so can be completely dropped. */ - boolean reset(boolean detachIfReset) { + public boolean reset(boolean detachIfReset) { mTotalTime = mLoadedTime = mLastTime = mTimeBeforeMark = 0; mCount = mLoadedCount = mLastCount = 0; if (detachIfReset) { @@ -1038,7 +1085,7 @@ public final class BatteryStatsImpl extends BatteryStats { return true; } - void detach() { + public void detach() { mTimeBase.remove(this); } @@ -1142,13 +1189,13 @@ public final class BatteryStatsImpl extends BatteryStats { } - void writeSummaryFromParcelLocked(Parcel out, long elapsedRealtimeUs) { + public void writeSummaryFromParcelLocked(Parcel out, long elapsedRealtimeUs) { long runTime = computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs)); out.writeLong(runTime); out.writeInt(mCount); } - void readSummaryFromParcelLocked(Parcel in) { + public void readSummaryFromParcelLocked(Parcel in) { // Multiply by 1000 for backwards compatibility mTotalTime = mLoadedTime = in.readLong(); mLastTime = 0; @@ -1162,7 +1209,7 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public static final class SamplingTimer extends Timer { + public static class SamplingTimer extends Timer { /** * The most recent reported count from /proc/wakelocks. @@ -1202,8 +1249,8 @@ public final class BatteryStatsImpl extends BatteryStats { */ int mUpdateVersion; - SamplingTimer(TimeBase timeBase, Parcel in) { - super(0, timeBase, in); + SamplingTimer(Clocks clocks, TimeBase timeBase, Parcel in) { + super(clocks, 0, timeBase, in); mCurrentReportedCount = in.readInt(); mUnpluggedReportedCount = in.readInt(); mCurrentReportedTotalTime = in.readLong(); @@ -1212,8 +1259,8 @@ public final class BatteryStatsImpl extends BatteryStats { mTimeBaseRunning = timeBase.isRunning(); } - SamplingTimer(TimeBase timeBase, boolean trackReportedValues) { - super(0, timeBase); + SamplingTimer(Clocks clocks, TimeBase timeBase, boolean trackReportedValues) { + super(clocks, 0, timeBase); mTrackingReportedValues = trackReportedValues; mTimeBaseRunning = timeBase.isRunning(); } @@ -1301,20 +1348,20 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(mTrackingReportedValues ? 1 : 0); } - boolean reset(boolean detachIfReset) { + public boolean reset(boolean detachIfReset) { super.reset(detachIfReset); setStale(); return true; } - void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { + public void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { super.writeSummaryFromParcelLocked(out, batteryRealtime); out.writeLong(mCurrentReportedTotalTime); out.writeInt(mCurrentReportedCount); out.writeInt(mTrackingReportedValues ? 1 : 0); } - void readSummaryFromParcelLocked(Parcel in) { + public void readSummaryFromParcelLocked(Parcel in) { super.readSummaryFromParcelLocked(in); mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong(); mUnpluggedReportedCount = mCurrentReportedCount = in.readInt(); @@ -1326,7 +1373,7 @@ public final class BatteryStatsImpl extends BatteryStats { * A timer that increments in batches. It does not run for durations, but just jumps * for a pre-determined amount. */ - public static final class BatchTimer extends Timer { + public static class BatchTimer extends Timer { final Uid mUid; /** @@ -1344,16 +1391,16 @@ public final class BatteryStatsImpl extends BatteryStats { */ boolean mInDischarge; - BatchTimer(Uid uid, int type, TimeBase timeBase, Parcel in) { - super(type, timeBase, in); + BatchTimer(Clocks clocks, Uid uid, int type, TimeBase timeBase, Parcel in) { + super(clocks, type, timeBase, in); mUid = uid; mLastAddedTime = in.readLong(); mLastAddedDuration = in.readLong(); mInDischarge = timeBase.isRunning(); } - BatchTimer(Uid uid, int type, TimeBase timeBase) { - super(type, timeBase); + BatchTimer(Clocks clocks, Uid uid, int type, TimeBase timeBase) { + super(clocks, type, timeBase); mUid = uid; mInDischarge = timeBase.isRunning(); } @@ -1367,7 +1414,7 @@ public final class BatteryStatsImpl extends BatteryStats { @Override public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) { - recomputeLastDuration(SystemClock.elapsedRealtime() * 1000, false); + recomputeLastDuration(mClocks.elapsedRealtime() * 1000, false); mInDischarge = false; super.onTimeStopped(elapsedRealtime, baseUptime, baseRealtime); } @@ -1416,7 +1463,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void addDuration(BatteryStatsImpl stats, long durationMillis) { - final long now = SystemClock.elapsedRealtime() * 1000; + final long now = mClocks.elapsedRealtime() * 1000; recomputeLastDuration(now, true); mLastAddedTime = now; mLastAddedDuration = durationMillis * 1000; @@ -1427,7 +1474,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void abortLastDuration(BatteryStatsImpl stats) { - final long now = SystemClock.elapsedRealtime() * 1000; + final long now = mClocks.elapsedRealtime() * 1000; recomputeLastDuration(now, true); } @@ -1438,7 +1485,7 @@ public final class BatteryStatsImpl extends BatteryStats { @Override protected long computeRunTimeLocked(long curBatteryRealtime) { - final long overage = computeOverage(SystemClock.elapsedRealtime() * 1000); + final long overage = computeOverage(mClocks.elapsedRealtime() * 1000); if (overage > 0) { return mTotalTime = overage; } @@ -1446,8 +1493,8 @@ public final class BatteryStatsImpl extends BatteryStats { } @Override - boolean reset(boolean detachIfReset) { - final long now = SystemClock.elapsedRealtime() * 1000; + public boolean reset(boolean detachIfReset) { + final long now = mClocks.elapsedRealtime() * 1000; recomputeLastDuration(now, true); boolean stillActive = mLastAddedTime == now; super.reset(!stillActive && detachIfReset); @@ -1458,7 +1505,7 @@ public final class BatteryStatsImpl extends BatteryStats { /** * State for keeping track of timing information. */ - public static final class StopwatchTimer extends Timer { + public static class StopwatchTimer extends Timer { final Uid mUid; final ArrayList mTimerPool; @@ -1485,22 +1532,22 @@ public final class BatteryStatsImpl extends BatteryStats { */ boolean mInList; - StopwatchTimer(Uid uid, int type, ArrayList timerPool, + public StopwatchTimer(Clocks clocks, Uid uid, int type, ArrayList timerPool, TimeBase timeBase, Parcel in) { - super(type, timeBase, in); + super(clocks, type, timeBase, in); mUid = uid; mTimerPool = timerPool; mUpdateTime = in.readLong(); } - StopwatchTimer(Uid uid, int type, ArrayList timerPool, + public StopwatchTimer(Clocks clocks, Uid uid, int type, ArrayList timerPool, TimeBase timeBase) { - super(type, timeBase); + super(clocks, type, timeBase); mUid = uid; mTimerPool = timerPool; } - void setTimeout(long timeout) { + public void setTimeout(long timeout) { mTimeout = timeout; } @@ -1528,7 +1575,7 @@ public final class BatteryStatsImpl extends BatteryStats { + " mAcquireTime=" + mAcquireTime); } - void startRunningLocked(long elapsedRealtimeMs) { + public void startRunningLocked(long elapsedRealtimeMs) { if (mNesting++ == 0) { final long batteryRealtime = mTimeBase.getRealtime(elapsedRealtimeMs * 1000); mUpdateTime = batteryRealtime; @@ -1550,11 +1597,11 @@ public final class BatteryStatsImpl extends BatteryStats { } } - boolean isRunningLocked() { + public boolean isRunningLocked() { return mNesting > 0; } - void stopRunningLocked(long elapsedRealtimeMs) { + public void stopRunningLocked(long elapsedRealtimeMs) { // Ignore attempt to stop a timer that isn't running if (mNesting == 0) { return; @@ -1587,7 +1634,7 @@ public final class BatteryStatsImpl extends BatteryStats { } } - void stopAllRunningLocked(long elapsedRealtimeMs) { + public void stopAllRunningLocked(long elapsedRealtimeMs) { if (mNesting > 0) { mNesting = 1; stopRunningLocked(elapsedRealtimeMs); @@ -1632,18 +1679,18 @@ public final class BatteryStatsImpl extends BatteryStats { } @Override - boolean reset(boolean detachIfReset) { + public boolean reset(boolean detachIfReset) { boolean canDetach = mNesting <= 0; super.reset(canDetach && detachIfReset); if (mNesting > 0) { - mUpdateTime = mTimeBase.getRealtime(SystemClock.elapsedRealtime() * 1000); + mUpdateTime = mTimeBase.getRealtime(mClocks.elapsedRealtime() * 1000); } mAcquireTime = mTotalTime; return canDetach; } @Override - void detach() { + public void detach() { super.detach(); if (mTimerPool != null) { mTimerPool.remove(this); @@ -1651,7 +1698,7 @@ public final class BatteryStatsImpl extends BatteryStats { } @Override - void readSummaryFromParcelLocked(Parcel in) { + public void readSummaryFromParcelLocked(Parcel in) { super.readSummaryFromParcelLocked(in); mNesting = 0; } @@ -1943,7 +1990,7 @@ public final class BatteryStatsImpl extends BatteryStats { public SamplingTimer getWakeupReasonTimerLocked(String name) { SamplingTimer timer = mWakeupReasonStats.get(name); if (timer == null) { - timer = new SamplingTimer(mOnBatteryTimeBase, true); + timer = new SamplingTimer(mClocks, mOnBatteryTimeBase, true); mWakeupReasonStats.put(name, timer); } return timer; @@ -1956,7 +2003,8 @@ public final class BatteryStatsImpl extends BatteryStats { public SamplingTimer getKernelWakelockTimerLocked(String name) { SamplingTimer kwlt = mKernelWakelockStats.get(name); if (kwlt == null) { - kwlt = new SamplingTimer(mOnBatteryScreenOffTimeBase, true /* track reported values */); + kwlt = new SamplingTimer(mClocks, mOnBatteryScreenOffTimeBase, + true /* track reported values */); mKernelWakelockStats.put(name, kwlt); } return kwlt; @@ -2729,8 +2777,8 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mActiveEvents.updateState(code, name, uid, 0)) { return; } - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); addHistoryEventLocked(elapsedRealtime, uptime, code, name, uid); } @@ -2740,7 +2788,7 @@ public final class BatteryStatsImpl extends BatteryStats { // If the start clock time has changed by more than a year, then presumably // the previous time was completely bogus. So we are going to figure out a // new time based on how much time has elapsed since we started counting. - mStartClockTime = currentTime - (SystemClock.elapsedRealtime()-(mRealtimeStart/1000)); + mStartClockTime = currentTime - (mClocks.elapsedRealtime()-(mRealtimeStart/1000)); return true; } return false; @@ -2748,8 +2796,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteCurrentTimeChangedLocked() { final long currentTime = System.currentTimeMillis(); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); recordCurrentTimeChangeLocked(currentTime, elapsedRealtime, uptime); ensureStartClockTime(currentTime); } @@ -2766,8 +2814,8 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mRecordAllHistory) { return; } - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PROC_START, name, uid); } @@ -2800,15 +2848,15 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mRecordAllHistory) { return; } - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PROC_FINISH, name, uid); } public void noteSyncStartLocked(String name, int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); getUidStatsLocked(uid).noteStartSyncLocked(name, elapsedRealtime); if (!mActiveEvents.updateState(HistoryItem.EVENT_SYNC_START, name, uid, 0)) { return; @@ -2818,8 +2866,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteSyncFinishLocked(String name, int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); getUidStatsLocked(uid).noteStopSyncLocked(name, elapsedRealtime); if (!mActiveEvents.updateState(HistoryItem.EVENT_SYNC_FINISH, name, uid, 0)) { return; @@ -2829,8 +2877,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteJobStartLocked(String name, int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); getUidStatsLocked(uid).noteStartJobLocked(name, elapsedRealtime); if (!mActiveEvents.updateState(HistoryItem.EVENT_JOB_START, name, uid, 0)) { return; @@ -2840,8 +2888,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteJobFinishLocked(String name, int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); getUidStatsLocked(uid).noteStopJobLocked(name, elapsedRealtime); if (!mActiveEvents.updateState(HistoryItem.EVENT_JOB_FINISH, name, uid, 0)) { return; @@ -2854,8 +2902,8 @@ public final class BatteryStatsImpl extends BatteryStats { return; } uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (!mActiveEvents.updateState(HistoryItem.EVENT_ALARM_START, name, uid, 0)) { return; } @@ -2867,8 +2915,8 @@ public final class BatteryStatsImpl extends BatteryStats { return; } uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (!mActiveEvents.updateState(HistoryItem.EVENT_ALARM_FINISH, name, uid, 0)) { return; } @@ -2898,8 +2946,8 @@ public final class BatteryStatsImpl extends BatteryStats { HashMap active = mActiveEvents.getStateForEvent( HistoryItem.EVENT_PROC); if (active != null) { - long mSecRealtime = SystemClock.elapsedRealtime(); - final long mSecUptime = SystemClock.uptimeMillis(); + long mSecRealtime = mClocks.elapsedRealtime(); + final long mSecUptime = mClocks.uptimeMillis(); for (HashMap.Entry ent : active.entrySet()) { SparseIntArray uids = ent.getValue(); for (int j=0; j active = mActiveEvents.getStateForEvent( HistoryItem.EVENT_PROC); if (active != null) { - long mSecRealtime = SystemClock.elapsedRealtime(); - final long mSecUptime = SystemClock.uptimeMillis(); + long mSecRealtime = mClocks.elapsedRealtime(); + final long mSecUptime = mClocks.uptimeMillis(); for (HashMap.Entry ent : active.entrySet()) { SparseIntArray uids = ent.getValue(); for (int j=0; j= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; if (mScreenBrightnessBin != bin) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK) | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT); if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: " @@ -3304,15 +3352,15 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteWakeUpLocked(String reason, int reasonUid) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_SCREEN_WAKE_UP, reason, reasonUid); } public void noteInteractiveLocked(boolean interactive) { if (mInteractive != interactive) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long elapsedRealtime = mClocks.elapsedRealtime(); mInteractive = interactive; if (DEBUG) Slog.v(TAG, "Interactive: " + interactive); if (interactive) { @@ -3324,16 +3372,16 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteConnectivityChangedLocked(int type, String extra) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_CONNECTIVITY_CHANGED, extra, type); mNumConnectivityChange++; } public void noteMobileRadioPowerState(int powerState, long timestampNs) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mMobileRadioPowerState != powerState) { long realElapsedRealtimeMs; final boolean active = @@ -3375,8 +3423,8 @@ public final class BatteryStatsImpl extends BatteryStats { int stepState = enabled ? STEP_LEVEL_MODE_POWER_SAVE : 0; mModStepMode |= (mCurStepMode&STEP_LEVEL_MODE_POWER_SAVE) ^ stepState; mCurStepMode = (mCurStepMode&~STEP_LEVEL_MODE_POWER_SAVE) | stepState; - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mPowerSaveModeEnabled = enabled; if (enabled) { mHistoryCur.states2 |= HistoryItem.STATE2_POWER_SAVE_FLAG; @@ -3394,8 +3442,8 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteDeviceIdleModeLocked(int mode, String activeReason, int activeUid) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); boolean nowIdling = mode == DEVICE_IDLE_MODE_FULL; if (mDeviceIdling && !nowIdling && activeReason == null) { // We don't go out of general idling mode until explicitly taken out of @@ -3460,8 +3508,8 @@ public final class BatteryStatsImpl extends BatteryStats { } public void notePackageInstalledLocked(String pkgName, int versionCode) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PACKAGE_INSTALLED, pkgName, versionCode); PackageChange pc = new PackageChange(); @@ -3472,8 +3520,8 @@ public final class BatteryStatsImpl extends BatteryStats { } public void notePackageUninstalledLocked(String pkgName) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PACKAGE_UNINSTALLED, pkgName, 0); PackageChange pc = new PackageChange(); @@ -3491,8 +3539,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void notePhoneOnLocked() { if (!mPhoneOn) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mHistoryCur.states2 |= HistoryItem.STATE2_PHONE_IN_CALL_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: " + Integer.toHexString(mHistoryCur.states)); @@ -3504,8 +3552,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void notePhoneOffLocked() { if (mPhoneOn) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mHistoryCur.states2 &= ~HistoryItem.STATE2_PHONE_IN_CALL_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: " + Integer.toHexString(mHistoryCur.states)); @@ -3516,7 +3564,7 @@ public final class BatteryStatsImpl extends BatteryStats { } void stopAllPhoneSignalStrengthTimersLocked(int except) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long elapsedRealtime = mClocks.elapsedRealtime(); for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { if (i == except) { continue; @@ -3548,8 +3596,8 @@ public final class BatteryStatsImpl extends BatteryStats { mPhoneSimStateRaw = simState; mPhoneSignalStrengthBinRaw = strengthBin; - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (simState == TelephonyManager.SIM_STATE_ABSENT) { // In this case we will always be STATE_OUT_OF_SERVICE, so need @@ -3697,8 +3745,8 @@ public final class BatteryStatsImpl extends BatteryStats { } if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData); if (mPhoneDataConnectionType != bin) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK) | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT); if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: " @@ -3715,8 +3763,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiOnLocked() { if (!mWifiOn) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mHistoryCur.states2 |= HistoryItem.STATE2_WIFI_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: " + Integer.toHexString(mHistoryCur.states)); @@ -3728,8 +3776,8 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteWifiOffLocked() { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mWifiOn) { mHistoryCur.states2 &= ~HistoryItem.STATE2_WIFI_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: " @@ -3743,8 +3791,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteAudioOnLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mAudioOnNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: " @@ -3761,8 +3809,8 @@ public final class BatteryStatsImpl extends BatteryStats { return; } uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (--mAudioOnNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " @@ -3775,8 +3823,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteVideoOnLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mVideoOnNesting == 0) { mHistoryCur.states2 |= HistoryItem.STATE2_VIDEO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: " @@ -3793,8 +3841,8 @@ public final class BatteryStatsImpl extends BatteryStats { return; } uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (--mVideoOnNesting == 0) { mHistoryCur.states2 &= ~HistoryItem.STATE2_VIDEO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " @@ -3807,8 +3855,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteResetAudioLocked() { if (mAudioOnNesting > 0) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mAudioOnNesting = 0; mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " @@ -3824,8 +3872,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteResetVideoLocked() { if (mVideoOnNesting > 0) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mAudioOnNesting = 0; mHistoryCur.states2 &= ~HistoryItem.STATE2_VIDEO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " @@ -3841,12 +3889,12 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteActivityResumedLocked(int uid) { uid = mapUid(uid); - getUidStatsLocked(uid).noteActivityResumedLocked(SystemClock.elapsedRealtime()); + getUidStatsLocked(uid).noteActivityResumedLocked(mClocks.elapsedRealtime()); } public void noteActivityPausedLocked(int uid) { uid = mapUid(uid); - getUidStatsLocked(uid).noteActivityPausedLocked(SystemClock.elapsedRealtime()); + getUidStatsLocked(uid).noteActivityPausedLocked(mClocks.elapsedRealtime()); } public void noteVibratorOnLocked(int uid, long durationMillis) { @@ -3861,8 +3909,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteFlashlightOnLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mFlashlightOnNesting++ == 0) { mHistoryCur.states2 |= HistoryItem.STATE2_FLASHLIGHT_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Flashlight on to: " @@ -3878,8 +3926,8 @@ public final class BatteryStatsImpl extends BatteryStats { return; } uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (--mFlashlightOnNesting == 0) { mHistoryCur.states2 &= ~HistoryItem.STATE2_FLASHLIGHT_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Flashlight off to: " @@ -3892,8 +3940,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteCameraOnLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mCameraOnNesting++ == 0) { mHistoryCur.states2 |= HistoryItem.STATE2_CAMERA_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Camera on to: " @@ -3909,8 +3957,8 @@ public final class BatteryStatsImpl extends BatteryStats { return; } uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (--mCameraOnNesting == 0) { mHistoryCur.states2 &= ~HistoryItem.STATE2_CAMERA_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Camera off to: " @@ -3923,8 +3971,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteResetCameraLocked() { if (mCameraOnNesting > 0) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mCameraOnNesting = 0; mHistoryCur.states2 &= ~HistoryItem.STATE2_CAMERA_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Camera off to: " @@ -3940,8 +3988,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteResetFlashlightLocked() { if (mFlashlightOnNesting > 0) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mFlashlightOnNesting = 0; mHistoryCur.states2 &= ~HistoryItem.STATE2_FLASHLIGHT_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Flashlight off to: " @@ -4015,8 +4063,8 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteWifiRadioPowerState(int powerState, long timestampNs) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mWifiRadioPowerState != powerState) { final boolean active = powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM @@ -4035,8 +4083,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiRunningLocked(WorkSource ws) { if (!mGlobalWifiRunning) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mHistoryCur.states2 |= HistoryItem.STATE2_WIFI_RUNNING_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: " + Integer.toHexString(mHistoryCur.states)); @@ -4056,7 +4104,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) { if (mGlobalWifiRunning) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long elapsedRealtime = mClocks.elapsedRealtime(); int N = oldWs.size(); for (int i=0; i " + wifiState); if (mWifiState != wifiState) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long elapsedRealtime = mClocks.elapsedRealtime(); if (mWifiState >= 0) { mWifiStateTimer[mWifiState].stopRunningLocked(elapsedRealtime); } @@ -4109,8 +4157,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiSupplicantStateChangedLocked(int supplState, boolean failedAuth) { if (DEBUG) Log.i(TAG, "WiFi suppl state -> " + supplState); if (mWifiSupplState != supplState) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mWifiSupplState >= 0) { mWifiSupplStateTimer[mWifiSupplState].stopRunningLocked(elapsedRealtime); } @@ -4126,7 +4174,7 @@ public final class BatteryStatsImpl extends BatteryStats { } void stopAllWifiSignalStrengthTimersLocked(int except) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long elapsedRealtime = mClocks.elapsedRealtime(); for (int i = 0; i < NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) { if (i == except) { continue; @@ -4141,8 +4189,8 @@ public final class BatteryStatsImpl extends BatteryStats { int strengthBin = WifiManager.calculateSignalLevel(newRssi, NUM_WIFI_SIGNAL_STRENGTH_BINS); if (DEBUG) Log.i(TAG, "WiFi rssi -> " + newRssi + " bin=" + strengthBin); if (mWifiSignalStrengthBin != strengthBin) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mWifiSignalStrengthBin >= 0) { mWifiSignalStrengthsTimer[mWifiSignalStrengthBin].stopRunningLocked( elapsedRealtime); @@ -4168,8 +4216,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteFullWifiLockAcquiredLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mWifiFullLockNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: " @@ -4182,8 +4230,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteFullWifiLockReleasedLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mWifiFullLockNesting--; if (mWifiFullLockNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; @@ -4198,8 +4246,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiScanStartedLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mWifiScanNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan started for: " @@ -4212,8 +4260,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiScanStoppedLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mWifiScanNesting--; if (mWifiScanNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_FLAG; @@ -4226,13 +4274,13 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiBatchedScanStartedLocked(int uid, int csph) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long elapsedRealtime = mClocks.elapsedRealtime(); getUidStatsLocked(uid).noteWifiBatchedScanStartedLocked(csph, elapsedRealtime); } public void noteWifiBatchedScanStoppedLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long elapsedRealtime = mClocks.elapsedRealtime(); getUidStatsLocked(uid).noteWifiBatchedScanStoppedLocked(elapsedRealtime); } @@ -4240,8 +4288,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiMulticastEnabledLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (mWifiMulticastNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: " @@ -4254,8 +4302,8 @@ public final class BatteryStatsImpl extends BatteryStats { public void noteWifiMulticastDisabledLocked(int uid) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); mWifiMulticastNesting--; if (mWifiMulticastNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; @@ -4369,7 +4417,7 @@ public final class BatteryStatsImpl extends BatteryStats { // During device boot, qtaguid isn't enabled until after the inital // loading of battery stats. Now that they're enabled, take our initial // snapshot for future delta calculation. - updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), null); + updateMobileRadioStateLocked(mClocks.elapsedRealtime(), null); updateWifiStateLocked(null); } @@ -4623,8 +4671,8 @@ public final class BatteryStatsImpl extends BatteryStats { @Override public long getStartClockTime() { final long currentTime = System.currentTimeMillis(); if (ensureStartClockTime(currentTime)) { - recordCurrentTimeChangeLocked(currentTime, SystemClock.elapsedRealtime(), - SystemClock.uptimeMillis()); + recordCurrentTimeChangeLocked(currentTime, mClocks.elapsedRealtime(), + mClocks.uptimeMillis()); } return mStartClockTime; } @@ -4652,7 +4700,11 @@ public final class BatteryStatsImpl extends BatteryStats { /** * The statistics associated with a particular uid. */ - public final class Uid extends BatteryStats.Uid { + public static class Uid extends BatteryStats.Uid { + /** + * BatteryStatsImpl that we are associated with. + */ + protected BatteryStatsImpl mBsi; final int mUid; @@ -4717,35 +4769,25 @@ public final class BatteryStatsImpl extends BatteryStats { long mCurStepUserTime; long mCurStepSystemTime; - LongSamplingCounter mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase); - LongSamplingCounter mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase); - LongSamplingCounter mCpuPower = new LongSamplingCounter(mOnBatteryTimeBase); + LongSamplingCounter mUserCpuTime; + LongSamplingCounter mSystemCpuTime; + LongSamplingCounter mCpuPower; LongSamplingCounter[][] mCpuClusterSpeed; /** * The statistics we have collected for this uid's wake locks. */ - final OverflowArrayMap mWakelockStats = new OverflowArrayMap() { - @Override public Wakelock instantiateObject() { return new Wakelock(); } - }; + final OverflowArrayMap mWakelockStats; /** * The statistics we have collected for this uid's syncs. */ - final OverflowArrayMap mSyncStats = new OverflowArrayMap() { - @Override public StopwatchTimer instantiateObject() { - return new StopwatchTimer(Uid.this, SYNC, null, mOnBatteryTimeBase); - } - }; + final OverflowArrayMap mSyncStats; /** * The statistics we have collected for this uid's jobs. */ - final OverflowArrayMap mJobStats = new OverflowArrayMap() { - @Override public StopwatchTimer instantiateObject() { - return new StopwatchTimer(Uid.this, JOB, null, mOnBatteryTimeBase); - } - }; + final OverflowArrayMap mJobStats; /** * The statistics we have collected for this uid's sensor activations. @@ -4767,17 +4809,41 @@ public final class BatteryStatsImpl extends BatteryStats { */ final SparseArray mPids = new SparseArray<>(); - public Uid(int uid) { + public Uid(BatteryStatsImpl bsi, int uid) { + mBsi = bsi; mUid = uid; - mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, - mWifiRunningTimers, mOnBatteryTimeBase); - mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, - mFullWifiLockTimers, mOnBatteryTimeBase); - mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN, - mWifiScanTimers, mOnBatteryTimeBase); + + mUserCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); + mSystemCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); + mCpuPower = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); + + mWakelockStats = mBsi.new OverflowArrayMap() { + @Override public Wakelock instantiateObject() { + return new Wakelock(mBsi, Uid.this); + } + }; + mSyncStats = mBsi.new OverflowArrayMap() { + @Override public StopwatchTimer instantiateObject() { + return new StopwatchTimer(mBsi.mClocks, Uid.this, SYNC, null, + mBsi.mOnBatteryTimeBase); + } + }; + mJobStats = mBsi.new OverflowArrayMap() { + @Override public StopwatchTimer instantiateObject() { + return new StopwatchTimer(mBsi.mClocks, Uid.this, JOB, null, + mBsi.mOnBatteryTimeBase); + } + }; + + mWifiRunningTimer = new StopwatchTimer(mBsi.mClocks, this, WIFI_RUNNING, + mBsi.mWifiRunningTimers, mBsi.mOnBatteryTimeBase); + mFullWifiLockTimer = new StopwatchTimer(mBsi.mClocks, this, FULL_WIFI_LOCK, + mBsi.mFullWifiLockTimers, mBsi.mOnBatteryTimeBase); + mWifiScanTimer = new StopwatchTimer(mBsi.mClocks, this, WIFI_SCAN, + mBsi.mWifiScanTimers, mBsi.mOnBatteryTimeBase); mWifiBatchedScanTimer = new StopwatchTimer[NUM_WIFI_BATCHED_SCAN_BINS]; - mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, - mWifiMulticastTimers, mOnBatteryTimeBase); + mWifiMulticastTimer = new StopwatchTimer(mBsi.mClocks, this, WIFI_MULTICAST_ENABLED, + mBsi.mWifiMulticastTimers, mBsi.mOnBatteryTimeBase); mProcessStateTimer = new StopwatchTimer[NUM_PROCESS_STATE]; } @@ -4821,8 +4887,8 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mWifiRunning) { mWifiRunning = true; if (mWifiRunningTimer == null) { - mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, - mWifiRunningTimers, mOnBatteryTimeBase); + mWifiRunningTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, WIFI_RUNNING, + mBsi.mWifiRunningTimers, mBsi.mOnBatteryTimeBase); } mWifiRunningTimer.startRunningLocked(elapsedRealtimeMs); } @@ -4841,8 +4907,8 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mFullWifiLockOut) { mFullWifiLockOut = true; if (mFullWifiLockTimer == null) { - mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, - mFullWifiLockTimers, mOnBatteryTimeBase); + mFullWifiLockTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, FULL_WIFI_LOCK, + mBsi.mFullWifiLockTimers, mBsi.mOnBatteryTimeBase); } mFullWifiLockTimer.startRunningLocked(elapsedRealtimeMs); } @@ -4861,8 +4927,8 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mWifiScanStarted) { mWifiScanStarted = true; if (mWifiScanTimer == null) { - mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN, - mWifiScanTimers, mOnBatteryTimeBase); + mWifiScanTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, WIFI_SCAN, + mBsi.mWifiScanTimers, mBsi.mOnBatteryTimeBase); } mWifiScanTimer.startRunningLocked(elapsedRealtimeMs); } @@ -4911,8 +4977,8 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mWifiMulticastEnabled) { mWifiMulticastEnabled = true; if (mWifiMulticastTimer == null) { - mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, - mWifiMulticastTimers, mOnBatteryTimeBase); + mWifiMulticastTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, + WIFI_MULTICAST_ENABLED, mBsi.mWifiMulticastTimers, mBsi.mOnBatteryTimeBase); } mWifiMulticastTimer.startRunningLocked(elapsedRealtimeMs); } @@ -4943,7 +5009,7 @@ public final class BatteryStatsImpl extends BatteryStats { public ControllerActivityCounterImpl getOrCreateWifiControllerActivityLocked() { if (mWifiControllerActivity == null) { - mWifiControllerActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase, + mWifiControllerActivity = new ControllerActivityCounterImpl(mBsi.mOnBatteryTimeBase, NUM_BT_TX_LEVELS); } return mWifiControllerActivity; @@ -4951,7 +5017,7 @@ public final class BatteryStatsImpl extends BatteryStats { public ControllerActivityCounterImpl getOrCreateBluetoothControllerActivityLocked() { if (mBluetoothControllerActivity == null) { - mBluetoothControllerActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase, + mBluetoothControllerActivity = new ControllerActivityCounterImpl(mBsi.mOnBatteryTimeBase, NUM_BT_TX_LEVELS); } return mBluetoothControllerActivity; @@ -4959,7 +5025,7 @@ public final class BatteryStatsImpl extends BatteryStats { public ControllerActivityCounterImpl getOrCreateModemControllerActivityLocked() { if (mModemControllerActivity == null) { - mModemControllerActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase, + mModemControllerActivity = new ControllerActivityCounterImpl(mBsi.mOnBatteryTimeBase, ModemActivityInfo.TX_POWER_LEVELS); } return mModemControllerActivity; @@ -4967,8 +5033,8 @@ public final class BatteryStatsImpl extends BatteryStats { public StopwatchTimer createAudioTurnedOnTimerLocked() { if (mAudioTurnedOnTimer == null) { - mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, - mAudioTurnedOnTimers, mOnBatteryTimeBase); + mAudioTurnedOnTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, AUDIO_TURNED_ON, + mBsi.mAudioTurnedOnTimers, mBsi.mOnBatteryTimeBase); } return mAudioTurnedOnTimer; } @@ -4991,8 +5057,8 @@ public final class BatteryStatsImpl extends BatteryStats { public StopwatchTimer createVideoTurnedOnTimerLocked() { if (mVideoTurnedOnTimer == null) { - mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, - mVideoTurnedOnTimers, mOnBatteryTimeBase); + mVideoTurnedOnTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, VIDEO_TURNED_ON, + mBsi.mVideoTurnedOnTimers, mBsi.mOnBatteryTimeBase); } return mVideoTurnedOnTimer; } @@ -5015,8 +5081,8 @@ public final class BatteryStatsImpl extends BatteryStats { public StopwatchTimer createFlashlightTurnedOnTimerLocked() { if (mFlashlightTurnedOnTimer == null) { - mFlashlightTurnedOnTimer = new StopwatchTimer(Uid.this, FLASHLIGHT_TURNED_ON, - mFlashlightTurnedOnTimers, mOnBatteryTimeBase); + mFlashlightTurnedOnTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, + FLASHLIGHT_TURNED_ON, mBsi.mFlashlightTurnedOnTimers, mBsi.mOnBatteryTimeBase); } return mFlashlightTurnedOnTimer; } @@ -5039,8 +5105,8 @@ public final class BatteryStatsImpl extends BatteryStats { public StopwatchTimer createCameraTurnedOnTimerLocked() { if (mCameraTurnedOnTimer == null) { - mCameraTurnedOnTimer = new StopwatchTimer(Uid.this, CAMERA_TURNED_ON, - mCameraTurnedOnTimers, mOnBatteryTimeBase); + mCameraTurnedOnTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, CAMERA_TURNED_ON, + mBsi.mCameraTurnedOnTimers, mBsi.mOnBatteryTimeBase); } return mCameraTurnedOnTimer; } @@ -5063,16 +5129,16 @@ public final class BatteryStatsImpl extends BatteryStats { public StopwatchTimer createForegroundActivityTimerLocked() { if (mForegroundActivityTimer == null) { - mForegroundActivityTimer = new StopwatchTimer( - Uid.this, FOREGROUND_ACTIVITY, null, mOnBatteryTimeBase); + mForegroundActivityTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, + FOREGROUND_ACTIVITY, null, mBsi.mOnBatteryTimeBase); } return mForegroundActivityTimer; } public StopwatchTimer createBluetoothScanTimerLocked() { if (mBluetoothScanTimer == null) { - mBluetoothScanTimer = new StopwatchTimer(Uid.this, BLUETOOTH_SCAN_ON, - mBluetoothScanOnTimers, mOnBatteryTimeBase); + mBluetoothScanTimer = new StopwatchTimer(mBsi.mClocks, Uid.this, BLUETOOTH_SCAN_ON, + mBsi.mBluetoothScanOnTimers, mBsi.mOnBatteryTimeBase); } return mBluetoothScanTimer; } @@ -5108,18 +5174,19 @@ public final class BatteryStatsImpl extends BatteryStats { public BatchTimer createVibratorOnTimerLocked() { if (mVibratorOnTimer == null) { - mVibratorOnTimer = new BatchTimer(Uid.this, VIBRATOR_ON, mOnBatteryTimeBase); + mVibratorOnTimer = new BatchTimer(mBsi.mClocks, Uid.this, VIBRATOR_ON, + mBsi.mOnBatteryTimeBase); } return mVibratorOnTimer; } public void noteVibratorOnLocked(long durationMillis) { - createVibratorOnTimerLocked().addDuration(BatteryStatsImpl.this, durationMillis); + createVibratorOnTimerLocked().addDuration(mBsi, durationMillis); } public void noteVibratorOffLocked() { if (mVibratorOnTimer != null) { - mVibratorOnTimer.abortLastDuration(BatteryStatsImpl.this); + mVibratorOnTimer.abortLastDuration(mBsi); } } @@ -5215,11 +5282,11 @@ public final class BatteryStatsImpl extends BatteryStats { if (i < 0 || i >= NUM_PROCESS_STATE) return; if (in == null) { - mProcessStateTimer[i] = new StopwatchTimer(this, PROCESS_STATE, null, - mOnBatteryTimeBase); + mProcessStateTimer[i] = new StopwatchTimer(mBsi.mClocks, this, PROCESS_STATE, null, + mBsi.mOnBatteryTimeBase); } else { - mProcessStateTimer[i] = new StopwatchTimer(this, PROCESS_STATE, null, - mOnBatteryTimeBase, in); + mProcessStateTimer[i] = new StopwatchTimer(mBsi.mClocks, this, PROCESS_STATE, null, + mBsi.mOnBatteryTimeBase, in); } } @@ -5266,17 +5333,17 @@ public final class BatteryStatsImpl extends BatteryStats { void makeWifiBatchedScanBin(int i, Parcel in) { if (i < 0 || i >= NUM_WIFI_BATCHED_SCAN_BINS) return; - ArrayList collected = mWifiBatchedScanTimers.get(i); + ArrayList collected = mBsi.mWifiBatchedScanTimers.get(i); if (collected == null) { collected = new ArrayList(); - mWifiBatchedScanTimers.put(i, collected); + mBsi.mWifiBatchedScanTimers.put(i, collected); } if (in == null) { - mWifiBatchedScanTimer[i] = new StopwatchTimer(this, WIFI_BATCHED_SCAN, collected, - mOnBatteryTimeBase); + mWifiBatchedScanTimer[i] = new StopwatchTimer(mBsi.mClocks, this, WIFI_BATCHED_SCAN, + collected, mBsi.mOnBatteryTimeBase); } else { - mWifiBatchedScanTimer[i] = new StopwatchTimer(this, WIFI_BATCHED_SCAN, collected, - mOnBatteryTimeBase, in); + mWifiBatchedScanTimer[i] = new StopwatchTimer(mBsi.mClocks, this, WIFI_BATCHED_SCAN, + collected, mBsi.mOnBatteryTimeBase, in); } } @@ -5284,7 +5351,7 @@ public final class BatteryStatsImpl extends BatteryStats { void initUserActivityLocked() { mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; for (int i=0; i pool = mSensorTimers.get(mHandle); + ArrayList pool = mBsi.mSensorTimers.get(mHandle); if (pool == null) { pool = new ArrayList(); - mSensorTimers.put(mHandle, pool); + mBsi.mSensorTimers.put(mHandle, pool); } - return new StopwatchTimer(Uid.this, 0, pool, timeBase, in); + return new StopwatchTimer(mBsi.mClocks, mUid, 0, pool, timeBase, in); } boolean reset() { @@ -6281,7 +6377,12 @@ public final class BatteryStatsImpl extends BatteryStats { /** * The statistics associated with a particular process. */ - public final class Proc extends BatteryStats.Uid.Proc implements TimeBaseObs { + public static class Proc extends BatteryStats.Uid.Proc implements TimeBaseObs { + /** + * BatteryStatsImpl that we are associated with. + */ + protected BatteryStatsImpl mBsi; + /** * The name of this process. */ @@ -6384,9 +6485,10 @@ public final class BatteryStatsImpl extends BatteryStats { ArrayList mExcessivePower; - Proc(String name) { + public Proc(BatteryStatsImpl bsi, String name) { + mBsi = bsi; mName = name; - mOnBatteryTimeBase.add(this); + mBsi.mOnBatteryTimeBase.add(this); } public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { @@ -6403,7 +6505,7 @@ public final class BatteryStatsImpl extends BatteryStats { void detach() { mActive = false; - mOnBatteryTimeBase.remove(this); + mBsi.mOnBatteryTimeBase.remove(this); } public int countExcessivePowers() { @@ -6617,7 +6719,12 @@ public final class BatteryStatsImpl extends BatteryStats { /** * The statistics associated with a particular package. */ - public final class Pkg extends BatteryStats.Uid.Pkg implements TimeBaseObs { + public static class Pkg extends BatteryStats.Uid.Pkg implements TimeBaseObs { + /** + * BatteryStatsImpl that we are associated with. + */ + protected BatteryStatsImpl mBsi; + /** * Number of times wakeup alarms have occurred for this app. */ @@ -6628,8 +6735,9 @@ public final class BatteryStatsImpl extends BatteryStats { */ final ArrayMap mServiceStats = new ArrayMap<>(); - Pkg() { - mOnBatteryScreenOffTimeBase.add(this); + public Pkg(BatteryStatsImpl bsi) { + mBsi = bsi; + mBsi.mOnBatteryScreenOffTimeBase.add(this); } public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { @@ -6639,7 +6747,7 @@ public final class BatteryStatsImpl extends BatteryStats { } void detach() { - mOnBatteryScreenOffTimeBase.remove(this); + mBsi.mOnBatteryScreenOffTimeBase.remove(this); } void readFromParcelLocked(Parcel in) { @@ -6647,14 +6755,14 @@ public final class BatteryStatsImpl extends BatteryStats { mWakeupAlarms.clear(); for (int i=0; i 0) { mLaunchedTime += time; } else { @@ -6880,14 +7005,14 @@ public final class BatteryStatsImpl extends BatteryStats { public void startRunningLocked() { if (!mRunning) { mStarts++; - mRunningSince = getBatteryUptimeLocked(); + mRunningSince = mBsi.getBatteryUptimeLocked(); mRunning = true; } } public void stopRunningLocked() { if (mRunning) { - long time = getBatteryUptimeLocked() - mRunningSince; + long time = mBsi.getBatteryUptimeLocked() - mRunningSince; if (time > 0) { mStartTime += time; } else { @@ -6898,7 +7023,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public BatteryStatsImpl getBatteryStats() { - return BatteryStatsImpl.this; + return mBsi; } @Override @@ -6937,7 +7062,7 @@ public final class BatteryStatsImpl extends BatteryStats { } final Serv newServiceStatsLocked() { - return new Serv(); + return new Serv(mBsi); } } @@ -6948,7 +7073,7 @@ public final class BatteryStatsImpl extends BatteryStats { public Proc getProcessStatsLocked(String name) { Proc ps = mProcessStats.get(name); if (ps == null) { - ps = new Proc(name); + ps = new Proc(mBsi, name); mProcessStats.put(name, ps); } @@ -6977,7 +7102,7 @@ public final class BatteryStatsImpl extends BatteryStats { if (mProcessState == uidRunningState) return; - final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long elapsedRealtime = mBsi.mClocks.elapsedRealtime(); if (mProcessState != ActivityManager.PROCESS_STATE_NONEXISTENT) { mProcessStateTimer[mProcessState].stopRunningLocked(elapsedRealtime); @@ -7011,7 +7136,7 @@ public final class BatteryStatsImpl extends BatteryStats { public Pkg getPackageStatsLocked(String name) { Pkg ps = mPackageStats.get(name); if (ps == null) { - ps = new Pkg(); + ps = new Pkg(mBsi); mPackageStats.put(name, ps); } @@ -7046,7 +7171,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void readWakeSummaryFromParcelLocked(String wlName, Parcel in) { - Wakelock wl = new Wakelock(); + Wakelock wl = new Wakelock(mBsi, this); mWakelockStats.add(wlName, wl); if (in.readInt() != 0) { wl.getStopwatchTimer(WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); @@ -7068,19 +7193,20 @@ public final class BatteryStatsImpl extends BatteryStats { if (!create) { return null; } - se = new Sensor(sensor); + se = new Sensor(mBsi, this, sensor); mSensorStats.put(sensor, se); } StopwatchTimer t = se.mTimer; if (t != null) { return t; } - ArrayList timers = mSensorTimers.get(sensor); + ArrayList timers = mBsi.mSensorTimers.get(sensor); if (timers == null) { timers = new ArrayList(); - mSensorTimers.put(sensor, timers); + mBsi.mSensorTimers.put(sensor, timers); } - t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mOnBatteryTimeBase); + t = new StopwatchTimer(mBsi.mClocks, this, BatteryStats.SENSOR, timers, + mBsi.mOnBatteryTimeBase); se.mTimer = t; return t; } @@ -7186,11 +7312,18 @@ public final class BatteryStatsImpl extends BatteryStats { } public BatteryStatsImpl getBatteryStats() { - return BatteryStatsImpl.this; + return mBsi; } } public BatteryStatsImpl(File systemDir, Handler handler, ExternalStatsSync externalSync) { + this(new SystemClocks(), systemDir, handler, externalSync); + } + + public BatteryStatsImpl(Clocks clocks, File systemDir, Handler handler, + ExternalStatsSync externalSync) { + init(clocks); + if (systemDir != null) { mFile = new JournaledFile(new File(systemDir, "batterystats.bin"), new File(systemDir, "batterystats.bin.tmp")); @@ -7202,24 +7335,28 @@ public final class BatteryStatsImpl extends BatteryStats { mExternalSync = externalSync; mHandler = new MyHandler(handler.getLooper()); mStartCount++; - mScreenOnTimer = new StopwatchTimer(null, -1, null, mOnBatteryTimeBase); + mScreenOnTimer = new StopwatchTimer(mClocks, null, -1, null, mOnBatteryTimeBase); for (int i=0; i 0) { mRecordingHistory = true; - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); + final long elapsedRealtime = mClocks.elapsedRealtime(); + final long uptime = mClocks.uptimeMillis(); if (USE_OLD_HISTORY) { addHistoryRecordLocked(elapsedRealtime, uptime, HistoryItem.CMD_START, mHistoryCur); } @@ -9663,7 +9799,7 @@ public final class BatteryStatsImpl extends BatteryStats { // We are just arbitrarily going to insert 1 minute from the sample of // the last run until samples in this run. if (mHistoryBaseTime > 0) { - long oldnow = SystemClock.elapsedRealtime(); + long oldnow = mClocks.elapsedRealtime(); mHistoryBaseTime = mHistoryBaseTime - oldnow + 1; if (DEBUG_HISTORY) { StringBuilder sb = new StringBuilder(128); @@ -9870,7 +10006,7 @@ public final class BatteryStatsImpl extends BatteryStats { } for (int iu = 0; iu < NU; iu++) { int uid = in.readInt(); - Uid u = new Uid(uid); + Uid u = new Uid(this, uid); mUidStats.put(uid, u); u.mWifiRunning = false; @@ -10083,8 +10219,8 @@ public final class BatteryStatsImpl extends BatteryStats { // if we had originally pulled a time before the RTC was set. long startClockTime = getStartClockTime(); - final long NOW_SYS = SystemClock.uptimeMillis() * 1000; - final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; + final long NOW_SYS = mClocks.uptimeMillis() * 1000; + final long NOWREAL_SYS = mClocks.elapsedRealtime() * 1000; out.writeInt(VERSION); @@ -10469,29 +10605,34 @@ public final class BatteryStatsImpl extends BatteryStats { mOnBatteryScreenOffTimeBase.readFromParcel(in); mScreenState = Display.STATE_UNKNOWN; - mScreenOnTimer = new StopwatchTimer(null, -1, null, mOnBatteryTimeBase, in); + mScreenOnTimer = new StopwatchTimer(mClocks, null, -1, null, mOnBatteryTimeBase, in); for (int i=0; i