From a295ebd5fc13f51f86329f5ed9e9dfcdf573b335 Mon Sep 17 00:00:00 2001 From: Michael Wachenschwanz Date: Fri, 10 Dec 2021 16:18:14 -0800 Subject: [PATCH] Small fixes to PowerProfile and ModemPowerProfile Bug: 207697945 Test: atest PowerProfileTest Change-Id: I48ee45efbbe8e2ac8e0d808dee50d2b216c41a01 --- .../com/android/internal/os/PowerProfile.java | 11 +- .../internal/power/ModemPowerProfile.java | 159 +++++++++++------- .../coretests/res/xml/power_profile_test.xml | 123 ++++++++++++++ .../android/internal/os/PowerProfileTest.java | 41 ++++- 4 files changed, 264 insertions(+), 70 deletions(-) create mode 100644 core/tests/coretests/res/xml/power_profile_test.xml diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java index 7f8acccd72bb5..54e65e079b836 100644 --- a/core/java/com/android/internal/os/PowerProfile.java +++ b/core/java/com/android/internal/os/PowerProfile.java @@ -274,16 +274,15 @@ public class PowerProfile { * [31:0] - per Subsystem fields, see {@link ModemPowerProfile}. * */ - private static final int SUBSYSTEM_SHIFT = 32; - private static final long SUBSYSTEM_MASK = 0xF << SUBSYSTEM_SHIFT; + private static final long SUBSYSTEM_MASK = 0xF_0000_0000L; /** * Power constant not associated with a subsystem. */ - public static final long SUBSYSTEM_NONE = 0 << SUBSYSTEM_SHIFT; + public static final long SUBSYSTEM_NONE = 0x0_0000_0000L; /** * Modem power constant. */ - public static final long SUBSYSTEM_MODEM = 1 << SUBSYSTEM_SHIFT; + public static final long SUBSYSTEM_MODEM = 0x1_0000_0000L; @LongDef(prefix = { "SUBSYSTEM_" }, value = { SUBSYSTEM_NONE, @@ -292,7 +291,7 @@ public class PowerProfile { @Retention(RetentionPolicy.SOURCE) public @interface Subsystem {} - private static final long SUBSYSTEM_FIELDS_MASK = 0xFFFFFFFF; + private static final long SUBSYSTEM_FIELDS_MASK = 0xFFFF_FFFF; /** * A map from Power Use Item to its power consumption. @@ -582,7 +581,7 @@ public class PowerProfile { handleDeprecatedModemConstant(ModemPowerProfile.MODEM_DRAIN_TYPE_SLEEP, POWER_MODEM_CONTROLLER_SLEEP, 0); handleDeprecatedModemConstant(ModemPowerProfile.MODEM_DRAIN_TYPE_IDLE, - POWER_MODEM_CONTROLLER_SLEEP, 0); + POWER_MODEM_CONTROLLER_IDLE, 0); handleDeprecatedModemConstant( ModemPowerProfile.MODEM_RAT_TYPE_DEFAULT | ModemPowerProfile.MODEM_DRAIN_TYPE_RX, POWER_MODEM_CONTROLLER_RX, 0); diff --git a/core/java/com/android/internal/power/ModemPowerProfile.java b/core/java/com/android/internal/power/ModemPowerProfile.java index 456ff4ba8a268..afea69a9c3f24 100644 --- a/core/java/com/android/internal/power/ModemPowerProfile.java +++ b/core/java/com/android/internal/power/ModemPowerProfile.java @@ -22,9 +22,9 @@ import android.telephony.ModemActivityInfo; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.util.Slog; +import android.util.SparseArray; import android.util.SparseDoubleArray; -import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.util.XmlUtils; import org.xmlpull.v1.XmlPullParser; @@ -64,34 +64,27 @@ public class ModemPowerProfile { */ private final SparseDoubleArray mPowerConstants = new SparseDoubleArray(); - private static final int MODEM_DRAIN_TYPE_SHIFT = 28; - private static final int MODEM_DRAIN_TYPE_MASK = 0xF << MODEM_DRAIN_TYPE_SHIFT; - - private static final int MODEM_TX_LEVEL_SHIFT = 24; - private static final int MODEM_TX_LEVEL_MASK = 0xF << MODEM_TX_LEVEL_SHIFT; - - private static final int MODEM_RAT_TYPE_SHIFT = 20; - private static final int MODEM_RAT_TYPE_MASK = 0xF << MODEM_RAT_TYPE_SHIFT; - - private static final int MODEM_NR_FREQUENCY_RANGE_SHIFT = 16; - private static final int MODEM_NR_FREQUENCY_RANGE_MASK = 0xF << MODEM_NR_FREQUENCY_RANGE_SHIFT; + private static final int MODEM_DRAIN_TYPE_MASK = 0xF000_0000; + private static final int MODEM_TX_LEVEL_MASK = 0x0F00_0000; + private static final int MODEM_RAT_TYPE_MASK = 0x00F0_0000; + private static final int MODEM_NR_FREQUENCY_RANGE_MASK = 0x000F_0000; /** * Corresponds to the overall modem battery drain while asleep. */ - public static final int MODEM_DRAIN_TYPE_SLEEP = 0 << MODEM_DRAIN_TYPE_SHIFT; + public static final int MODEM_DRAIN_TYPE_SLEEP = 0x0000_0000; /** * Corresponds to the overall modem battery drain while idle. */ - public static final int MODEM_DRAIN_TYPE_IDLE = 1 << MODEM_DRAIN_TYPE_SHIFT; + public static final int MODEM_DRAIN_TYPE_IDLE = 0x1000_0000; /** * Corresponds to the modem battery drain while receiving data. A specific Rx battery drain * power constant can be selected using a bitwise OR (|) with {@link ModemRatType} and * {@link ModemNrFrequencyRange} (when applicable). */ - public static final int MODEM_DRAIN_TYPE_RX = 2 << MODEM_DRAIN_TYPE_SHIFT; + public static final int MODEM_DRAIN_TYPE_RX = 0x2000_0000; /** * Corresponds to the modem battery drain while receiving data. @@ -99,7 +92,7 @@ public class ModemPowerProfile { * Specific Tx battery drain power constanta can be selected using a bitwise OR (|) with * {@link ModemRatType} and {@link ModemNrFrequencyRange} (when applicable). */ - public static final int MODEM_DRAIN_TYPE_TX = 3 << MODEM_DRAIN_TYPE_SHIFT; + public static final int MODEM_DRAIN_TYPE_TX = 0x3000_0000; @IntDef(prefix = {"MODEM_DRAIN_TYPE_"}, value = { MODEM_DRAIN_TYPE_SLEEP, @@ -111,33 +104,44 @@ public class ModemPowerProfile { public @interface ModemDrainType { } - private static final String[] MODEM_DRAIN_TYPE_NAMES = - new String[]{"SLEEP", "IDLE", "RX", "TX"}; + + private static final SparseArray MODEM_DRAIN_TYPE_NAMES = new SparseArray<>(4); + static { + MODEM_DRAIN_TYPE_NAMES.put(MODEM_DRAIN_TYPE_SLEEP, "SLEEP"); + MODEM_DRAIN_TYPE_NAMES.put(MODEM_DRAIN_TYPE_IDLE, "IDLE"); + MODEM_DRAIN_TYPE_NAMES.put(MODEM_DRAIN_TYPE_RX, "RX"); + MODEM_DRAIN_TYPE_NAMES.put(MODEM_DRAIN_TYPE_TX, "TX"); + } /** * Corresponds to {@link ModemActivityInfo#TX_POWER_LEVEL_0}. */ - public static final int MODEM_TX_LEVEL_0 = 0 << MODEM_TX_LEVEL_SHIFT; + + public static final int MODEM_TX_LEVEL_0 = 0x0000_0000; /** * Corresponds to {@link ModemActivityInfo#TX_POWER_LEVEL_1}. */ - public static final int MODEM_TX_LEVEL_1 = 1 << MODEM_TX_LEVEL_SHIFT; + + public static final int MODEM_TX_LEVEL_1 = 0x0100_0000; /** * Corresponds to {@link ModemActivityInfo#TX_POWER_LEVEL_2}. */ - public static final int MODEM_TX_LEVEL_2 = 2 << MODEM_TX_LEVEL_SHIFT; + + public static final int MODEM_TX_LEVEL_2 = 0x0200_0000; /** * Corresponds to {@link ModemActivityInfo#TX_POWER_LEVEL_3}. */ - public static final int MODEM_TX_LEVEL_3 = 3 << MODEM_TX_LEVEL_SHIFT; + + public static final int MODEM_TX_LEVEL_3 = 0x0300_0000; /** * Corresponds to {@link ModemActivityInfo#TX_POWER_LEVEL_4}. */ - public static final int MODEM_TX_LEVEL_4 = 4 << MODEM_TX_LEVEL_SHIFT; + + public static final int MODEM_TX_LEVEL_4 = 0x0400_0000; private static final int MODEM_TX_LEVEL_COUNT = 5; @@ -152,21 +156,37 @@ public class ModemPowerProfile { public @interface ModemTxLevel { } + private static final SparseArray MODEM_TX_LEVEL_NAMES = new SparseArray<>(5); + static { + MODEM_DRAIN_TYPE_NAMES.put(MODEM_TX_LEVEL_0, "0"); + MODEM_DRAIN_TYPE_NAMES.put(MODEM_TX_LEVEL_1, "1"); + MODEM_DRAIN_TYPE_NAMES.put(MODEM_TX_LEVEL_2, "2"); + MODEM_DRAIN_TYPE_NAMES.put(MODEM_TX_LEVEL_3, "3"); + MODEM_DRAIN_TYPE_NAMES.put(MODEM_TX_LEVEL_4, "4"); + } + + private static final int[] MODEM_TX_LEVEL_MAP = new int[]{ + MODEM_TX_LEVEL_0, + MODEM_TX_LEVEL_1, + MODEM_TX_LEVEL_2, + MODEM_TX_LEVEL_3, + MODEM_TX_LEVEL_4}; + /** * Fallback for any active modem usage that does not match specified Radio Access Technology * (RAT) power constants. */ - public static final int MODEM_RAT_TYPE_DEFAULT = 0 << MODEM_RAT_TYPE_SHIFT; + public static final int MODEM_RAT_TYPE_DEFAULT = 0x0000_0000; /** * Corresponds to active modem usage on 4G {@link TelephonyManager#NETWORK_TYPE_LTE} RAT. */ - public static final int MODEM_RAT_TYPE_LTE = 1 << MODEM_RAT_TYPE_SHIFT; + public static final int MODEM_RAT_TYPE_LTE = 0x0010_0000; /** * Corresponds to active modem usage on 5G {@link TelephonyManager#NETWORK_TYPE_NR} RAT. */ - public static final int MODEM_RAT_TYPE_NR = 2 << MODEM_RAT_TYPE_SHIFT; + public static final int MODEM_RAT_TYPE_NR = 0x0020_0000; @IntDef(prefix = {"MODEM_RAT_TYPE_"}, value = { MODEM_RAT_TYPE_DEFAULT, @@ -177,33 +197,38 @@ public class ModemPowerProfile { public @interface ModemRatType { } - private static final String[] MODEM_RAT_TYPE_NAMES = new String[]{"DEFAULT", "LTE", "NR"}; + private static final SparseArray MODEM_RAT_TYPE_NAMES = new SparseArray<>(3); + static { + MODEM_RAT_TYPE_NAMES.put(MODEM_RAT_TYPE_DEFAULT, "DEFAULT"); + MODEM_RAT_TYPE_NAMES.put(MODEM_RAT_TYPE_LTE, "LTE"); + MODEM_RAT_TYPE_NAMES.put(MODEM_RAT_TYPE_NR, "NR"); + } /** * Fallback for any active 5G modem usage that does not match specified NR frequency power * constants. */ - public static final int MODEM_NR_FREQUENCY_RANGE_DEFAULT = 0 << MODEM_NR_FREQUENCY_RANGE_SHIFT; + public static final int MODEM_NR_FREQUENCY_RANGE_DEFAULT = 0x0000_0000; /** * Corresponds to active NR modem usage on {@link ServiceState#FREQUENCY_RANGE_LOW}. */ - public static final int MODEM_NR_FREQUENCY_RANGE_LOW = 1 << MODEM_NR_FREQUENCY_RANGE_SHIFT; + public static final int MODEM_NR_FREQUENCY_RANGE_LOW = 0x0001_0000; /** * Corresponds to active NR modem usage on {@link ServiceState#FREQUENCY_RANGE_MID}. */ - public static final int MODEM_NR_FREQUENCY_RANGE_MID = 2 << MODEM_NR_FREQUENCY_RANGE_SHIFT; + public static final int MODEM_NR_FREQUENCY_RANGE_MID = 0x0002_0000; /** * Corresponds to active NR modem usage on {@link ServiceState#FREQUENCY_RANGE_HIGH}. */ - public static final int MODEM_NR_FREQUENCY_RANGE_HIGH = 3 << MODEM_NR_FREQUENCY_RANGE_SHIFT; + public static final int MODEM_NR_FREQUENCY_RANGE_HIGH = 0x0003_0000; /** * Corresponds to active NR modem usage on {@link ServiceState#FREQUENCY_RANGE_MMWAVE}. */ - public static final int MODEM_NR_FREQUENCY_RANGE_MMWAVE = 4 << MODEM_NR_FREQUENCY_RANGE_SHIFT; + public static final int MODEM_NR_FREQUENCY_RANGE_MMWAVE = 0x0004_0000; @IntDef(prefix = {"MODEM_NR_FREQUENCY_RANGE_"}, value = { MODEM_RAT_TYPE_DEFAULT, @@ -215,9 +240,14 @@ public class ModemPowerProfile { @Retention(RetentionPolicy.SOURCE) public @interface ModemNrFrequencyRange { } - - private static final String[] MODEM_NR_FREQUENCY_RANGE_NAMES = - new String[]{"DEFAULT", "LOW", "MID", "HIGH", "MMWAVE"}; + private static final SparseArray MODEM_NR_FREQUENCY_RANGE_NAMES = new SparseArray<>(5); + static { + MODEM_NR_FREQUENCY_RANGE_NAMES.put(MODEM_NR_FREQUENCY_RANGE_DEFAULT, "DEFAULT"); + MODEM_NR_FREQUENCY_RANGE_NAMES.put(MODEM_NR_FREQUENCY_RANGE_LOW, "LOW"); + MODEM_NR_FREQUENCY_RANGE_NAMES.put(MODEM_NR_FREQUENCY_RANGE_MID, "MID"); + MODEM_NR_FREQUENCY_RANGE_NAMES.put(MODEM_NR_FREQUENCY_RANGE_HIGH, "HIGH"); + MODEM_NR_FREQUENCY_RANGE_NAMES.put(MODEM_NR_FREQUENCY_RANGE_MMWAVE, "MMWAVE"); + } public ModemPowerProfile() { } @@ -261,11 +291,10 @@ public class ModemPowerProfile { final int ratType; final int nrfType; try { - ratType = getTypeFromAttribute(parser, ATTR_RAT, MODEM_RAT_TYPE_SHIFT, - MODEM_RAT_TYPE_NAMES); + ratType = getTypeFromAttribute(parser, ATTR_RAT, MODEM_RAT_TYPE_NAMES); if (ratType == MODEM_RAT_TYPE_NR) { nrfType = getTypeFromAttribute(parser, ATTR_NR_FREQUENCY, - MODEM_NR_FREQUENCY_RANGE_SHIFT, MODEM_NR_FREQUENCY_RANGE_NAMES); + MODEM_NR_FREQUENCY_RANGE_NAMES); } else { nrfType = 0; } @@ -299,10 +328,7 @@ public class ModemPowerProfile { MODEM_TX_LEVEL_COUNT - 1)); continue; } - final int modemTxLevel = level << MODEM_TX_LEVEL_SHIFT; - Slog.d("MWACHENS", - "parsing tx at level:" + level + ", aka 0x" + Integer.toHexString( - modemTxLevel)); + final int modemTxLevel = MODEM_TX_LEVEL_MAP[level]; final int txKey = MODEM_DRAIN_TYPE_TX | modemTxLevel | ratType | nrfType; setPowerConstant(txKey, txDrain); break; @@ -312,20 +338,31 @@ public class ModemPowerProfile { } } - private static int getTypeFromAttribute(XmlResourceParser parser, String attr, int shift, - String[] names) { + private static int getTypeFromAttribute(XmlResourceParser parser, String attr, + SparseArray names) { final String value = XmlUtils.readStringAttribute(parser, attr); - final int index = ArrayUtils.indexOf(names, value); if (value == null) { // Attribute was not specified, just use the default. return 0; } + int index = -1; + final int size = names.size(); + // Manual linear search for string. (SparseArray uses == not equals.) + for (int i = 0; i < size; i++) { + if (value.equals(names.valueAt(i))) { + index = i; + } + } if (index < 0) { + final String[] stringNames = new String[size]; + for (int i = 0; i < size; i++) { + stringNames[i] = names.valueAt(i); + } throw new IllegalArgumentException( "Unexpected " + attr + " value : " + value + ". Acceptable values are " - + Arrays.toString(names)); + + Arrays.toString(stringNames)); } - return index << shift; + return names.keyAt(index); } /** @@ -384,39 +421,35 @@ public class ModemPowerProfile { private static String keyToString(int key) { StringBuilder sb = new StringBuilder(); final int drainType = key & MODEM_DRAIN_TYPE_MASK; - appendFieldToString(sb, "drain", MODEM_DRAIN_TYPE_NAMES, - drainType >> MODEM_DRAIN_TYPE_SHIFT); + appendFieldToString(sb, "drain", MODEM_DRAIN_TYPE_NAMES, drainType); sb.append(","); if (drainType == MODEM_DRAIN_TYPE_TX) { - final int txLevel = (key & MODEM_TX_LEVEL_MASK) >> MODEM_TX_LEVEL_SHIFT; - sb.append("level:"); - sb.append(txLevel); - sb.append(","); + final int txLevel = key & MODEM_TX_LEVEL_MASK; + appendFieldToString(sb, "level", MODEM_TX_LEVEL_NAMES, txLevel); } final int ratType = key & MODEM_RAT_TYPE_MASK; - appendFieldToString(sb, "RAT", MODEM_RAT_TYPE_NAMES, ratType >> MODEM_RAT_TYPE_SHIFT); + appendFieldToString(sb, "RAT", MODEM_RAT_TYPE_NAMES, ratType); if (ratType == MODEM_RAT_TYPE_NR) { sb.append(","); final int nrFreq = key & MODEM_NR_FREQUENCY_RANGE_MASK; - appendFieldToString(sb, "nrFreq", MODEM_NR_FREQUENCY_RANGE_NAMES, - nrFreq >> MODEM_NR_FREQUENCY_RANGE_SHIFT); + appendFieldToString(sb, "nrFreq", MODEM_NR_FREQUENCY_RANGE_NAMES, nrFreq); } return sb.toString(); } - - private static void appendFieldToString(StringBuilder sb, String fieldName, String[] names, - int index) { + private static void appendFieldToString(StringBuilder sb, String fieldName, + SparseArray names, int key) { sb.append(fieldName); sb.append(":"); - if (index < 0 || index >= names.length) { - sb.append("UNKNOWN("); - sb.append(index); + final String name = names.get(key, null); + if (name == null) { + sb.append("UNKNOWN(0x"); + sb.append(Integer.toHexString(key)); sb.append(")"); } else { - sb.append(names[index]); + sb.append(name); } } diff --git a/core/tests/coretests/res/xml/power_profile_test.xml b/core/tests/coretests/res/xml/power_profile_test.xml new file mode 100644 index 0000000000000..22571142a3501 --- /dev/null +++ b/core/tests/coretests/res/xml/power_profile_test.xml @@ -0,0 +1,123 @@ + + + + + + 3000 + + + + 4 + 4 + + + + 5 + + 1.11 + + 2.55 + + + 2.11 + + 2.22 + + + + 300000 + 1000000 + 2000000 + + + + 300000 + 1000000 + 2500000 + 3000000 + + + + + 10 + 20 + 30 + + + + 25 + 35 + 50 + 60 + + + + 0.5 + + 100 + + 800 + + + 500 + + 600 + + + 100.0 + + + 150.0 + + + 10 + + + 60 + + 3 + + + 6 + 5 + 4 + 3 + 3 + + + + 123 + 456 + 789 + + 10 + 20 + 30 + 40 + 50 + + \ No newline at end of file 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 1efd78bc13fc9..bc3b4229f5e56 100644 --- a/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java +++ b/core/tests/coretests/src/com/android/internal/os/PowerProfileTest.java @@ -57,11 +57,13 @@ public class PowerProfileTest extends TestCase { @Before public void setUp() { mContext = InstrumentationRegistry.getContext(); - mProfile = new PowerProfile(mContext, true); + mProfile = new PowerProfile(mContext); } @Test public void testPowerProfile() { + mProfile.forceInitForTesting(mContext, R.xml.power_profile_test); + assertEquals(2, mProfile.getNumCpuClusters()); assertEquals(4, mProfile.getNumCoresInCpuCluster(0)); assertEquals(4, mProfile.getNumCoresInCpuCluster(1)); @@ -83,6 +85,43 @@ public class PowerProfileTest extends TestCase { mProfile.getAveragePowerForOrdinal(POWER_GROUP_DISPLAY_SCREEN_FULL, 0)); assertEquals(100.0, mProfile.getAveragePower(PowerProfile.POWER_AUDIO)); assertEquals(150.0, mProfile.getAveragePower(PowerProfile.POWER_VIDEO)); + + assertEquals(123.0, mProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_SLEEP)); + assertEquals(456.0, mProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_IDLE)); + assertEquals(789.0, mProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_RX)); + assertEquals(10.0, mProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, 0)); + assertEquals(20.0, mProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, 1)); + assertEquals(30.0, mProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, 2)); + assertEquals(40.0, mProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, 3)); + assertEquals(50.0, mProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, 4)); + + // Deprecated Modem constants should work with current format. + assertEquals(123.0, mProfile.getAverageBatteryDrainMa( + PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_DRAIN_TYPE_SLEEP)); + assertEquals(456.0, mProfile.getAverageBatteryDrainMa( + PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_DRAIN_TYPE_IDLE)); + assertEquals(789.0, mProfile.getAverageBatteryDrainMa( + PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_DRAIN_TYPE_RX)); + assertEquals(10.0, mProfile.getAverageBatteryDrainMa( + PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_RAT_TYPE_DEFAULT + | ModemPowerProfile.MODEM_DRAIN_TYPE_TX + | ModemPowerProfile.MODEM_TX_LEVEL_0)); + assertEquals(20.0, mProfile.getAverageBatteryDrainMa( + PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_RAT_TYPE_DEFAULT + | ModemPowerProfile.MODEM_DRAIN_TYPE_TX + | ModemPowerProfile.MODEM_TX_LEVEL_1)); + assertEquals(30.0, mProfile.getAverageBatteryDrainMa( + PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_RAT_TYPE_DEFAULT + | ModemPowerProfile.MODEM_DRAIN_TYPE_TX + | ModemPowerProfile.MODEM_TX_LEVEL_2)); + assertEquals(40.0, mProfile.getAverageBatteryDrainMa( + PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_RAT_TYPE_DEFAULT + | ModemPowerProfile.MODEM_DRAIN_TYPE_TX + | ModemPowerProfile.MODEM_TX_LEVEL_3)); + assertEquals(50.0, mProfile.getAverageBatteryDrainMa( + PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_RAT_TYPE_DEFAULT + | ModemPowerProfile.MODEM_DRAIN_TYPE_TX + | ModemPowerProfile.MODEM_TX_LEVEL_4)); } @Test