From 9f08c607f8fae67888313853ce2323099090c6c4 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Thu, 13 May 2021 15:33:05 -0700 Subject: [PATCH] Use getUahDischarge when available Bug: 188092638 Test: atest FrameworksCoreTests:BatteryChargeCalculatorTest Change-Id: I66b9d232dcd4c674cd9bd7bae7843ae1124e1c34 --- .../internal/os/BatteryChargeCalculator.java | 9 ++++- .../os/BatteryChargeCalculatorTest.java | 38 +++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/core/java/com/android/internal/os/BatteryChargeCalculator.java b/core/java/com/android/internal/os/BatteryChargeCalculator.java index 0690d1f3fae67..81785298f8282 100644 --- a/core/java/com/android/internal/os/BatteryChargeCalculator.java +++ b/core/java/com/android/internal/os/BatteryChargeCalculator.java @@ -63,10 +63,15 @@ public class BatteryChargeCalculator extends PowerCalculator { builder.setChargeTimeRemainingMs(chargeTimeRemainingMs / 1000); } + long dischargeMah = batteryStats.getUahDischarge(BatteryStats.STATS_SINCE_CHARGED) / 1000; + if (dischargeMah == 0) { + dischargeMah = (long) ((dischargedPowerLowerBoundMah + dischargedPowerUpperBoundMah) / 2 + + 0.5); + } + builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) - .setConsumedPower( - (dischargedPowerLowerBoundMah + dischargedPowerUpperBoundMah) / 2); + .setConsumedPower(dischargeMah); } @Override diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryChargeCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryChargeCalculatorTest.java index 23fc35d6ffa59..6457e3f96d1c1 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryChargeCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryChargeCalculatorTest.java @@ -35,11 +35,13 @@ public class BatteryChargeCalculatorTest { private static final double PRECISION = 0.00001; @Rule - public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule() - .setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 1234.0); // Should be ignored + public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule(); @Test public void testDischargeTotals() { + // Nominal battery capacity should be ignored + mStatsRule.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 1234.0); + final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, @@ -56,7 +58,7 @@ public class BatteryChargeCalculatorTest { BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator); assertThat(batteryUsageStats.getConsumedPower()) - .isWithin(PRECISION).of(380.0); + .isWithin(PRECISION).of(1200.0); // 3,600 - 2,400 assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(10); assertThat(batteryUsageStats.getDischargedPowerRange().getLower()) .isWithin(PRECISION).of(360.0); @@ -74,4 +76,34 @@ public class BatteryChargeCalculatorTest { assertThat(batteryUsageStats.getChargeTimeRemainingMs()).isEqualTo(100_000); } + + @Test + public void testDischargeTotals_chargeUahUnavailable() { + mStatsRule.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0); + + final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); + + batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, + /* plugType */ 0, 90, 72, 3700, 0, 0, 0, + 1_000_000, 1_000_000, 1_000_000); + batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, + /* plugType */ 0, 85, 72, 3700, 0, 0, 0, + 1_500_000, 1_500_000, 1_500_000); + batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, + /* plugType */ 0, 80, 72, 3700, 0, 0, 0, + 2_000_000, 2_000_000, 2_000_000); + + BatteryChargeCalculator calculator = new BatteryChargeCalculator(); + BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator); + + assertThat(batteryUsageStats.getConsumedPower()) + .isWithin(PRECISION).of(380.0); // 9.5% of 4,000. + assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(10); + assertThat(batteryUsageStats.getDischargedPowerRange().getLower()) + .isWithin(PRECISION).of(360.0); // 9% of 4,000 + assertThat(batteryUsageStats.getDischargedPowerRange().getUpper()) + .isWithin(PRECISION).of(400.0); // 10% of 4,000 + assertThat(batteryUsageStats.getBatteryTimeRemainingMs()).isEqualTo(8_000_000); + assertThat(batteryUsageStats.getChargeTimeRemainingMs()).isEqualTo(-1); + } }