diff --git a/core/java/com/android/internal/os/BatterySipper.java b/core/java/com/android/internal/os/BatterySipper.java index 5457c1d4cc033..5b6291e4523fa 100644 --- a/core/java/com/android/internal/os/BatterySipper.java +++ b/core/java/com/android/internal/os/BatterySipper.java @@ -113,19 +113,20 @@ public class BatterySipper implements Comparable { public double bluetoothPowerMah; public enum DrainType { - IDLE, - CELL, - PHONE, - WIFI, - BLUETOOTH, - FLASHLIGHT, - SCREEN, + AMBIENT_DISPLAY, APP, - USER, - UNACCOUNTED, - OVERCOUNTED, + BLUETOOTH, CAMERA, - MEMORY + CELL, + FLASHLIGHT, + IDLE, + MEMORY, + OVERCOUNTED, + PHONE, + SCREEN, + UNACCOUNTED, + USER, + WIFI, } public BatterySipper(DrainType drainType, Uid uid, double value) { diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index 5a59e70865e5f..a76cf0a2ddc54 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -643,6 +643,21 @@ public class BatteryStatsHelper { } } + /** + * Ambient display power is the additional power the screen takes while in ambient display/ + * screen doze/ always-on display (interchangeable terms) mode. Ambient display power should + * be hidden {@link #shouldHideSipper(BatterySipper)}, but should not be included in smearing + * {@link #removeHiddenBatterySippers(List)}. + */ + private void addAmbientDisplayUsage() { + long ambientDisplayMs = mStats.getScreenDozeTime(mRawRealtimeUs, mStatsType); + double power = mPowerProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY) + * ambientDisplayMs / (60 * 60 * 1000); + if (power > 0) { + addEntry(DrainType.AMBIENT_DISPLAY, ambientDisplayMs, power); + } + } + private void addRadioUsage() { BatterySipper radio = new BatterySipper(BatterySipper.DrainType.CELL, null, 0); mMobileRadioPowerCalculator.calculateRemaining(radio, mStats, mRawRealtimeUs, mRawUptimeUs, @@ -741,6 +756,7 @@ public class BatteryStatsHelper { addUserUsage(); addPhoneUsage(); addScreenUsage(); + addAmbientDisplayUsage(); addWiFiUsage(); addBluetoothUsage(); addMemoryUsage(); @@ -841,12 +857,13 @@ public class BatteryStatsHelper { final BatterySipper sipper = sippers.get(i); sipper.shouldHide = shouldHideSipper(sipper); if (sipper.shouldHide) { - if (sipper.drainType != BatterySipper.DrainType.OVERCOUNTED - && sipper.drainType != BatterySipper.DrainType.SCREEN - && sipper.drainType != BatterySipper.DrainType.UNACCOUNTED - && sipper.drainType != BatterySipper.DrainType.BLUETOOTH - && sipper.drainType != BatterySipper.DrainType.WIFI - && sipper.drainType != BatterySipper.DrainType.IDLE) { + if (sipper.drainType != DrainType.OVERCOUNTED + && sipper.drainType != DrainType.SCREEN + && sipper.drainType != DrainType.AMBIENT_DISPLAY + && sipper.drainType != DrainType.UNACCOUNTED + && sipper.drainType != DrainType.BLUETOOTH + && sipper.drainType != DrainType.WIFI + && sipper.drainType != DrainType.IDLE) { // Don't add it if it is overcounted, unaccounted or screen proportionalSmearPowerMah += sipper.totalPowerMah; } @@ -893,13 +910,14 @@ public class BatteryStatsHelper { * Check whether we should hide the battery sipper. */ public boolean shouldHideSipper(BatterySipper sipper) { - final BatterySipper.DrainType drainType = sipper.drainType; + final DrainType drainType = sipper.drainType; - return drainType == BatterySipper.DrainType.IDLE - || drainType == BatterySipper.DrainType.CELL - || drainType == BatterySipper.DrainType.SCREEN - || drainType == BatterySipper.DrainType.UNACCOUNTED - || drainType == BatterySipper.DrainType.OVERCOUNTED + return drainType == DrainType.IDLE + || drainType == DrainType.CELL + || drainType == DrainType.SCREEN + || drainType == DrainType.AMBIENT_DISPLAY + || drainType == DrainType.UNACCOUNTED + || drainType == DrainType.OVERCOUNTED || isTypeService(sipper) || isTypeSystem(sipper); } diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java index f4436d383a219..747d633ea1c36 100644 --- a/core/java/com/android/internal/os/PowerProfile.java +++ b/core/java/com/android/internal/os/PowerProfile.java @@ -104,7 +104,7 @@ public class PowerProfile { public static final String POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE = "modem.controller.voltage"; - /** + /** * Power consumption when GPS is on. */ public static final String POWER_GPS_ON = "gps.on"; @@ -136,6 +136,10 @@ public class PowerProfile { @Deprecated public static final String POWER_BLUETOOTH_AT_CMD = "bluetooth.at"; + /** + * Power consumption when screen is in doze/ambient/always-on mode, including backlight power. + */ + public static final String POWER_AMBIENT_DISPLAY = "ambient.on"; /** * Power consumption when screen is on, not including the backlight power. diff --git a/core/res/res/xml/power_profile.xml b/core/res/res/xml/power_profile.xml index d80c6972db1c2..bd0958dcf6c19 100644 --- a/core/res/res/xml/power_profile.xml +++ b/core/res/res/xml/power_profile.xml @@ -28,8 +28,9 @@ significantly, so should be measured on the shipping platform with a power meter. --> 0 - 0.1 - 0.1 + 0.1 + 0.1 + 0.1 0.1 0.1 0.1 diff --git a/core/res/res/xml/power_profile_test.xml b/core/res/res/xml/power_profile_test.xml index cdb71343e5e50..eb347325a5b69 100644 --- a/core/res/res/xml/power_profile_test.xml +++ b/core/res/res/xml/power_profile_test.xml @@ -80,6 +80,8 @@ 60 + + 0.5 100