From 782a906e7149b190f2d4efc532e4568953c03ebf Mon Sep 17 00:00:00 2001 From: Michael Wachenschwanz Date: Mon, 13 Sep 2021 21:45:53 -0700 Subject: [PATCH 1/2] Collect data from multiple DISPLAY EnergyConsumers Update MeasuredEnergySnapshot and BatteryExternalStatsWorker to handle multiple Display EnergyConsumers. Note: Utilizing the energy consumer data will occur in a follow up CL. Bug: 194107383 Test: atest FrameworksServicesTests:com.android.server.am.MeasuredEnergySnapshotTest Test: atest FrameworksServicesTests:BatteryExternalStatsWorkerTes Change-Id: Ic457b799c0e4ec78e83c1c9559dcfd38027f119a --- .../server/am/BatteryExternalStatsWorker.java | 11 +++++---- .../server/am/MeasuredEnergySnapshot.java | 11 +++++++-- .../am/BatteryExternalStatsWorkerTest.java | 23 +++++++++++++------ .../server/am/MeasuredEnergySnapshotTest.java | 16 ++++++------- 4 files changed, 39 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java index 7ba032f683b85..e9aa3be8b403d 100644 --- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java @@ -659,11 +659,13 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { // Inform mStats about each applicable measured energy (unless addressed elsewhere). if (measuredEnergyDeltas != null) { - final long displayChargeUC = measuredEnergyDeltas.displayChargeUC; - if (displayChargeUC != MeasuredEnergySnapshot.UNAVAILABLE) { + final long[] displayChargeUC = measuredEnergyDeltas.displayChargeUC; + if (displayChargeUC != null && displayChargeUC.length > 0) { + // TODO (b/194107383): pass all display ordinals to mStats. + final long primaryDisplayChargeUC = displayChargeUC[0]; // If updating, pass in what BatteryExternalStatsWorker thinks screenState is. - mStats.updateDisplayMeasuredEnergyStatsLocked(displayChargeUC, screenState, - elapsedRealtime); + mStats.updateDisplayMeasuredEnergyStatsLocked(primaryDisplayChargeUC, + screenState, elapsedRealtime); } final long gnssChargeUC = measuredEnergyDeltas.gnssChargeUC; @@ -948,6 +950,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { switch (consumer.type) { case EnergyConsumerType.OTHER: case EnergyConsumerType.CPU_CLUSTER: + case EnergyConsumerType.DISPLAY: break; default: Slog.w(TAG, "EnergyConsumer '" + consumer.name + "' has unexpected ordinal " diff --git a/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java b/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java index a9fca4f240269..0359aa531c644 100644 --- a/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java +++ b/services/core/java/com/android/server/am/MeasuredEnergySnapshot.java @@ -49,6 +49,9 @@ public class MeasuredEnergySnapshot { /** Number of ordinals for {@link EnergyConsumerType#CPU_CLUSTER}. */ private final int mNumCpuClusterOrdinals; + /** Number of ordinals for {@link EnergyConsumerType#DISPLAY}. */ + private final int mNumDisplayOrdinals; + /** Number of ordinals for {@link EnergyConsumerType#OTHER}. */ private final int mNumOtherOrdinals; @@ -95,6 +98,7 @@ public class MeasuredEnergySnapshot { mNumCpuClusterOrdinals = calculateNumOrdinals(EnergyConsumerType.CPU_CLUSTER, idToConsumerMap); + mNumDisplayOrdinals = calculateNumOrdinals(EnergyConsumerType.DISPLAY, idToConsumerMap); mNumOtherOrdinals = calculateNumOrdinals(EnergyConsumerType.OTHER, idToConsumerMap); mAttributionSnapshots = new SparseArray<>(mNumOtherOrdinals); } @@ -108,7 +112,7 @@ public class MeasuredEnergySnapshot { public long[] cpuClusterChargeUC = null; /** The chargeUC for {@link EnergyConsumerType#DISPLAY}. */ - public long displayChargeUC = UNAVAILABLE; + public long[] displayChargeUC = null; /** The chargeUC for {@link EnergyConsumerType#GNSS}. */ public long gnssChargeUC = UNAVAILABLE; @@ -212,7 +216,10 @@ public class MeasuredEnergySnapshot { break; case EnergyConsumerType.DISPLAY: - output.displayChargeUC = deltaChargeUC; + if (output.displayChargeUC == null) { + output.displayChargeUC = new long[mNumDisplayOrdinals]; + } + output.displayChargeUC[ordinal] = deltaChargeUC; break; case EnergyConsumerType.GNSS: diff --git a/services/tests/servicestests/src/com/android/server/am/BatteryExternalStatsWorkerTest.java b/services/tests/servicestests/src/com/android/server/am/BatteryExternalStatsWorkerTest.java index 4a67ec71fcaaa..8a8a6246b73b1 100644 --- a/services/tests/servicestests/src/com/android/server/am/BatteryExternalStatsWorkerTest.java +++ b/services/tests/servicestests/src/com/android/server/am/BatteryExternalStatsWorkerTest.java @@ -74,15 +74,20 @@ public class BatteryExternalStatsWorkerTest { @Test public void testTargetedEnergyConsumerQuerying() { final int numCpuClusters = 4; + final int numDisplays = 5; final int numOther = 3; // Add some energy consumers used by BatteryExternalStatsWorker. final IntArray tempAllIds = new IntArray(); - final int displayId = mPowerStatsInternal.addEnergyConsumer(EnergyConsumerType.DISPLAY, 0, - "display"); - tempAllIds.add(displayId); - mPowerStatsInternal.incrementEnergyConsumption(displayId, 12345); + final int[] displayIds = new int[numDisplays]; + for (int i = 0; i < numDisplays; i++) { + displayIds[i] = mPowerStatsInternal.addEnergyConsumer( + EnergyConsumerType.DISPLAY, i, "display" + i); + tempAllIds.add(displayIds[i]); + mPowerStatsInternal.incrementEnergyConsumption(displayIds[i], 12345 + i); + } + Arrays.sort(displayIds); final int wifiId = mPowerStatsInternal.addEnergyConsumer(EnergyConsumerType.WIFI, 0, "wifi"); @@ -130,9 +135,13 @@ public class BatteryExternalStatsWorkerTest { final EnergyConsumerResult[] displayResults = mBatteryExternalStatsWorker.getMeasuredEnergyLocked(UPDATE_DISPLAY).getNow(null); - // Results should only have the display energy consumer - assertEquals(1, displayResults.length); - assertEquals(displayId, displayResults[0].id); + // Results should only have the cpu cluster energy consumers + final int[] receivedDisplayIds = new int[displayResults.length]; + for (int i = 0; i < displayResults.length; i++) { + receivedDisplayIds[i] = displayResults[i].id; + } + Arrays.sort(receivedDisplayIds); + assertArrayEquals(displayIds, receivedDisplayIds); final EnergyConsumerResult[] wifiResults = mBatteryExternalStatsWorker.getMeasuredEnergyLocked(UPDATE_WIFI).getNow(null); diff --git a/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java b/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java index 8c87506295f30..a0cbcadee8446 100644 --- a/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java +++ b/services/tests/servicestests/src/com/android/server/am/MeasuredEnergySnapshotTest.java @@ -16,8 +16,6 @@ package com.android.server.am; -import static com.android.server.am.MeasuredEnergySnapshot.UNAVAILABLE; - import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; @@ -120,7 +118,7 @@ public final class MeasuredEnergySnapshotTest { // results0 MeasuredEnergyDeltaData delta = snapshot.updateAndGetDelta(RESULTS_0, VOLTAGE_0); if (delta != null) { // null is fine here. If non-null, it better be uninteresting though. - assertEquals(UNAVAILABLE, delta.displayChargeUC); + assertNull(delta.displayChargeUC); assertNull(delta.otherTotalChargeUC); assertNull(delta.otherUidChargesUC); } @@ -130,7 +128,7 @@ public final class MeasuredEnergySnapshotTest { assertNotNull(delta); long expectedChargeUC; expectedChargeUC = calculateChargeConsumedUC(14_000, VOLTAGE_0, 24_000, VOLTAGE_1); - assertEquals(expectedChargeUC, delta.displayChargeUC); + assertEquals(expectedChargeUC, delta.displayChargeUC[0]); assertNotNull(delta.otherTotalChargeUC); @@ -149,14 +147,14 @@ public final class MeasuredEnergySnapshotTest { delta = snapshot.updateAndGetDelta(RESULTS_2, VOLTAGE_2); assertNotNull(delta); expectedChargeUC = calculateChargeConsumedUC(24_000, VOLTAGE_1, 36_000, VOLTAGE_2); - assertEquals(expectedChargeUC, delta.displayChargeUC); + assertEquals(expectedChargeUC, delta.displayChargeUC[0]); assertNull(delta.otherUidChargesUC); assertNull(delta.otherTotalChargeUC); // results3 delta = snapshot.updateAndGetDelta(RESULTS_3, VOLTAGE_3); assertNotNull(delta); - assertEquals(UNAVAILABLE, delta.displayChargeUC); + assertNull(delta.displayChargeUC); assertNotNull(delta.otherTotalChargeUC); @@ -183,7 +181,7 @@ public final class MeasuredEnergySnapshotTest { delta = snapshot.updateAndGetDelta(RESULTS_4, VOLTAGE_4); assertNotNull(delta); expectedChargeUC = calculateChargeConsumedUC(36_000, VOLTAGE_2, 43_000, VOLTAGE_4); - assertEquals(expectedChargeUC, delta.displayChargeUC); + assertEquals(expectedChargeUC, delta.displayChargeUC[0]); assertNotNull(delta.otherTotalChargeUC); expectedChargeUC = calculateChargeConsumedUC(190_000, VOLTAGE_3, 290_000, VOLTAGE_4); @@ -210,7 +208,7 @@ public final class MeasuredEnergySnapshotTest { // results0 MeasuredEnergyDeltaData delta = snapshot.updateAndGetDelta(RESULTS_0, VOLTAGE_0); if (delta != null) { // null is fine here. If non-null, it better be uninteresting though. - assertEquals(UNAVAILABLE, delta.displayChargeUC); + assertNull(delta.displayChargeUC); assertNull(delta.otherTotalChargeUC); assertNull(delta.otherUidChargesUC); } @@ -220,7 +218,7 @@ public final class MeasuredEnergySnapshotTest { assertNotNull(delta); final long expectedChargeUC = calculateChargeConsumedUC(14_000, VOLTAGE_0, 24_000, VOLTAGE_1); - assertEquals(expectedChargeUC, delta.displayChargeUC); + assertEquals(expectedChargeUC, delta.displayChargeUC[0]); assertNull(delta.otherTotalChargeUC); // Although in the results, they're not in the idMap assertNull(delta.otherUidChargesUC); } From 8ac63071a4e6da7e0740f5eb6c6753218efcfd3a Mon Sep 17 00:00:00 2001 From: Michael Wachenschwanz Date: Thu, 16 Sep 2021 19:25:40 -0700 Subject: [PATCH 2/2] Update PowerProfile to support multidisplay devices Replaced the display related power constants with new ones that support multidisply. The legacy constants are marked as UnsupportedAppUsage, so they have not been removed yet and they attempting to read them will return the power constant values for the first display. Fixes: 200226329 Test: atest com.android.internal.os.PowerProfileTest#testPowerProfile Test: atest FrameworksCoreTests:com.android.internal.os.BatteryStatsTests Change-Id: Id181443bd6f553ee37fc4a1647d31644fcad7912 --- .../os/AmbientDisplayPowerCalculator.java | 5 +- .../com/android/internal/os/PowerProfile.java | 122 ++++++++++++++++++ .../internal/os/ScreenPowerCalculator.java | 8 +- core/res/res/xml/power_profile.xml | 30 ++++- .../os/AmbientDisplayPowerCalculatorTest.java | 4 +- .../internal/os/BatteryUsageStatsRule.java | 8 ++ .../android/internal/os/PowerProfileTest.java | 11 +- .../os/ScreenPowerCalculatorTest.java | 7 +- 8 files changed, 185 insertions(+), 10 deletions(-) diff --git a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java index 0307268a28b5a..93baa193570de 100644 --- a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +++ b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java @@ -16,6 +16,8 @@ package com.android.internal.os; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_AMBIENT; + import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; @@ -32,8 +34,9 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator { private final UsageBasedPowerEstimator mPowerEstimator; public AmbientDisplayPowerCalculator(PowerProfile powerProfile) { + // TODO(b/200239964): update to support multidisplay. mPowerEstimator = new UsageBasedPowerEstimator( - powerProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY)); + powerProfile.getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_AMBIENT, 0)); } /** diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java index add2304afe9dc..4d19b35b1e166 100644 --- a/core/java/com/android/internal/os/PowerProfile.java +++ b/core/java/com/android/internal/os/PowerProfile.java @@ -17,10 +17,12 @@ package com.android.internal.os; +import android.annotation.StringDef; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.Resources; import android.content.res.XmlResourceParser; +import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; @@ -30,6 +32,8 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashMap; @@ -40,6 +44,8 @@ import java.util.HashMap; */ public class PowerProfile { + public static final String TAG = "PowerProfile"; + /* * POWER_CPU_SUSPEND: Power consumption when CPU is in power collapse mode. * POWER_CPU_IDLE: Power consumption when CPU is awake (when a wake lock is held). This should @@ -145,12 +151,18 @@ public class PowerProfile { /** * Power consumption when screen is in doze/ambient/always-on mode, including backlight power. + * + * @deprecated Use {@link #POWER_GROUP_DISPLAY_AMBIENT} instead. */ + @Deprecated public static final String POWER_AMBIENT_DISPLAY = "ambient.on"; /** * Power consumption when screen is on, not including the backlight power. + * + * @deprecated Use {@link #POWER_GROUP_DISPLAY_SCREEN_ON} instead. */ + @Deprecated @UnsupportedAppUsage public static final String POWER_SCREEN_ON = "screen.on"; @@ -175,7 +187,10 @@ public class PowerProfile { /** * Power consumption at full backlight brightness. If the backlight is at * 50% brightness, then this should be multiplied by 0.5 + * + * @deprecated Use {@link #POWER_GROUP_DISPLAY_SCREEN_FULL} instead. */ + @Deprecated @UnsupportedAppUsage public static final String POWER_SCREEN_FULL = "screen.full"; @@ -220,6 +235,29 @@ public class PowerProfile { */ public static final String POWER_BATTERY_CAPACITY = "battery.capacity"; + /** + * Power consumption when a screen is in doze/ambient/always-on mode, including backlight power. + */ + public static final String POWER_GROUP_DISPLAY_AMBIENT = "ambient.on.display"; + + /** + * Power consumption when a screen is on, not including the backlight power. + */ + public static final String POWER_GROUP_DISPLAY_SCREEN_ON = "screen.on.display"; + + /** + * Power consumption of a screen at full backlight brightness. + */ + public static final String POWER_GROUP_DISPLAY_SCREEN_FULL = "screen.full.display"; + + @StringDef(prefix = { "POWER_GROUP_" }, value = { + POWER_GROUP_DISPLAY_AMBIENT, + POWER_GROUP_DISPLAY_SCREEN_ON, + POWER_GROUP_DISPLAY_SCREEN_FULL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface PowerGroup {} + /** * A map from Power Use Item to its power consumption. */ @@ -255,6 +293,7 @@ public class PowerProfile { readPowerValuesFromXml(context, forTest); } initCpuClusters(); + initDisplays(); } } @@ -424,6 +463,58 @@ public class PowerProfile { return 0; } + private int mNumDisplays; + + private void initDisplays() { + // Figure out how many displays are listed in the power profile. + mNumDisplays = 0; + while (!Double.isNaN( + getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_AMBIENT, mNumDisplays, Double.NaN)) + || !Double.isNaN( + getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_ON, mNumDisplays, Double.NaN)) + || !Double.isNaN( + getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_FULL, mNumDisplays, + Double.NaN))) { + mNumDisplays++; + } + + // Handle legacy display power constants. + final Double deprecatedAmbientDisplay = sPowerItemMap.get(POWER_AMBIENT_DISPLAY); + boolean legacy = false; + if (deprecatedAmbientDisplay != null && mNumDisplays == 0) { + final String key = getOrdinalPowerType(POWER_GROUP_DISPLAY_AMBIENT, 0); + Slog.w(TAG, POWER_AMBIENT_DISPLAY + " is deprecated! Use " + key + " instead."); + sPowerItemMap.put(key, deprecatedAmbientDisplay); + legacy = true; + } + + final Double deprecatedScreenOn = sPowerItemMap.get(POWER_SCREEN_ON); + if (deprecatedScreenOn != null && mNumDisplays == 0) { + final String key = getOrdinalPowerType(POWER_GROUP_DISPLAY_SCREEN_ON, 0); + Slog.w(TAG, POWER_SCREEN_ON + " is deprecated! Use " + key + " instead."); + sPowerItemMap.put(key, deprecatedScreenOn); + legacy = true; + } + + final Double deprecatedScreenFull = sPowerItemMap.get(POWER_SCREEN_FULL); + if (deprecatedScreenFull != null && mNumDisplays == 0) { + final String key = getOrdinalPowerType(POWER_GROUP_DISPLAY_SCREEN_FULL, 0); + Slog.w(TAG, POWER_SCREEN_FULL + " is deprecated! Use " + key + " instead."); + sPowerItemMap.put(key, deprecatedScreenFull); + legacy = true; + } + if (legacy) { + mNumDisplays = 1; + } + } + + /** + * Returns the number built in displays on the device as defined in the power_profile.xml. + */ + public int getNumDisplays() { + return mNumDisplays; + } + /** * Returns the number of memory bandwidth buckets defined in power_profile.xml, or a * default value if the subsystem has no recorded value. @@ -495,6 +586,32 @@ public class PowerProfile { } } + /** + * Returns the average current in mA consumed by an ordinaled subsystem, or the given + * default value if the subsystem has no recorded value. + * + * @param group the subsystem {@link PowerGroup}. + * @param ordinal which entity in the {@link PowerGroup}. + * @param defaultValue the value to return if the subsystem has no recorded value. + * @return the average current in milliAmps. + */ + public double getAveragePowerForOrdinal(@PowerGroup String group, int ordinal, + double defaultValue) { + final String type = getOrdinalPowerType(group, ordinal); + return getAveragePowerOrDefault(type, defaultValue); + } + + /** + * Returns the average current in mA consumed by an ordinaled subsystem. + * + * @param group the subsystem {@link PowerGroup}. + * @param ordinal which entity in the {@link PowerGroup}. + * @return the average current in milliAmps. + */ + public double getAveragePowerForOrdinal(@PowerGroup String group, int ordinal) { + return getAveragePowerForOrdinal(group, ordinal, 0); + } + /** * Returns the battery capacity, if available, in milli Amp Hours. If not available, * it returns zero. @@ -682,4 +799,9 @@ public class PowerProfile { } } } + + // Creates the key for an ordinaled power constant from the group and ordinal. + private static String getOrdinalPowerType(@PowerGroup String group, int ordinal) { + return group + ordinal; + } } diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java index 1b3bc234fc0fa..72ad4e72707ae 100644 --- a/core/java/com/android/internal/os/ScreenPowerCalculator.java +++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java @@ -16,6 +16,9 @@ package com.android.internal.os; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_FULL; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_ON; + import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; @@ -50,10 +53,11 @@ public class ScreenPowerCalculator extends PowerCalculator { } public ScreenPowerCalculator(PowerProfile powerProfile) { + // TODO(b/200239964): update to support multidisplay. mScreenOnPowerEstimator = new UsageBasedPowerEstimator( - powerProfile.getAveragePower(PowerProfile.POWER_SCREEN_ON)); + powerProfile.getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_ON, 0)); mScreenFullPowerEstimator = new UsageBasedPowerEstimator( - powerProfile.getAveragePower(PowerProfile.POWER_SCREEN_FULL)); + powerProfile.getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_FULL, 0)); } @Override diff --git a/core/res/res/xml/power_profile.xml b/core/res/res/xml/power_profile.xml index 166edca3d0465..d310736ae1215 100644 --- a/core/res/res/xml/power_profile.xml +++ b/core/res/res/xml/power_profile.xml @@ -27,9 +27,33 @@ are totally dependent on the platform and can vary significantly, so should be measured on the shipping platform with a power meter. --> - 0.1 - 0.1 - 0.1 + + + + 0.1 + + 0.1 + + 0.1 + 0.1 0.1 0.1 diff --git a/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java index 79f7a5c9df187..d76037eb1cab9 100644 --- a/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/AmbientDisplayPowerCalculatorTest.java @@ -16,6 +16,8 @@ package com.android.internal.os; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_AMBIENT; + import static com.google.common.truth.Truth.assertThat; import android.os.BatteryConsumer; @@ -36,7 +38,7 @@ public class AmbientDisplayPowerCalculatorTest { @Rule public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule() - .setAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY, 10.0); + .setAveragePowerForOrdinal(POWER_GROUP_DISPLAY_AMBIENT, 0, 10.0); @Test public void testMeasuredEnergyBasedModel() { diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java index 083090c54619d..ab38f017936d7 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java @@ -110,6 +110,14 @@ public class BatteryUsageStatsRule implements TestRule { return this; } + public BatteryUsageStatsRule setAveragePowerForOrdinal(String group, int ordinal, + double value) { + when(mPowerProfile.getAveragePowerForOrdinal(group, ordinal)).thenReturn(value); + when(mPowerProfile.getAveragePowerForOrdinal(eq(group), eq(ordinal), + anyDouble())).thenReturn(value); + return this; + } + /** Call only after setting the power profile information. */ public BatteryUsageStatsRule initMeasuredEnergyStatsLocked() { return initMeasuredEnergyStatsLocked(new String[0]); diff --git a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java index 5862368f44d2d..88ee405483dba 100644 --- a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java +++ b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java @@ -17,6 +17,10 @@ package com.android.internal.os; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_AMBIENT; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_FULL; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_ON; + import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -53,7 +57,12 @@ public class PowerProfileTest extends TestCase { assertEquals(4, mProfile.getNumSpeedStepsInCpuCluster(1)); assertEquals(60.0, mProfile.getAveragePowerForCpuCore(1, 3)); assertEquals(3000.0, mProfile.getBatteryCapacity()); - assertEquals(0.5, mProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY)); + assertEquals(0.5, + mProfile.getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_AMBIENT, 0)); + assertEquals(100.0, + mProfile.getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_ON, 0)); + assertEquals(800.0, + mProfile.getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_FULL, 0)); assertEquals(100.0, mProfile.getAveragePower(PowerProfile.POWER_AUDIO)); assertEquals(150.0, mProfile.getAveragePower(PowerProfile.POWER_VIDEO)); } diff --git a/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java index c695fc9eb87d8..50e0a15128191 100644 --- a/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/ScreenPowerCalculatorTest.java @@ -16,6 +16,9 @@ package com.android.internal.os; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_FULL; +import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_ON; + import static com.google.common.truth.Truth.assertThat; import android.app.ActivityManager; @@ -42,8 +45,8 @@ public class ScreenPowerCalculatorTest { @Rule public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule() - .setAveragePower(PowerProfile.POWER_SCREEN_ON, 36.0) - .setAveragePower(PowerProfile.POWER_SCREEN_FULL, 48.0); + .setAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_ON, 0, 36.0) + .setAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_FULL, 0, 48.0); @Test public void testMeasuredEnergyBasedModel() {