From ab5c0ea43cf457b20ab4267a14b224f39e0511bf Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 29 Apr 2014 14:53:32 -0700 Subject: [PATCH] Add IBatteryStats API to retrieve current charge times. Also include charge/discharge information in dumpsys. Change-Id: Ica1b333ad334dc698d4a67da391b378757662f41 --- core/java/android/os/BatteryStats.java | 78 ++++++++++++++++++- .../android/internal/app/IBatteryStats.aidl | 8 ++ .../android/internal/os/BatteryStatsImpl.java | 35 ++++----- .../server/am/BatteryStatsService.java | 14 ++++ 4 files changed, 114 insertions(+), 21 deletions(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index f05ddde64ef79..9e9820f6980c4 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -173,6 +173,8 @@ public abstract class BatteryStats implements Parcelable { private static final String BLUETOOTH_STATE_COUNT_DATA = "bsc"; private static final String POWER_USE_SUMMARY_DATA = "pws"; private static final String POWER_USE_ITEM_DATA = "pwi"; + private static final String DISCHARGE_STEP_DATA = "dsd"; + private static final String CHARGE_STEP_DATA = "csd"; private final StringBuilder mFormatBuilder = new StringBuilder(32); private final Formatter mFormatter = new Formatter(mFormatBuilder); @@ -1339,6 +1341,18 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long computeBatteryTimeRemaining(long curTime); + /** + * Return the historical number of discharge steps we currently have. + */ + public abstract int getNumDischargeStepDurations(); + + /** + * Return the array of discharge step durations; the number of valid + * items in it is returned by {@link #getNumDischargeStepDurations()}. + * These values are in milliseconds. + */ + public abstract long[] getDischargeStepDurationsArray(); + /** * Compute an approximation for how much time (in microseconds) remains until the battery * is fully charged. Returns -1 if no time can be computed: either there is not @@ -1349,6 +1363,18 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long computeChargeTimeRemaining(long curTime); + /** + * Return the historical number of charge steps we currently have. + */ + public abstract int getNumChargeStepDurations(); + + /** + * Return the array of charge step durations; the number of valid + * items in it is returned by {@link #getNumChargeStepDurations()}. + * These values are in milliseconds. + */ + public abstract long[] getChargeStepDurationsArray(); + public abstract Map getWakeupReasonStats(); public abstract Map getKernelWakelockStats(); @@ -3120,6 +3146,28 @@ public abstract class BatteryStats implements Parcelable { pw.print(suffix); } + private static boolean dumpDurationSteps(PrintWriter pw, String header, long[] steps, + int count, boolean checkin) { + if (count <= 0) { + return false; + } + if (!checkin) { + pw.println(header); + } + String[] lineArgs = new String[1]; + for (int i=0; i= 0) { + pw.print(" Estimated discharge time remaining: "); + TimeUtils.formatDuration(timeRemaining / 1000, pw); + pw.println(); + } + pw.println(); + } + if (dumpDurationSteps(pw, "Charge step durations:", getChargeStepDurationsArray(), + getNumChargeStepDurations(), false)) { + long timeRemaining = computeChargeTimeRemaining(SystemClock.elapsedRealtime()); + if (timeRemaining >= 0) { + pw.print(" Estimated charge time remaining: "); + TimeUtils.formatDuration(timeRemaining / 1000, pw); + pw.println(); + } + pw.println(); } } @@ -3248,7 +3316,7 @@ public abstract class BatteryStats implements Parcelable { pw.println(" System starts: " + getStartCount() + ", currently on battery: " + getIsOnBattery()); dumpLocked(context, pw, "", STATS_SINCE_CHARGED, reqUid); - pw.println(""); + pw.println(); } if (!filtering || (flags&DUMP_UNPLUGGED_ONLY) != 0) { pw.println("Statistics since last unplugged:"); @@ -3352,6 +3420,12 @@ public abstract class BatteryStats implements Parcelable { } } } + if (!filtering) { + dumpDurationSteps(pw, DISCHARGE_STEP_DATA, getDischargeStepDurationsArray(), + getNumDischargeStepDurations(), true); + dumpDurationSteps(pw, CHARGE_STEP_DATA, getChargeStepDurationsArray(), + getNumChargeStepDurations(), true); + } if (!filtering || (flags&DUMP_CHARGED_ONLY) != 0) { dumpCheckinLocked(context, pw, STATS_SINCE_CHARGED, -1); } diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index fc89b318e28d7..1bb577b4d9981 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -31,6 +31,14 @@ interface IBatteryStats { // Remaining methods are only used in Java. byte[] getStatistics(); + // Return the computed amount of time remaining on battery, in milliseconds. + // Returns -1 if nothing could be computed. + long computeBatteryTimeRemaining(); + + // Return the computed amount of time remaining to fully charge, in milliseconds. + // Returns -1 if nothing could be computed. + long computeChargeTimeRemaining(); + void addIsolatedUid(int isolatedUid, int appUid); void removeIsolatedUid(int isolatedUid, int appUid); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 93d2297ce2cb6..f63fa8aee7c90 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -6358,6 +6358,14 @@ public final class BatteryStatsImpl extends BatteryStats { return (msPerLevel * mCurrentBatteryLevel) * 1000; } + public int getNumDischargeStepDurations() { + return mNumDischargeStepDurations; + } + + public long[] getDischargeStepDurationsArray() { + return mDischargeStepDurations; + } + @Override public long computeChargeTimeRemaining(long curTime) { if (mOnBattery) { @@ -6387,6 +6395,14 @@ public final class BatteryStatsImpl extends BatteryStats { return (msPerLevel * (100-mCurrentBatteryLevel)) * 1000; } + public int getNumChargeStepDurations() { + return mNumChargeStepDurations; + } + + public long[] getChargeStepDurationsArray() { + return mChargeStepDurations; + } + long getBatteryUptimeLocked() { return mOnBatteryTimeBase.getUptime(SystemClock.uptimeMillis() * 1000); } @@ -7705,25 +7721,6 @@ public final class BatteryStatsImpl extends BatteryStats { pr.println("*** Bluetooth active type #" + i + ":"); mBluetoothStateTimer[i].logState(pr, " "); } - StringBuilder sb = new StringBuilder(128); - if (mNumDischargeStepDurations > 0) { - pr.println("*** Discharge step durations:"); - for (int i=0; i 0) { - pr.println("*** Charge step durations:"); - for (int i=0; i= 0 ? (time/1000) : time; + } + } + + public long computeChargeTimeRemaining() { + synchronized (mStats) { + long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime()); + return time >= 0 ? (time/1000) : time; + } + } + public void addIsolatedUid(int isolatedUid, int appUid) { enforceCallingPermission(); synchronized (mStats) {