diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index aab7b1f504ba9..545b19a24d852 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -346,10 +346,6 @@ public abstract class BatteryStats implements Parcelable { public abstract void noteWifiBatchedScanStoppedLocked(long elapsedRealtime); public abstract void noteWifiMulticastEnabledLocked(long elapsedRealtime); public abstract void noteWifiMulticastDisabledLocked(long elapsedRealtime); - public abstract void noteAudioTurnedOnLocked(long elapsedRealtime); - public abstract void noteAudioTurnedOffLocked(long elapsedRealtime); - public abstract void noteVideoTurnedOnLocked(long elapsedRealtime); - public abstract void noteVideoTurnedOffLocked(long elapsedRealtime); public abstract void noteActivityResumedLocked(long elapsedRealtime); public abstract void noteActivityPausedLocked(long elapsedRealtime); public abstract long getWifiRunningTime(long elapsedRealtimeUs, int which); diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index d91eb69a66e99..565550693c709 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -31,6 +31,8 @@ interface IBatteryStats { void noteStopVideo(int uid); void noteStartAudio(int uid); void noteStopAudio(int uid); + void noteResetVideo(); + void noteResetAudio(); // Remaining methods are only used in Java. byte[] getStatistics(); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index dec94f22a7193..aad11560e7ccf 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -172,6 +172,8 @@ public final class BatteryStatsImpl extends BatteryStats { final ArrayList mWifiScanTimers = new ArrayList(); final SparseArray> mWifiBatchedScanTimers = new SparseArray>(); + final ArrayList mAudioTurnedOnTimers = new ArrayList(); + final ArrayList mVideoTurnedOnTimers = new ArrayList(); // Last partial timers we use for distributing CPU usage. final ArrayList mLastPartialTimers = new ArrayList(); @@ -256,10 +258,10 @@ public final class BatteryStatsImpl extends BatteryStats { boolean mPhoneOn; StopwatchTimer mPhoneOnTimer; - boolean mAudioOn; + int mAudioOnNesting; StopwatchTimer mAudioOnTimer; - boolean mVideoOn; + int mVideoOnNesting; StopwatchTimer mVideoOnTimer; boolean mFlashlightOn; @@ -1472,6 +1474,13 @@ public final class BatteryStatsImpl extends BatteryStats { } } + void stopAllRunningLocked(long elapsedRealtimeMs) { + if (mNesting > 0) { + mNesting = 1; + stopRunningLocked(elapsedRealtimeMs); + } + } + // Update the total time for all other running Timers with the same type as this Timer // due to a change in timer count private static long refreshTimersLocked(long batteryRealtime, @@ -3187,27 +3196,29 @@ public final class BatteryStatsImpl extends BatteryStats { uid = mapUid(uid); final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); - if (!mAudioOn) { + if (mAudioOnNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(elapsedRealtime, uptime); - mAudioOn = true; mAudioOnTimer.startRunningLocked(elapsedRealtime); } + mAudioOnNesting++; getUidStatsLocked(uid).noteAudioTurnedOnLocked(elapsedRealtime); } public void noteAudioOffLocked(int uid) { + if (mAudioOnNesting == 0) { + return; + } uid = mapUid(uid); final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); - if (mAudioOn) { + if (--mAudioOnNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(elapsedRealtime, uptime); - mAudioOn = false; mAudioOnTimer.stopRunningLocked(elapsedRealtime); } getUidStatsLocked(uid).noteAudioTurnedOffLocked(elapsedRealtime); @@ -3217,32 +3228,68 @@ public final class BatteryStatsImpl extends BatteryStats { uid = mapUid(uid); final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); - if (!mVideoOn) { + if (mVideoOnNesting == 0) { mHistoryCur.states2 |= HistoryItem.STATE2_VIDEO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(elapsedRealtime, uptime); - mVideoOn = true; mVideoOnTimer.startRunningLocked(elapsedRealtime); } + mVideoOnNesting++; getUidStatsLocked(uid).noteVideoTurnedOnLocked(elapsedRealtime); } public void noteVideoOffLocked(int uid) { + if (mVideoOnNesting == 0) { + return; + } uid = mapUid(uid); final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); - if (mVideoOn) { + if (--mVideoOnNesting == 0) { mHistoryCur.states2 &= ~HistoryItem.STATE2_VIDEO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(elapsedRealtime, uptime); - mVideoOn = false; mVideoOnTimer.stopRunningLocked(elapsedRealtime); } getUidStatsLocked(uid).noteVideoTurnedOffLocked(elapsedRealtime); } + public void noteResetAudioLocked() { + if (mAudioOnNesting > 0) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long uptime = SystemClock.uptimeMillis(); + mAudioOnNesting = 0; + mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(elapsedRealtime, uptime); + mAudioOnTimer.stopAllRunningLocked(elapsedRealtime); + for (int i=0; i 0) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long uptime = SystemClock.uptimeMillis(); + mAudioOnNesting = 0; + mHistoryCur.states2 &= ~HistoryItem.STATE2_VIDEO_ON_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(elapsedRealtime, uptime); + mVideoOnTimer.stopAllRunningLocked(elapsedRealtime); + for (int i=0; i