From abc7c499133fe640d6ece2b28d43b52e66cdaa9a Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Mon, 30 Jun 2014 16:57:46 -0700 Subject: [PATCH] Issue #15986092: Add power tracking of flashlight. Not yet hooked up. Change-Id: Id95e44ecc365e9f38169c0a629b0a48ddb29aa06 --- core/java/android/os/BatteryStats.java | 25 ++++++++++ .../android/internal/app/IBatteryStats.aidl | 2 + .../android/internal/os/BatterySipper.java | 1 + .../internal/os/BatteryStatsHelper.java | 10 ++++ .../android/internal/os/BatteryStatsImpl.java | 49 ++++++++++++++++++- .../com/android/internal/os/PowerProfile.java | 5 ++ .../server/am/BatteryStatsService.java | 14 ++++++ 7 files changed, 105 insertions(+), 1 deletion(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index f7d2bfd6c87c1..21d60c566013c 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -614,6 +614,7 @@ public abstract class BatteryStats implements Parcelable { public static final int STATE2_VIDEO_ON_FLAG = 1<<30; public static final int STATE2_WIFI_RUNNING_FLAG = 1<<29; public static final int STATE2_WIFI_ON_FLAG = 1<<28; + public static final int STATE2_FLASHLIGHT_FLAG = 1<<27; public static final int MOST_INTERESTING_STATES2 = STATE2_LOW_POWER_FLAG | STATE2_WIFI_ON_FLAG; @@ -1235,6 +1236,7 @@ public abstract class BatteryStats implements Parcelable { new BitDescription(HistoryItem.STATE2_VIDEO_ON_FLAG, "video", "v"), new BitDescription(HistoryItem.STATE2_WIFI_RUNNING_FLAG, "wifi_running", "Wr"), new BitDescription(HistoryItem.STATE2_WIFI_ON_FLAG, "wifi", "W"), + new BitDescription(HistoryItem.STATE2_FLASHLIGHT_FLAG, "flashlight", "fl"), new BitDescription(HistoryItem.STATE2_WIFI_SIGNAL_STRENGTH_MASK, HistoryItem.STATE2_WIFI_SIGNAL_STRENGTH_SHIFT, "wifi_signal_strength", "Wss", new String[] { "0", "1", "2", "3", "4" }, @@ -1370,6 +1372,22 @@ public abstract class BatteryStats implements Parcelable { */ public abstract int getBluetoothStateCount(int bluetoothState, int which); + /** + * Returns the time in microseconds that the flashlight has been on while the device was + * running on battery. + * + * {@hide} + */ + public abstract long getFlashlightOnTime(long elapsedRealtimeUs, int which); + + /** + * Returns the number of times that the flashlight has been turned on while the device was + * running on battery. + * + * {@hide} + */ + public abstract long getFlashlightOnCount(int which); + public static final int NETWORK_MOBILE_RX_DATA = 0; public static final int NETWORK_MOBILE_TX_DATA = 1; public static final int NETWORK_WIFI_RX_DATA = 2; @@ -1965,6 +1983,9 @@ public abstract class BatteryStats implements Parcelable { case SCREEN: label="scrn"; break; + case FLASHLIGHT: + label="flashlight"; + break; case APP: uid = bs.uidObj.getUid(); label = "uid"; @@ -2637,6 +2658,10 @@ public abstract class BatteryStats implements Parcelable { pw.print(prefix); pw.print(" Screen: "); printmAh(pw, bs.value); pw.println(); break; + case FLASHLIGHT: + pw.print(prefix); pw.print(" Flashlight: "); printmAh(pw, bs.value); + pw.println(); + break; case APP: pw.print(prefix); pw.print(" Uid "); UserHandle.formatUid(pw, bs.uidObj.getUid()); diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index 7a9137b6206f4..ae9b51531343d 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -58,6 +58,8 @@ interface IBatteryStats { void noteVibratorOn(int uid, long durationMillis); void noteVibratorOff(int uid); + void noteFlashlightOn(); + void noteFlashlightOff(); void noteStartGps(int uid); void noteStopGps(int uid); void noteScreenState(int state); diff --git a/core/java/com/android/internal/os/BatterySipper.java b/core/java/com/android/internal/os/BatterySipper.java index 6ca24d7d608ac..247c8feab80d9 100644 --- a/core/java/com/android/internal/os/BatterySipper.java +++ b/core/java/com/android/internal/os/BatterySipper.java @@ -54,6 +54,7 @@ public class BatterySipper implements Comparable { PHONE, WIFI, BLUETOOTH, + FLASHLIGHT, SCREEN, APP, USER, diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index 7ff949e717290..469aa6fd79c8f 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -706,6 +706,15 @@ public class BatteryStatsHelper { } } + private void addFlashlightUsage() { + long flashlightOnTimeMs = mStats.getFlashlightOnTime(mRawRealtime, mStatsType) / 1000; + double flashlightPower = flashlightOnTimeMs + * mPowerProfile.getAveragePower(PowerProfile.POWER_FLASHLIGHT) / (60*60*1000); + if (flashlightPower != 0) { + addEntry(BatterySipper.DrainType.FLASHLIGHT, flashlightOnTimeMs, flashlightPower); + } + } + private void addUserUsage() { for (int i=0; i= 0 && type < mNetworkByteActivityCounters.length) { @@ -5681,6 +5718,7 @@ public final class BatteryStatsImpl extends BatteryStats { } mAudioOnTimer = new StopwatchTimer(null, -7, null, mOnBatteryTimeBase); mVideoOnTimer = new StopwatchTimer(null, -8, null, mOnBatteryTimeBase); + mFlashlightOnTimer = new StopwatchTimer(null, -9, null, mOnBatteryTimeBase); mOnBattery = mOnBatteryInternal = false; long uptime = SystemClock.uptimeMillis() * 1000; long realtime = SystemClock.elapsedRealtime() * 1000; @@ -5930,6 +5968,7 @@ public final class BatteryStatsImpl extends BatteryStats { mPhoneOnTimer.reset(false); mAudioOnTimer.reset(false); mVideoOnTimer.reset(false); + mFlashlightOnTimer.reset(false); for (int i=0; i 10000) { @@ -7381,6 +7422,7 @@ public final class BatteryStatsImpl extends BatteryStats { for (int i=0; i< NUM_BLUETOOTH_STATES; i++) { mBluetoothStateTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS); } + mFlashlightOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS); out.writeInt(mKernelWakelockStats.size()); for (Map.Entry ent : mKernelWakelockStats.entrySet()) { @@ -7667,6 +7709,8 @@ public final class BatteryStatsImpl extends BatteryStats { mAudioOnTimer = new StopwatchTimer(null, -7, null, mOnBatteryTimeBase); mVideoOn = false; mVideoOnTimer = new StopwatchTimer(null, -8, null, mOnBatteryTimeBase); + mFlashlightOn = false; + mFlashlightOnTimer = new StopwatchTimer(null, -9, null, mOnBatteryTimeBase, in); mDischargeUnplugLevel = in.readInt(); mDischargePlugLevel = in.readInt(); mDischargeCurrentLevel = in.readInt(); @@ -7798,6 +7842,7 @@ public final class BatteryStatsImpl extends BatteryStats { for (int i=0; i< NUM_BLUETOOTH_STATES; i++) { mBluetoothStateTimer[i].writeToParcel(out, uSecRealtime); } + mFlashlightOnTimer.writeToParcel(out, uSecRealtime); out.writeInt(mDischargeUnplugLevel); out.writeInt(mDischargePlugLevel); out.writeInt(mDischargeCurrentLevel); @@ -7931,6 +7976,8 @@ public final class BatteryStatsImpl extends BatteryStats { pr.println("*** Bluetooth active type #" + i + ":"); mBluetoothStateTimer[i].logState(pr, " "); } + pr.println("*** Flashlight timer:"); + mFlashlightOnTimer.logState(pr, " "); } super.dumpLocked(context, pw, flags, reqUid, histStart); } diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java index 94750d376608b..b3bafa1007bd5 100644 --- a/core/java/com/android/internal/os/PowerProfile.java +++ b/core/java/com/android/internal/os/PowerProfile.java @@ -133,6 +133,11 @@ public class PowerProfile { */ public static final String POWER_VIDEO = "dsp.video"; + /** + * Power consumption when camera flashlight is on. + */ + public static final String POWER_FLASHLIGHT = "camera.flashlight"; + public static final String POWER_CPU_SPEEDS = "cpu.speeds"; /** diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 3cbc6e2635685..5c5e3e3fae7e0 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -365,6 +365,20 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + public void noteFlashlightOn() { + enforceCallingPermission(); + synchronized (mStats) { + mStats.noteFlashlightOnLocked(); + } + } + + public void noteFlashlightOff() { + enforceCallingPermission(); + synchronized (mStats) { + mStats.noteFlashlightOffLocked(); + } + } + public void noteWifiRunning(WorkSource ws) { enforceCallingPermission(); synchronized (mStats) {