diff options
3 files changed, 54 insertions, 17 deletions
diff --git a/core/java/com/android/internal/os/PowerStats.java b/core/java/com/android/internal/os/PowerStats.java index aafef6c8b5fd..6c69e2c623ad 100644 --- a/core/java/com/android/internal/os/PowerStats.java +++ b/core/java/com/android/internal/os/PowerStats.java @@ -128,6 +128,7 @@ public final class PowerStats { * Extra parameters specific to the power component, e.g. the availability of power * monitors. */ + @NonNull public final PersistableBundle extras; private PowerStatsFormatter mDeviceStatsFormatter; @@ -269,20 +270,41 @@ public final class PowerStats { stateStatsArrayLength, uidStatsArrayLength, extras); } + @SuppressWarnings("deprecation") @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Descriptor)) return false; Descriptor that = (Descriptor) o; - return powerComponentId == that.powerComponentId - && statsArrayLength == that.statsArrayLength - && stateLabels.contentEquals(that.stateLabels) - && stateStatsArrayLength == that.stateStatsArrayLength - && uidStatsArrayLength == that.uidStatsArrayLength - && Objects.equals(name, that.name) - && extras.size() == that.extras.size() // Unparcel the Parcel if not yet - && Bundle.kindofEquals(extras, - that.extras); // Since the Parcel is now unparceled, do a deep comparison + if (powerComponentId != that.powerComponentId + || statsArrayLength != that.statsArrayLength + || !stateLabels.contentEquals(that.stateLabels) + || stateStatsArrayLength != that.stateStatsArrayLength + || uidStatsArrayLength != that.uidStatsArrayLength + || !Objects.equals(name, that.name)) { + return false; + } + + // Getting the size has the side-effect of unparceling the Bundle if not yet + if (extras.size() != that.extras.size()) { + return false; + } + + if (Bundle.kindofEquals(extras, that.extras)) { + return true; + } + + // Since `kindofEquals` does not deep-compare arrays, we do that separately, albeit at + // the expense of creating an iterator and using a deprecated API, `bundle.get`. + // There is no performance concern, because the situation where PowerStatsDescriptors + // are changed in an incompatible way are exceedingly rare, occurring at most + // once per power component after a system upgrade. + for (String key : extras.keySet()) { + if (!Objects.deepEquals(extras.get(key), that.extras.get(key))) { + return false; + } + } + return true; } /** diff --git a/services/core/java/com/android/server/power/stats/format/ScreenPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/ScreenPowerStatsLayout.java index 6f6a7ff5064a..ca2237562fe1 100644 --- a/services/core/java/com/android/server/power/stats/format/ScreenPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/ScreenPowerStatsLayout.java @@ -29,7 +29,8 @@ import com.android.internal.os.PowerStats; public class ScreenPowerStatsLayout extends PowerStatsLayout { private static final String EXTRA_DEVICE_SCREEN_COUNT = "dsc"; private static final String EXTRA_DEVICE_SCREEN_ON_DURATION_POSITION = "dsd"; - private static final String EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS = "dbd"; + private static final String EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS = "dbds"; + private static final String EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS_COMPAT = "dbd"; private static final String EXTRA_DEVICE_DOZE_DURATION_POSITION = "ddd"; private static final String EXTRA_DEVICE_DOZE_POWER_POSITION = "ddp"; private static final String EXTRA_UID_FOREGROUND_DURATION = "uf"; @@ -55,8 +56,14 @@ public class ScreenPowerStatsLayout extends PowerStatsLayout { PersistableBundle extras = descriptor.extras; mDisplayCount = extras.getInt(EXTRA_DEVICE_SCREEN_COUNT, 1); mDeviceScreenOnDurationPosition = extras.getInt(EXTRA_DEVICE_SCREEN_ON_DURATION_POSITION); - mDeviceBrightnessDurationPositions = extras.getIntArray( + mDeviceBrightnessDurationPositions = getIntArray(extras, EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS); + if (mDeviceBrightnessDurationPositions == null) { + // We should never put arrays in PowerStats.Descriptor because of the performance of + // .equals + mDeviceBrightnessDurationPositions = extras.getIntArray( + EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS_COMPAT); + } mDeviceScreenDozeDurationPosition = extras.getInt(EXTRA_DEVICE_DOZE_DURATION_POSITION); mDeviceScreenDozePowerPosition = extras.getInt(EXTRA_DEVICE_DOZE_POWER_POSITION); mUidTopActivityTimePosition = extras.getInt(EXTRA_UID_FOREGROUND_DURATION); @@ -67,7 +74,7 @@ public class ScreenPowerStatsLayout extends PowerStatsLayout { super.toExtras(extras); extras.putInt(EXTRA_DEVICE_SCREEN_COUNT, mDisplayCount); extras.putInt(EXTRA_DEVICE_SCREEN_ON_DURATION_POSITION, mDeviceScreenOnDurationPosition); - extras.putIntArray(EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS, + putIntArray(extras, EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS, mDeviceBrightnessDurationPositions); extras.putInt(EXTRA_DEVICE_DOZE_DURATION_POSITION, mDeviceScreenDozeDurationPosition); extras.putInt(EXTRA_DEVICE_DOZE_POWER_POSITION, mDeviceScreenDozePowerPosition); diff --git a/services/core/java/com/android/server/power/stats/format/SensorPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/SensorPowerStatsLayout.java index e8df3ddfe5e8..c382534ac433 100644 --- a/services/core/java/com/android/server/power/stats/format/SensorPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/SensorPowerStatsLayout.java @@ -27,8 +27,10 @@ import java.util.Map; public class SensorPowerStatsLayout extends PowerStatsLayout { private static final String TAG = "SensorPowerStatsLayout"; - private static final String EXTRA_DEVICE_SENSOR_HANDLES = "dsh"; + private static final String EXTRA_DEVICE_SENSOR_HANDLES = "dshs"; + private static final String EXTRA_DEVICE_SENSOR_HANDLES_COMPAT = "dsh"; private static final String EXTRA_UID_SENSOR_POSITIONS = "usp"; + private static final String EXTRA_UID_SENSOR_POSITIONS_COMPAT = "usps"; private final SparseIntArray mSensorPositions = new SparseIntArray(); @@ -47,8 +49,14 @@ public class SensorPowerStatsLayout extends PowerStatsLayout { super(descriptor); PersistableBundle extras = descriptor.extras; - int[] handlers = extras.getIntArray(EXTRA_DEVICE_SENSOR_HANDLES); - int[] uidDurationPositions = extras.getIntArray(EXTRA_UID_SENSOR_POSITIONS); + int[] handlers = getIntArray(extras, EXTRA_DEVICE_SENSOR_HANDLES); + if (handlers == null) { + handlers = extras.getIntArray(EXTRA_DEVICE_SENSOR_HANDLES_COMPAT); + } + int[] uidDurationPositions = getIntArray(extras, EXTRA_UID_SENSOR_POSITIONS); + if (uidDurationPositions == null) { + uidDurationPositions = extras.getIntArray(EXTRA_UID_SENSOR_POSITIONS_COMPAT); + } if (handlers != null && uidDurationPositions != null) { for (int i = 0; i < handlers.length; i++) { @@ -69,8 +77,8 @@ public class SensorPowerStatsLayout extends PowerStatsLayout { uidDurationPositions[i] = mSensorPositions.valueAt(i); } - extras.putIntArray(EXTRA_DEVICE_SENSOR_HANDLES, handlers); - extras.putIntArray(EXTRA_UID_SENSOR_POSITIONS, uidDurationPositions); + putIntArray(extras, EXTRA_DEVICE_SENSOR_HANDLES, handlers); + putIntArray(extras, EXTRA_UID_SENSOR_POSITIONS, uidDurationPositions); } private void addUidSensorSection(int handle, String label) { |