diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 63a7bb743806c..e78ce339d1203 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -911,6 +911,8 @@ public abstract class BatteryStats implements Parcelable { */ public abstract int getScreenOnCount(int which); + public abstract long getInteractiveTime(long elapsedRealtimeUs, int which); + public static final int SCREEN_BRIGHTNESS_DARK = 0; public static final int SCREEN_BRIGHTNESS_DIM = 1; public static final int SCREEN_BRIGHTNESS_MEDIUM = 2; @@ -936,8 +938,6 @@ public abstract class BatteryStats implements Parcelable { public abstract long getScreenBrightnessTime(int brightnessBin, long elapsedRealtimeUs, int which); - public abstract int getInputEventCount(int which); - /** * Returns the time in microseconds that the phone has been on while the device was * running on battery. @@ -1571,6 +1571,7 @@ public abstract class BatteryStats implements Parcelable { final long totalRealtime = computeRealtime(rawRealtime, which); final long totalUptime = computeUptime(rawUptime, which); final long screenOnTime = getScreenOnTime(rawRealtime, which); + final long interactiveTime = getInteractiveTime(rawRealtime, which); final long phoneOnTime = getPhoneOnTime(rawRealtime, which); final long wifiOnTime = getWifiOnTime(rawRealtime, which); final long wifiRunningTime = getGlobalWifiRunningTime(rawRealtime, which); @@ -1639,8 +1640,8 @@ public abstract class BatteryStats implements Parcelable { wifiRunningTime / 1000, bluetoothOnTime / 1000, mobileRxTotalBytes, mobileTxTotalBytes, wifiRxTotalBytes, wifiTxTotalBytes, fullWakeLockTimeTotal, partialWakeLockTimeTotal, - getInputEventCount(which), getMobileRadioActiveTime(rawRealtime, which), - getMobileRadioActiveAdjustedTime(which)); + 0 /*legacy input event count*/, getMobileRadioActiveTime(rawRealtime, which), + getMobileRadioActiveAdjustedTime(which), interactiveTime / 1000); // Dump screen brightness stats Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS]; @@ -2013,6 +2014,7 @@ public abstract class BatteryStats implements Parcelable { sb.append("realtime, "); formatTimeMs(sb, totalUptime / 1000); sb.append("uptime"); + pw.println(sb.toString()); if (batteryTimeRemaining >= 0) { sb.setLength(0); sb.append(prefix); @@ -2031,16 +2033,25 @@ public abstract class BatteryStats implements Parcelable { pw.println(DateFormat.format("yyyy-MM-dd-HH-mm-ss", getStartClockTime()).toString()); final long screenOnTime = getScreenOnTime(rawRealtime, which); + final long interactiveTime = getInteractiveTime(rawRealtime, which); final long phoneOnTime = getPhoneOnTime(rawRealtime, which); final long wifiRunningTime = getGlobalWifiRunningTime(rawRealtime, which); final long wifiOnTime = getWifiOnTime(rawRealtime, which); final long bluetoothOnTime = getBluetoothOnTime(rawRealtime, which); sb.setLength(0); + sb.append(prefix); + sb.append(" Interactive: "); formatTimeMs(sb, interactiveTime / 1000); + sb.append("("); sb.append(formatRatioLocked(interactiveTime, whichBatteryRealtime)); + sb.append(")"); + pw.println(sb.toString()); + sb.setLength(0); sb.append(prefix); sb.append(" Screen on: "); formatTimeMs(sb, screenOnTime / 1000); sb.append("("); sb.append(formatRatioLocked(screenOnTime, whichBatteryRealtime)); sb.append(") "); sb.append(getScreenOnCount(which)); - sb.append("x, Input events: "); sb.append(getInputEventCount(which)); + sb.append("x, Active phone call: "); formatTimeMs(sb, phoneOnTime / 1000); + sb.append("("); sb.append(formatRatioLocked(phoneOnTime, whichBatteryRealtime)); + sb.append(")"); pw.println(sb.toString()); if (phoneOnTime != 0) { sb.setLength(0); diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index 1bb577b4d9981..0454749572e28 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -59,11 +59,10 @@ interface IBatteryStats { void noteVibratorOff(int uid); void noteStartGps(int uid); void noteStopGps(int uid); - void noteScreenOn(); + void noteScreenState(int state); void noteScreenBrightness(int brightness); - void noteScreenOff(); - void noteInputEvent(); void noteUserActivity(int uid, int event); + void noteInteractive(boolean interactive); void noteMobileRadioPowerState(int powerState, long timestampNs); void notePhoneOn(); void notePhoneOff(); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index f63fa8aee7c90..1aff1909c045e 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -51,6 +51,7 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.TimeUtils; +import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.net.NetworkStatsFactory; @@ -88,7 +89,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 104 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 105 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -237,13 +238,14 @@ public final class BatteryStatsImpl extends BatteryStats { int mWakeLockNesting; boolean mWakeLockImportant; - boolean mScreenOn; + int mScreenState = Display.STATE_UNKNOWN; StopwatchTimer mScreenOnTimer; int mScreenBrightnessBin = -1; final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; - Counter mInputEventCounter; + boolean mInteractive; + StopwatchTimer mInteractiveTimer; boolean mPhoneOn; StopwatchTimer mPhoneOnTimer; @@ -2661,58 +2663,61 @@ public final class BatteryStatsImpl extends BatteryStats { getUidStatsLocked(uid).noteStopGps(elapsedRealtime); } - public void noteScreenOnLocked() { - if (!mScreenOn) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); - mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG; - if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " - + Integer.toHexString(mHistoryCur.states)); - addHistoryRecordLocked(elapsedRealtime, uptime); - mScreenOn = true; - mScreenOnTimer.startRunningLocked(elapsedRealtime); - if (mScreenBrightnessBin >= 0) { - mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(elapsedRealtime); - } + public void noteScreenStateLocked(int state) { + if (mScreenState != state) { + final int oldState = mScreenState; + mScreenState = state; + if (DEBUG) Slog.v(TAG, "Screen state: oldState=" + Display.stateToString(oldState) + + ", newState=" + Display.stateToString(state)); - updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), false, - SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000); + if (state == Display.STATE_ON) { + // Screen turning on. + final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long uptime = SystemClock.uptimeMillis(); + mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(elapsedRealtime, uptime); + mScreenOnTimer.startRunningLocked(elapsedRealtime); + if (mScreenBrightnessBin >= 0) { + mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(elapsedRealtime); + } - // Fake a wake lock, so we consider the device waked as long - // as the screen is on. - noteStartWakeLocked(-1, -1, "screen", null, WAKE_TYPE_PARTIAL, false, - elapsedRealtime, uptime); + updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), false, + SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000); - // Update discharge amounts. - if (mOnBatteryInternal) { - updateDischargeScreenLevelsLocked(false, true); - } - } - } + // Fake a wake lock, so we consider the device waked as long + // as the screen is on. + noteStartWakeLocked(-1, -1, "screen", null, WAKE_TYPE_PARTIAL, false, + elapsedRealtime, uptime); - public void noteScreenOffLocked() { - if (mScreenOn) { - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); - mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; - if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " - + Integer.toHexString(mHistoryCur.states)); - addHistoryRecordLocked(elapsedRealtime, uptime); - mScreenOn = false; - mScreenOnTimer.stopRunningLocked(elapsedRealtime); - if (mScreenBrightnessBin >= 0) { - mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(elapsedRealtime); - } + // Update discharge amounts. + if (mOnBatteryInternal) { + updateDischargeScreenLevelsLocked(false, true); + } + } else if (oldState == Display.STATE_ON) { + // Screen turning off or dozing. + final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long uptime = SystemClock.uptimeMillis(); + mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(elapsedRealtime, uptime); + mScreenOnTimer.stopRunningLocked(elapsedRealtime); + if (mScreenBrightnessBin >= 0) { + mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(elapsedRealtime); + } - noteStopWakeLocked(-1, -1, "screen", WAKE_TYPE_PARTIAL, - elapsedRealtime, uptime); + noteStopWakeLocked(-1, -1, "screen", WAKE_TYPE_PARTIAL, + elapsedRealtime, uptime); - updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), true, - SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000); + updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), true, + SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000); - // Update discharge amounts. - if (mOnBatteryInternal) { - updateDischargeScreenLevelsLocked(true, false); + // Update discharge amounts. + if (mOnBatteryInternal) { + updateDischargeScreenLevelsLocked(true, false); + } } } } @@ -2730,7 +2735,7 @@ public final class BatteryStatsImpl extends BatteryStats { if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(elapsedRealtime, uptime); - if (mScreenOn) { + if (mScreenState == Display.STATE_ON) { if (mScreenBrightnessBin >= 0) { mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(elapsedRealtime); } @@ -2740,10 +2745,6 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public void noteInputEventAtomic() { - mInputEventCounter.stepAtomic(); - } - public void noteUserActivityLocked(int uid, int event) { if (mOnBatteryInternal) { uid = mapUid(uid); @@ -2751,6 +2752,19 @@ public final class BatteryStatsImpl extends BatteryStats { } } + public void noteInteractiveLocked(boolean interactive) { + if (mInteractive != interactive) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); + mInteractive = interactive; + if (DEBUG) Slog.v(TAG, "Interactive: " + interactive); + if (interactive) { + mInteractiveTimer.startRunningLocked(elapsedRealtime); + } else { + mInteractiveTimer.stopRunningLocked(elapsedRealtime); + } + } + } + public void noteMobileRadioPowerState(int powerState, long timestampNs) { final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); @@ -3449,8 +3463,8 @@ public final class BatteryStatsImpl extends BatteryStats { elapsedRealtimeUs, which); } - @Override public int getInputEventCount(int which) { - return mInputEventCounter.getCountLocked(which); + @Override public long getInteractiveTime(long elapsedRealtimeUs, int which) { + return mInteractiveTimer.getTotalTimeLocked(elapsedRealtimeUs, which); } @Override public long getPhoneOnTime(long elapsedRealtimeUs, int which) { @@ -5499,7 +5513,6 @@ public final class BatteryStatsImpl extends BatteryStats { for (int i=0; i