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

Commit f880e7c8 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov Committed by Android (Google) Code Review
Browse files

Merge changes from topic "mobile-radio-power-stats-collector" into main

* changes:
  Simplify naming of power stats processors
  Include the entire PowerStatsTests source into the Ravenwood version
  Export mobile radio and phone call stats to BatteryUsageStats
  Introduce PowerStatsProcessor for phone calls
  Introduce PowerStatsProcessor for mobile radio
  Enable PowerProfile tests in Ravenwood
  Introduce PowerStatsCollector for mobile networking
  Add support for power component states to PowerStats
parents cb9e0875 99aacb29
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -228,6 +228,17 @@ public final class LongArrayMultiStateCounter implements Parcelable {
        native_setState(mNativeObject, state, timestampMs);
    }

    /**
     * Copies time-in-state and timestamps from the supplied counter.
     */
    public void copyStatesFrom(LongArrayMultiStateCounter counter) {
        if (mStateCount != counter.mStateCount) {
            throw new IllegalArgumentException(
                    "State count is not the same: " + mStateCount + " vs. " + counter.mStateCount);
        }
        native_copyStatesFrom(mNativeObject, counter.mNativeObject);
    }

    /**
     * Sets the new values for the given state.
     */
@@ -375,6 +386,10 @@ public final class LongArrayMultiStateCounter implements Parcelable {
    @CriticalNative
    private static native void native_setState(long nativeObject, int state, long timestampMs);

    @CriticalNative
    private static native void native_copyStatesFrom(long nativeObjectTarget,
            long nativeObjectSource);

    @CriticalNative
    private static native void native_setValues(long nativeObject, int state,
            long longArrayContainerNativeObject);
+35 −7
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.internal.os;


import android.annotation.LongDef;
import android.annotation.Nullable;
import android.annotation.StringDef;
import android.annotation.XmlRes;
import android.compat.annotation.UnsupportedAppUsage;
@@ -352,19 +353,39 @@ public class PowerProfile {
     * WARNING: use only for testing!
     */
    @VisibleForTesting
    public void forceInitForTesting(Context context, @XmlRes int xmlId) {
    public void initForTesting(XmlPullParser parser) {
        initForTesting(parser, null);
    }

    /**
     * Reinitialize the PowerProfile with the provided XML, using optional Resources for fallback
     * configuration settings.
     * WARNING: use only for testing!
     */
    @VisibleForTesting
    public void initForTesting(XmlPullParser parser, @Nullable Resources resources) {
        synchronized (sLock) {
            sPowerItemMap.clear();
            sPowerArrayMap.clear();
            sModemPowerProfile.clear();
            initLocked(context, xmlId);

            try {
                readPowerValuesFromXml(parser, resources);
            } finally {
                if (parser instanceof XmlResourceParser) {
                    ((XmlResourceParser) parser).close();
                }
            }
            initLocked();
        }
    }

    @GuardedBy("sLock")
    private void initLocked(Context context, @XmlRes int xmlId) {
        if (sPowerItemMap.size() == 0 && sPowerArrayMap.size() == 0) {
            readPowerValuesFromXml(context, xmlId);
            final Resources resources = context.getResources();
            XmlResourceParser parser = resources.getXml(xmlId);
            readPowerValuesFromXml(parser, resources);
        }
        initLocked();
    }
@@ -377,9 +398,8 @@ public class PowerProfile {
        initModem();
    }

    private void readPowerValuesFromXml(Context context, @XmlRes int xmlId) {
        final Resources resources = context.getResources();
        XmlResourceParser parser = resources.getXml(xmlId);
    private static void readPowerValuesFromXml(XmlPullParser parser,
            @Nullable Resources resources) {
        boolean parsingArray = false;
        ArrayList<Double> array = new ArrayList<>();
        String arrayName = null;
@@ -430,9 +450,17 @@ public class PowerProfile {
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            parser.close();
            if (parser instanceof XmlResourceParser) {
                ((XmlResourceParser) parser).close();
            }
        }

        if (resources != null) {
            getDefaultValuesFromConfig(resources);
        }
    }

    private static void getDefaultValuesFromConfig(Resources resources) {
        // Now collect other config variables.
        int[] configResIds = new int[]{
                com.android.internal.R.integer.config_bluetooth_idle_cur_ma,
+151 −21
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ public final class PowerStats {

    private static final BatteryStatsHistory.VarintParceler VARINT_PARCELER =
            new BatteryStatsHistory.VarintParceler();
    private static final byte PARCEL_FORMAT_VERSION = 1;
    private static final byte PARCEL_FORMAT_VERSION = 2;

    private static final int PARCEL_FORMAT_VERSION_MASK = 0x000000FF;
    private static final int PARCEL_FORMAT_VERSION_SHIFT =
@@ -57,7 +57,12 @@ public final class PowerStats {
            Integer.numberOfTrailingZeros(STATS_ARRAY_LENGTH_MASK);
    public static final int MAX_STATS_ARRAY_LENGTH =
            (1 << Integer.bitCount(STATS_ARRAY_LENGTH_MASK)) - 1;
    private static final int UID_STATS_ARRAY_LENGTH_MASK = 0x00FF0000;
    private static final int STATE_STATS_ARRAY_LENGTH_MASK = 0x00FF0000;
    private static final int STATE_STATS_ARRAY_LENGTH_SHIFT =
            Integer.numberOfTrailingZeros(STATE_STATS_ARRAY_LENGTH_MASK);
    public static final int MAX_STATE_STATS_ARRAY_LENGTH =
            (1 << Integer.bitCount(STATE_STATS_ARRAY_LENGTH_MASK)) - 1;
    private static final int UID_STATS_ARRAY_LENGTH_MASK = 0xFF000000;
    private static final int UID_STATS_ARRAY_LENGTH_SHIFT =
            Integer.numberOfTrailingZeros(UID_STATS_ARRAY_LENGTH_MASK);
    public static final int MAX_UID_STATS_ARRAY_LENGTH =
@@ -74,6 +79,10 @@ public final class PowerStats {
        private static final String XML_ATTR_ID = "id";
        private static final String XML_ATTR_NAME = "name";
        private static final String XML_ATTR_STATS_ARRAY_LENGTH = "stats-array-length";
        private static final String XML_TAG_STATE = "state";
        private static final String XML_ATTR_STATE_KEY = "key";
        private static final String XML_ATTR_STATE_LABEL = "label";
        private static final String XML_ATTR_STATE_STATS_ARRAY_LENGTH = "state-stats-array-length";
        private static final String XML_ATTR_UID_STATS_ARRAY_LENGTH = "uid-stats-array-length";
        private static final String XML_TAG_EXTRAS = "extras";

@@ -85,7 +94,24 @@ public final class PowerStats {
        public final int powerComponentId;
        public final String name;

        /**
         * Stats for the power component, such as the total usage time.
         */
        public final int statsArrayLength;

        /**
         * Map of device state codes to their corresponding human-readable labels.
         */
        public final SparseArray<String> stateLabels;

        /**
         * Stats for a specific state of the power component, e.g. "mobile radio in the 5G mode"
         */
        public final int stateStatsArrayLength;

        /**
         * Stats for the usage of this power component by a specific UID (app)
         */
        public final int uidStatsArrayLength;

        /**
@@ -95,17 +121,25 @@ public final class PowerStats {
        public final PersistableBundle extras;

        public Descriptor(@BatteryConsumer.PowerComponent int powerComponentId,
                int statsArrayLength, int uidStatsArrayLength, @NonNull PersistableBundle extras) {
                int statsArrayLength, @Nullable SparseArray<String> stateLabels,
                int stateStatsArrayLength, int uidStatsArrayLength,
                @NonNull PersistableBundle extras) {
            this(powerComponentId, BatteryConsumer.powerComponentIdToString(powerComponentId),
                    statsArrayLength, uidStatsArrayLength, extras);
                    statsArrayLength, stateLabels, stateStatsArrayLength, uidStatsArrayLength,
                    extras);
        }

        public Descriptor(int customPowerComponentId, String name, int statsArrayLength,
                @Nullable SparseArray<String> stateLabels, int stateStatsArrayLength,
                int uidStatsArrayLength, PersistableBundle extras) {
            if (statsArrayLength > MAX_STATS_ARRAY_LENGTH) {
                throw new IllegalArgumentException(
                        "statsArrayLength is too high. Max = " + MAX_STATS_ARRAY_LENGTH);
            }
            if (stateStatsArrayLength > MAX_STATE_STATS_ARRAY_LENGTH) {
                throw new IllegalArgumentException(
                        "stateStatsArrayLength is too high. Max = " + MAX_STATE_STATS_ARRAY_LENGTH);
            }
            if (uidStatsArrayLength > MAX_UID_STATS_ARRAY_LENGTH) {
                throw new IllegalArgumentException(
                        "uidStatsArrayLength is too high. Max = " + MAX_UID_STATS_ARRAY_LENGTH);
@@ -113,10 +147,24 @@ public final class PowerStats {
            this.powerComponentId = customPowerComponentId;
            this.name = name;
            this.statsArrayLength = statsArrayLength;
            this.stateLabels = stateLabels != null ? stateLabels : new SparseArray<>();
            this.stateStatsArrayLength = stateStatsArrayLength;
            this.uidStatsArrayLength = uidStatsArrayLength;
            this.extras = extras;
        }

        /**
         * Returns the label associated with the give state key, e.g. "5G-high" for the
         * state of Mobile Radio representing the 5G mode and high signal power.
         */
        public String getStateLabel(int key) {
            String label = stateLabels.get(key);
            if (label != null) {
                return label;
            }
            return name + "-" + Integer.toHexString(key);
        }

        /**
         * Writes the Descriptor into the parcel.
         */
@@ -125,11 +173,18 @@ public final class PowerStats {
                             & PARCEL_FORMAT_VERSION_MASK)
                            | ((statsArrayLength << STATS_ARRAY_LENGTH_SHIFT)
                               & STATS_ARRAY_LENGTH_MASK)
                            | ((stateStatsArrayLength << STATE_STATS_ARRAY_LENGTH_SHIFT)
                               & STATE_STATS_ARRAY_LENGTH_MASK)
                            | ((uidStatsArrayLength << UID_STATS_ARRAY_LENGTH_SHIFT)
                               & UID_STATS_ARRAY_LENGTH_MASK);
            parcel.writeInt(firstWord);
            parcel.writeInt(powerComponentId);
            parcel.writeString(name);
            parcel.writeInt(stateLabels.size());
            for (int i = 0, size = stateLabels.size(); i < size; i++) {
                parcel.writeInt(stateLabels.keyAt(i));
                parcel.writeString(stateLabels.valueAt(i));
            }
            extras.writeToParcel(parcel, 0);
        }

@@ -148,13 +203,22 @@ public final class PowerStats {
            }
            int statsArrayLength =
                    (firstWord & STATS_ARRAY_LENGTH_MASK) >>> STATS_ARRAY_LENGTH_SHIFT;
            int stateStatsArrayLength =
                    (firstWord & STATE_STATS_ARRAY_LENGTH_MASK) >>> STATE_STATS_ARRAY_LENGTH_SHIFT;
            int uidStatsArrayLength =
                    (firstWord & UID_STATS_ARRAY_LENGTH_MASK) >>> UID_STATS_ARRAY_LENGTH_SHIFT;
            int powerComponentId = parcel.readInt();
            String name = parcel.readString();
            int stateLabelCount = parcel.readInt();
            SparseArray<String> stateLabels = new SparseArray<>(stateLabelCount);
            for (int i = stateLabelCount; i > 0; i--) {
                int key = parcel.readInt();
                String label = parcel.readString();
                stateLabels.put(key, label);
            }
            PersistableBundle extras = parcel.readPersistableBundle();
            return new Descriptor(powerComponentId, name, statsArrayLength, uidStatsArrayLength,
                    extras);
            return new Descriptor(powerComponentId, name, statsArrayLength, stateLabels,
                    stateStatsArrayLength, uidStatsArrayLength, extras);
        }

        @Override
@@ -164,6 +228,8 @@ public final class PowerStats {
            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
@@ -179,7 +245,14 @@ public final class PowerStats {
            serializer.attributeInt(null, XML_ATTR_ID, powerComponentId);
            serializer.attribute(null, XML_ATTR_NAME, name);
            serializer.attributeInt(null, XML_ATTR_STATS_ARRAY_LENGTH, statsArrayLength);
            serializer.attributeInt(null, XML_ATTR_STATE_STATS_ARRAY_LENGTH, stateStatsArrayLength);
            serializer.attributeInt(null, XML_ATTR_UID_STATS_ARRAY_LENGTH, uidStatsArrayLength);
            for (int i = stateLabels.size() - 1; i >= 0; i--) {
                serializer.startTag(null, XML_TAG_STATE);
                serializer.attributeInt(null, XML_ATTR_STATE_KEY, stateLabels.keyAt(i));
                serializer.attribute(null, XML_ATTR_STATE_LABEL, stateLabels.valueAt(i));
                serializer.endTag(null, XML_TAG_STATE);
            }
            try {
                serializer.startTag(null, XML_TAG_EXTRAS);
                extras.saveToXml(serializer);
@@ -199,6 +272,8 @@ public final class PowerStats {
            int powerComponentId = -1;
            String name = null;
            int statsArrayLength = 0;
            SparseArray<String> stateLabels = new SparseArray<>();
            int stateStatsArrayLength = 0;
            int uidStatsArrayLength = 0;
            PersistableBundle extras = null;
            int eventType = parser.getEventType();
@@ -212,9 +287,16 @@ public final class PowerStats {
                            name = parser.getAttributeValue(null, XML_ATTR_NAME);
                            statsArrayLength = parser.getAttributeInt(null,
                                    XML_ATTR_STATS_ARRAY_LENGTH);
                            stateStatsArrayLength = parser.getAttributeInt(null,
                                    XML_ATTR_STATE_STATS_ARRAY_LENGTH);
                            uidStatsArrayLength = parser.getAttributeInt(null,
                                    XML_ATTR_UID_STATS_ARRAY_LENGTH);
                            break;
                        case XML_TAG_STATE:
                            int value = parser.getAttributeInt(null, XML_ATTR_STATE_KEY);
                            String label = parser.getAttributeValue(null, XML_ATTR_STATE_LABEL);
                            stateLabels.put(value, label);
                            break;
                        case XML_TAG_EXTRAS:
                            extras = PersistableBundle.restoreFromXml(parser);
                            break;
@@ -225,11 +307,11 @@ public final class PowerStats {
            if (powerComponentId == -1) {
                return null;
            } else if (powerComponentId >= BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID) {
                return new Descriptor(powerComponentId, name, statsArrayLength, uidStatsArrayLength,
                        extras);
                return new Descriptor(powerComponentId, name, statsArrayLength,
                        stateLabels, stateStatsArrayLength, uidStatsArrayLength, extras);
            } else if (powerComponentId < BatteryConsumer.POWER_COMPONENT_COUNT) {
                return new Descriptor(powerComponentId, statsArrayLength, uidStatsArrayLength,
                        extras);
                return new Descriptor(powerComponentId, statsArrayLength, stateLabels,
                        stateStatsArrayLength, uidStatsArrayLength, extras);
            } else {
                Slog.e(TAG, "Unrecognized power component: " + powerComponentId);
                return null;
@@ -250,6 +332,8 @@ public final class PowerStats {
                    + "powerComponentId=" + powerComponentId
                    + ", name='" + name + '\''
                    + ", statsArrayLength=" + statsArrayLength
                    + ", stateStatsArrayLength=" + stateStatsArrayLength
                    + ", stateLabels=" + stateLabels
                    + ", uidStatsArrayLength=" + uidStatsArrayLength
                    + ", extras=" + extras
                    + '}';
@@ -292,6 +376,12 @@ public final class PowerStats {
     */
    public long[] stats;

    /**
     * Device-wide mode stats, used when the power component can operate in different modes,
     * e.g. RATs such as LTE and 5G.
     */
    public final SparseArray<long[]> stateStats = new SparseArray<>();

    /**
     * Per-UID CPU stats.
     */
@@ -313,6 +403,15 @@ public final class PowerStats {
        parcel.writeInt(descriptor.powerComponentId);
        parcel.writeLong(durationMs);
        VARINT_PARCELER.writeLongArray(parcel, stats);

        if (descriptor.stateStatsArrayLength != 0) {
            parcel.writeInt(stateStats.size());
            for (int i = 0; i < stateStats.size(); i++) {
                parcel.writeInt(stateStats.keyAt(i));
                VARINT_PARCELER.writeLongArray(parcel, stateStats.valueAt(i));
            }
        }

        parcel.writeInt(uidStats.size());
        for (int i = 0; i < uidStats.size(); i++) {
            parcel.writeInt(uidStats.keyAt(i));
@@ -347,6 +446,17 @@ public final class PowerStats {
            stats.durationMs = parcel.readLong();
            stats.stats = new long[descriptor.statsArrayLength];
            VARINT_PARCELER.readLongArray(parcel, stats.stats);

            if (descriptor.stateStatsArrayLength != 0) {
                int count = parcel.readInt();
                for (int i = 0; i < count; i++) {
                    int state = parcel.readInt();
                    long[] stateStats = new long[descriptor.stateStatsArrayLength];
                    VARINT_PARCELER.readLongArray(parcel, stateStats);
                    stats.stateStats.put(state, stateStats);
                }
            }

            int uidCount = parcel.readInt();
            for (int i = 0; i < uidCount; i++) {
                int uid = parcel.readInt();
@@ -376,6 +486,14 @@ public final class PowerStats {
        if (stats.length > 0) {
            sb.append("=").append(Arrays.toString(stats));
        }
        if (descriptor.stateStatsArrayLength != 0) {
            for (int i = 0; i < stateStats.size(); i++) {
                sb.append(" [");
                sb.append(descriptor.getStateLabel(stateStats.keyAt(i)));
                sb.append("]=");
                sb.append(Arrays.toString(stateStats.valueAt(i)));
            }
        }
        for (int i = 0; i < uidStats.size(); i++) {
            sb.append(uidPrefix)
                    .append(UserHandle.formatUid(uidStats.keyAt(i)))
@@ -391,6 +509,18 @@ public final class PowerStats {
        pw.println("PowerStats: " + descriptor.name + " (" + descriptor.powerComponentId + ')');
        pw.increaseIndent();
        pw.print("duration", durationMs).println();
        if (descriptor.statsArrayLength != 0) {
            pw.print("stats", Arrays.toString(stats)).println();
        }
        if (descriptor.stateStatsArrayLength != 0) {
            for (int i = 0; i < stateStats.size(); i++) {
                pw.print("state ");
                pw.print(descriptor.getStateLabel(stateStats.keyAt(i)));
                pw.print(": ");
                pw.print(Arrays.toString(stateStats.valueAt(i)));
                pw.println();
            }
        }
        for (int i = 0; i < uidStats.size(); i++) {
            pw.print("UID ");
            pw.print(uidStats.keyAt(i));
+87 −4
Original line number Diff line number Diff line
@@ -17,14 +17,16 @@
package com.android.internal.power;

import android.annotation.IntDef;
import android.content.res.XmlResourceParser;
import android.os.BatteryStats;
import android.telephony.ModemActivityInfo;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseDoubleArray;

import com.android.internal.os.PowerProfile;
import com.android.internal.util.XmlUtils;

import org.xmlpull.v1.XmlPullParser;
@@ -95,6 +97,8 @@ public class ModemPowerProfile {
     */
    public static final int MODEM_DRAIN_TYPE_TX = 0x3000_0000;

    private static final int IGNORE = -1;

    @IntDef(prefix = {"MODEM_DRAIN_TYPE_"}, value = {
            MODEM_DRAIN_TYPE_SLEEP,
            MODEM_DRAIN_TYPE_IDLE,
@@ -256,7 +260,7 @@ public class ModemPowerProfile {
    /**
     * Generates a ModemPowerProfile object from the <modem /> element of a power_profile.xml
     */
    public void parseFromXml(XmlResourceParser parser) throws IOException,
    public void parseFromXml(XmlPullParser parser) throws IOException,
            XmlPullParserException {
        final int depth = parser.getDepth();
        while (XmlUtils.nextElementWithin(parser, depth)) {
@@ -286,7 +290,7 @@ public class ModemPowerProfile {
    }

    /** Parse the <active /> XML element */
    private void parseActivePowerConstantsFromXml(XmlResourceParser parser)
    private void parseActivePowerConstantsFromXml(XmlPullParser parser)
            throws IOException, XmlPullParserException {
        // Parse attributes to get the type of active modem usage the power constants are for.
        final int ratType;
@@ -339,7 +343,7 @@ public class ModemPowerProfile {
        }
    }

    private static int getTypeFromAttribute(XmlResourceParser parser, String attr,
    private static int getTypeFromAttribute(XmlPullParser parser, String attr,
            SparseArray<String> names) {
        final String value = XmlUtils.readStringAttribute(parser, attr);
        if (value == null) {
@@ -382,6 +386,84 @@ public class ModemPowerProfile {
        }
    }

    public static long getAverageBatteryDrainKey(@ModemDrainType int drainType,
            @BatteryStats.RadioAccessTechnology int rat, @ServiceState.FrequencyRange int freqRange,
            int txLevel) {
        long key = PowerProfile.SUBSYSTEM_MODEM;

        // Attach Modem drain type to the key if specified.
        if (drainType != IGNORE) {
            key |= drainType;
        }

        // Attach RadioAccessTechnology to the key if specified.
        switch (rat) {
            case IGNORE:
                // do nothing
                break;
            case BatteryStats.RADIO_ACCESS_TECHNOLOGY_OTHER:
                key |= MODEM_RAT_TYPE_DEFAULT;
                break;
            case BatteryStats.RADIO_ACCESS_TECHNOLOGY_LTE:
                key |= MODEM_RAT_TYPE_LTE;
                break;
            case BatteryStats.RADIO_ACCESS_TECHNOLOGY_NR:
                key |= MODEM_RAT_TYPE_NR;
                break;
            default:
                Log.w(TAG, "Unexpected RadioAccessTechnology : " + rat);
        }

        // Attach NR Frequency Range to the key if specified.
        switch (freqRange) {
            case IGNORE:
                // do nothing
                break;
            case ServiceState.FREQUENCY_RANGE_UNKNOWN:
                key |= MODEM_NR_FREQUENCY_RANGE_DEFAULT;
                break;
            case ServiceState.FREQUENCY_RANGE_LOW:
                key |= MODEM_NR_FREQUENCY_RANGE_LOW;
                break;
            case ServiceState.FREQUENCY_RANGE_MID:
                key |= MODEM_NR_FREQUENCY_RANGE_MID;
                break;
            case ServiceState.FREQUENCY_RANGE_HIGH:
                key |= MODEM_NR_FREQUENCY_RANGE_HIGH;
                break;
            case ServiceState.FREQUENCY_RANGE_MMWAVE:
                key |= MODEM_NR_FREQUENCY_RANGE_MMWAVE;
                break;
            default:
                Log.w(TAG, "Unexpected NR frequency range : " + freqRange);
        }

        // Attach transmission level to the key if specified.
        switch (txLevel) {
            case IGNORE:
                // do nothing
                break;
            case 0:
                key |= MODEM_TX_LEVEL_0;
                break;
            case 1:
                key |= MODEM_TX_LEVEL_1;
                break;
            case 2:
                key |= MODEM_TX_LEVEL_2;
                break;
            case 3:
                key |= MODEM_TX_LEVEL_3;
                break;
            case 4:
                key |= MODEM_TX_LEVEL_4;
                break;
            default:
                Log.w(TAG, "Unexpected transmission level : " + txLevel);
        }
        return key;
    }

    /**
     * Returns the average battery drain in milli-amps of the modem for a given drain type.
     * Returns {@link Double.NaN} if a suitable value is not found for the given key.
@@ -444,6 +526,7 @@ public class ModemPowerProfile {
        }
        return sb.toString();
    }

    private static void appendFieldToString(StringBuilder sb, String fieldName,
            SparseArray<String> names, int key) {
        sb.append(fieldName);
+10 −0
Original line number Diff line number Diff line
@@ -55,6 +55,14 @@ static void native_setState(jlong nativePtr, jint state, jlong timestamp) {
    counter->setState(state, timestamp);
}

static void native_copyStatesFrom(jlong nativePtrTarget, jlong nativePtrSource) {
    battery::LongArrayMultiStateCounter *counterTarget =
            reinterpret_cast<battery::LongArrayMultiStateCounter *>(nativePtrTarget);
    battery::LongArrayMultiStateCounter *counterSource =
            reinterpret_cast<battery::LongArrayMultiStateCounter *>(nativePtrSource);
    counterTarget->copyStatesFrom(*counterSource);
}

static void native_setValues(jlong nativePtr, jint state, jlong longArrayContainerNativePtr) {
    battery::LongArrayMultiStateCounter *counter =
            reinterpret_cast<battery::LongArrayMultiStateCounter *>(nativePtr);
@@ -219,6 +227,8 @@ static const JNINativeMethod g_LongArrayMultiStateCounter_methods[] = {
        // @CriticalNative
        {"native_setState", "(JIJ)V", (void *)native_setState},
        // @CriticalNative
        {"native_copyStatesFrom", "(JJ)V", (void *)native_copyStatesFrom},
        // @CriticalNative
        {"native_setValues", "(JIJ)V", (void *)native_setValues},
        // @CriticalNative
        {"native_updateValues", "(JJJ)V", (void *)native_updateValues},
Loading