Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3885aa96 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Add BatteryConsumer.getCustomPowerComponentName() and getCustomPowerComponentCount()

Bug: 184207674
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryStatsTests
Change-Id: Ic41cf53e553a25caa8bb6c84c30e3ea2b7627281
parent f6febe9b
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ public abstract class BatteryConsumer {
    public static final int POWER_MODEL_MEASURED_ENERGY = 1;

    private final PowerComponents mPowerComponents;
    private String[] mCustomPowerComponentNames;

    protected BatteryConsumer(@NonNull PowerComponents powerComponents) {
        mPowerComponents = powerComponents;
@@ -192,6 +193,23 @@ public abstract class BatteryConsumer {
        return mPowerComponents.getConsumedPowerForCustomComponent(componentId);
    }

    public int getCustomPowerComponentCount() {
        return mPowerComponents.getCustomPowerComponentCount();
    }

    void setCustomPowerComponentNames(String[] customPowerComponentNames) {
        mPowerComponents.setCustomPowerComponentNames(customPowerComponentNames);
    }

    /**
     * Returns the name of the specified power component.
     *
     * @param componentId The ID of the custom power component.
     */
    public String getCustomPowerComponentName(int componentId) {
        return mPowerComponents.getCustomPowerComponentName(componentId);
    }

    /**
     * Returns the amount of time since BatteryStats reset used by the specified component, e.g.
     * CPU, WiFi etc.
@@ -222,9 +240,9 @@ public abstract class BatteryConsumer {
    protected abstract static class BaseBuilder<T extends BaseBuilder<?>> {
        final PowerComponents.Builder mPowerComponentsBuilder;

        public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount,
                boolean includePowerModels) {
            mPowerComponentsBuilder = new PowerComponents.Builder(customPowerComponentCount,
        public BaseBuilder(@NonNull String[] customPowerComponentNames,
                int customTimeComponentCount, boolean includePowerModels) {
            mPowerComponentsBuilder = new PowerComponents.Builder(customPowerComponentNames,
                    customTimeComponentCount, includePowerModels);
        }

+54 −20
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.internal.os.BatteryStatsHistory;
import com.android.internal.os.BatteryStatsHistoryIterator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
@@ -39,9 +40,10 @@ public final class BatteryUsageStats implements Parcelable {
    private final double mDischargedPowerUpperBound;
    private final long mBatteryTimeRemainingMs;
    private final long mChargeTimeRemainingMs;
    private final ArrayList<UidBatteryConsumer> mUidBatteryConsumers;
    private final ArrayList<SystemBatteryConsumer> mSystemBatteryConsumers;
    private final ArrayList<UserBatteryConsumer> mUserBatteryConsumers;
    private final String[] mCustomPowerComponentNames;
    private final List<UidBatteryConsumer> mUidBatteryConsumers;
    private final List<SystemBatteryConsumer> mSystemBatteryConsumers;
    private final List<UserBatteryConsumer> mUserBatteryConsumers;
    private final Parcel mHistoryBuffer;
    private final List<BatteryStats.HistoryTag> mHistoryTagPool;

@@ -54,6 +56,7 @@ public final class BatteryUsageStats implements Parcelable {
        mHistoryTagPool = builder.mHistoryTagPool;
        mBatteryTimeRemainingMs = builder.mBatteryTimeRemainingMs;
        mChargeTimeRemainingMs = builder.mChargeTimeRemainingMs;
        mCustomPowerComponentNames = builder.mCustomPowerComponentNames;

        double totalPower = 0;

@@ -182,12 +185,31 @@ public final class BatteryUsageStats implements Parcelable {
        mDischargedPowerUpperBound = source.readDouble();
        mBatteryTimeRemainingMs = source.readLong();
        mChargeTimeRemainingMs = source.readLong();
        mUidBatteryConsumers = new ArrayList<>();
        source.readParcelableList(mUidBatteryConsumers, getClass().getClassLoader());
        mSystemBatteryConsumers = new ArrayList<>();
        source.readParcelableList(mSystemBatteryConsumers, getClass().getClassLoader());
        mUserBatteryConsumers = new ArrayList<>();
        source.readParcelableList(mUserBatteryConsumers, getClass().getClassLoader());
        mCustomPowerComponentNames = source.readStringArray();
        int uidCount = source.readInt();
        mUidBatteryConsumers = new ArrayList<>(uidCount);
        for (int i = 0; i < uidCount; i++) {
            final UidBatteryConsumer consumer =
                    UidBatteryConsumer.CREATOR.createFromParcel(source);
            consumer.setCustomPowerComponentNames(mCustomPowerComponentNames);
            mUidBatteryConsumers.add(consumer);
        }
        int sysCount = source.readInt();
        mSystemBatteryConsumers = new ArrayList<>(sysCount);
        for (int i = 0; i < sysCount; i++) {
            final SystemBatteryConsumer consumer =
                    SystemBatteryConsumer.CREATOR.createFromParcel(source);
            consumer.setCustomPowerComponentNames(mCustomPowerComponentNames);
            mSystemBatteryConsumers.add(consumer);
        }
        int userCount = source.readInt();
        mUserBatteryConsumers = new ArrayList<>(userCount);
        for (int i = 0; i < userCount; i++) {
            final UserBatteryConsumer consumer =
                    UserBatteryConsumer.CREATOR.createFromParcel(source);
            consumer.setCustomPowerComponentNames(mCustomPowerComponentNames);
            mUserBatteryConsumers.add(consumer);
        }
        if (source.readBoolean()) {
            mHistoryBuffer = Parcel.obtain();
            mHistoryBuffer.setDataSize(0);
@@ -211,6 +233,8 @@ public final class BatteryUsageStats implements Parcelable {
            mHistoryBuffer = null;
            mHistoryTagPool = null;
        }
        System.out.println("From Parcel = " + Arrays.toString(
                mCustomPowerComponentNames));
    }

    @Override
@@ -222,9 +246,19 @@ public final class BatteryUsageStats implements Parcelable {
        dest.writeDouble(mDischargedPowerUpperBound);
        dest.writeLong(mBatteryTimeRemainingMs);
        dest.writeLong(mChargeTimeRemainingMs);
        dest.writeParcelableList(mUidBatteryConsumers, flags);
        dest.writeParcelableList(mSystemBatteryConsumers, flags);
        dest.writeParcelableList(mUserBatteryConsumers, flags);
        dest.writeStringArray(mCustomPowerComponentNames);
        dest.writeInt(mUidBatteryConsumers.size());
        for (int i = mUidBatteryConsumers.size() - 1; i >= 0; i--) {
            mUidBatteryConsumers.get(i).writeToParcel(dest, flags);
        }
        dest.writeInt(mSystemBatteryConsumers.size());
        for (int i = mSystemBatteryConsumers.size() - 1; i >= 0; i--) {
            mSystemBatteryConsumers.get(i).writeToParcel(dest, flags);
        }
        dest.writeInt(mUserBatteryConsumers.size());
        for (int i = mUserBatteryConsumers.size() - 1; i >= 0; i--) {
            mUserBatteryConsumers.get(i).writeToParcel(dest, flags);
        }
        if (mHistoryBuffer != null) {
            dest.writeBoolean(true);

@@ -259,7 +293,7 @@ public final class BatteryUsageStats implements Parcelable {
     * Builder for BatteryUsageStats.
     */
    public static final class Builder {
        private final int mCustomPowerComponentCount;
        private final String[] mCustomPowerComponentNames;
        private final int mCustomTimeComponentCount;
        private final boolean mIncludePowerModels;
        private long mStatsStartTimestampMs;
@@ -277,13 +311,13 @@ public final class BatteryUsageStats implements Parcelable {
        private Parcel mHistoryBuffer;
        private List<BatteryStats.HistoryTag> mHistoryTagPool;

        public Builder(int customPowerComponentCount, int customTimeComponentCount) {
            this(customPowerComponentCount, customTimeComponentCount, false);
        public Builder(String[] customPowerComponentNames, int customTimeComponentCount) {
            this(customPowerComponentNames, customTimeComponentCount, false);
        }

        public Builder(int customPowerComponentCount, int customTimeComponentCount,
        public Builder(String[] customPowerComponentNames, int customTimeComponentCount,
                boolean includePowerModels) {
            mCustomPowerComponentCount = customPowerComponentCount;
            mCustomPowerComponentNames = customPowerComponentNames;
            mCustomTimeComponentCount = customTimeComponentCount;
            mIncludePowerModels = includePowerModels;
        }
@@ -366,7 +400,7 @@ public final class BatteryUsageStats implements Parcelable {
            int uid = batteryStatsUid.getUid();
            UidBatteryConsumer.Builder builder = mUidBatteryConsumerBuilders.get(uid);
            if (builder == null) {
                builder = new UidBatteryConsumer.Builder(mCustomPowerComponentCount,
                builder = new UidBatteryConsumer.Builder(mCustomPowerComponentNames,
                        mCustomTimeComponentCount, mIncludePowerModels, batteryStatsUid);
                mUidBatteryConsumerBuilders.put(uid, builder);
            }
@@ -382,7 +416,7 @@ public final class BatteryUsageStats implements Parcelable {
                @SystemBatteryConsumer.DrainType int drainType) {
            SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType);
            if (builder == null) {
                builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentCount,
                builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentNames,
                        mCustomTimeComponentCount, mIncludePowerModels, drainType);
                mSystemBatteryConsumerBuilders.put(drainType, builder);
            }
@@ -397,7 +431,7 @@ public final class BatteryUsageStats implements Parcelable {
        public UserBatteryConsumer.Builder getOrCreateUserBatteryConsumerBuilder(int userId) {
            UserBatteryConsumer.Builder builder = mUserBatteryConsumerBuilders.get(userId);
            if (builder == null) {
                builder = new UserBatteryConsumer.Builder(mCustomPowerComponentCount,
                builder = new UserBatteryConsumer.Builder(mCustomPowerComponentNames,
                        mCustomTimeComponentCount, mIncludePowerModels, userId);
                mUserBatteryConsumerBuilders.put(userId, builder);
            }
+33 −6
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ import android.annotation.NonNull;
class PowerComponents {
    private static final int CUSTOM_POWER_COMPONENT_OFFSET = BatteryConsumer.POWER_COMPONENT_COUNT
            - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID;
    public static final int CUSTOM_TIME_COMPONENT_OFFSET = BatteryConsumer.TIME_COMPONENT_COUNT
    private static final int CUSTOM_TIME_COMPONENT_OFFSET = BatteryConsumer.TIME_COMPONENT_COUNT
            - BatteryConsumer.FIRST_CUSTOM_TIME_COMPONENT_ID;

    private final double mTotalConsumedPowerMah;
@@ -34,9 +34,12 @@ class PowerComponents {
    private final long[] mTimeComponentsMs;
    private final int mCustomPowerComponentCount;
    private final byte[] mPowerModels;
    // Not written to Parcel and must be explicitly restored during the parent object's unparceling
    private String[] mCustomPowerComponentNames;

    PowerComponents(@NonNull Builder builder) {
        mCustomPowerComponentCount = builder.mCustomPowerComponentCount;
        mCustomPowerComponentNames = builder.mCustomPowerComponentNames;
        mCustomPowerComponentCount = mCustomPowerComponentNames.length;
        mPowerComponentsMah = builder.mPowerComponentsMah;
        mTimeComponentsMs = builder.mTimeComponentsMs;
        mTotalConsumedPowerMah = builder.getTotalPower();
@@ -117,6 +120,26 @@ class PowerComponents {
        }
    }

    void setCustomPowerComponentNames(String[] customPowerComponentNames) {
        mCustomPowerComponentNames = customPowerComponentNames;
    }

    public String getCustomPowerComponentName(int componentId) {
        if (componentId >= BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID
                && componentId < BatteryConsumer.LAST_CUSTOM_POWER_COMPONENT_ID) {
            try {
                return mCustomPowerComponentNames[componentId
                        - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID];
            } catch (ArrayIndexOutOfBoundsException e) {
                throw new IllegalArgumentException(
                        "Unsupported custom power component ID: " + componentId);
            }
        } else {
            throw new IllegalArgumentException(
                    "Unsupported custom power component ID: " + componentId);
        }
    }

    @BatteryConsumer.PowerModel
    int getPowerModel(@BatteryConsumer.PowerComponent int component) {
        if (mPowerModels == null) {
@@ -164,20 +187,24 @@ class PowerComponents {
        }
    }

    public int getCustomPowerComponentCount() {
        return mCustomPowerComponentCount;
    }

    /**
     * Builder for PowerComponents.
     */
    static final class Builder {
        private final double[] mPowerComponentsMah;
        private final int mCustomPowerComponentCount;
        private final String[] mCustomPowerComponentNames;
        private final long[] mTimeComponentsMs;
        private final byte[] mPowerModels;

        Builder(int customPowerComponentCount, int customTimeComponentCount,
        Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
                boolean includePowerModels) {
            mCustomPowerComponentCount = customPowerComponentCount;
            mCustomPowerComponentNames = customPowerComponentNames;
            int powerComponentCount =
                    BatteryConsumer.POWER_COMPONENT_COUNT + customPowerComponentCount;
                    BatteryConsumer.POWER_COMPONENT_COUNT + mCustomPowerComponentNames.length;
            mPowerComponentsMah = new double[powerComponentCount];
            mTimeComponentsMs =
                    new long[BatteryConsumer.TIME_COMPONENT_COUNT + customTimeComponentCount];
+2 −2
Original line number Diff line number Diff line
@@ -140,9 +140,9 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable
        private double mPowerConsumedByAppsMah;
        private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;

        Builder(int customPowerComponentCount, int customTimeComponentCount,
        Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
                boolean includePowerModels, @DrainType int drainType) {
            super(customPowerComponentCount, customTimeComponentCount, includePowerModels);
            super(customPowerComponentNames, customTimeComponentCount, includePowerModels);
            mDrainType = drainType;
        }

+2 −2
Original line number Diff line number Diff line
@@ -139,9 +139,9 @@ public final class UidBatteryConsumer extends BatteryConsumer implements Parcela
        public long mTimeInBackgroundMs;
        private boolean mExcludeFromBatteryUsageStats;

        public Builder(int customPowerComponentCount, int customTimeComponentCount,
        public Builder(@NonNull String[] customPowerComponentNames, int customTimeComponentCount,
                boolean includePowerModels, @NonNull BatteryStats.Uid batteryStatsUid) {
            super(customPowerComponentCount, customTimeComponentCount, includePowerModels);
            super(customPowerComponentNames, customTimeComponentCount, includePowerModels);
            mBatteryStatsUid = batteryStatsUid;
            mUid = batteryStatsUid.getUid();
        }
Loading