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

Commit 0eca33ec authored by Hall Liu's avatar Hall Liu
Browse files

Update and expose ModemActivityInfo

Update ModemActivityInfo to present a nicer API surface and expose it as
a SystemApi. Also change clients in BatteryStats to match the new
surface.

This is part 1. Part 2 will modify the methods in TelephonyManager to
use a more up-to-standards threading model.

Bug: 170427831
Test: atest ModemActivityInfoTest
Change-Id: I762ed949342861c75d94eafce88335e7bd8c9139
parent c48de401
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -11027,6 +11027,25 @@ package android.telephony {
    field public static final String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
  }
  public final class ModemActivityInfo implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public android.telephony.ModemActivityInfo getDelta(@NonNull android.telephony.ModemActivityInfo);
    method public long getIdleTimeMillis();
    method public static int getNumTxPowerLevels();
    method public long getReceiveTimeMillis();
    method public long getSleepTimeMillis();
    method public long getTimestampMillis();
    method public long getTransmitDurationMillisAtPowerLevel(int);
    method @NonNull public android.util.Range<java.lang.Integer> getTransmitPowerRange(int);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR;
    field public static final int TX_POWER_LEVEL_0 = 0; // 0x0
    field public static final int TX_POWER_LEVEL_1 = 1; // 0x1
    field public static final int TX_POWER_LEVEL_2 = 2; // 0x2
    field public static final int TX_POWER_LEVEL_3 = 3; // 0x3
    field public static final int TX_POWER_LEVEL_4 = 4; // 0x4
  }
  public final class NetworkRegistrationInfo implements android.os.Parcelable {
    method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo();
    method public int getRegistrationState();
+0 −2
Original line number Diff line number Diff line
@@ -159,8 +159,6 @@ MissingNullability: android.telephony.ModemActivityInfo#toString():
    
MissingNullability: android.telephony.ModemActivityInfo#writeToParcel(android.os.Parcel, int) parameter #0:
    
MissingNullability: android.telephony.ModemActivityInfo.TransmitPower#toString():
    
MissingNullability: android.telephony.NetworkService#onUnbind(android.content.Intent) parameter #0:
    
MissingNullability: android.telephony.SmsCbCmasInfo#toString():
+21 −0
Original line number Diff line number Diff line
@@ -4217,6 +4217,27 @@ package android.telephony {
    field public static final String MBMS_STREAMING_SERVICE_OVERRIDE_METADATA = "mbms-streaming-service-override";
  }

  public final class ModemActivityInfo implements android.os.Parcelable {
    ctor public ModemActivityInfo(long, int, int, @NonNull int[], int);
    method public int describeContents();
    method @NonNull public android.telephony.ModemActivityInfo getDelta(@NonNull android.telephony.ModemActivityInfo);
    method public long getIdleTimeMillis();
    method public static int getNumTxPowerLevels();
    method public long getReceiveTimeMillis();
    method public long getSleepTimeMillis();
    method public long getTimestampMillis();
    method public long getTransmitDurationMillisAtPowerLevel(int);
    method @NonNull public android.util.Range<java.lang.Integer> getTransmitPowerRange(int);
    method public boolean isValid();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR;
    field public static final int TX_POWER_LEVEL_0 = 0; // 0x0
    field public static final int TX_POWER_LEVEL_1 = 1; // 0x1
    field public static final int TX_POWER_LEVEL_2 = 2; // 0x2
    field public static final int TX_POWER_LEVEL_3 = 3; // 0x3
    field public static final int TX_POWER_LEVEL_4 = 4; // 0x4
  }

  public final class NetworkRegistrationInfo implements android.os.Parcelable {
    method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo();
    method public int getRegistrationState();
+1 −1
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ public final class CellularBatteryStats implements Parcelable {
                        CellSignalStrength.getNumSignalStrengthLevels()));
        mTxTimeMs = Arrays.copyOfRange(
                txTimeMs, 0,
                Math.min(txTimeMs.length, ModemActivityInfo.TX_POWER_LEVELS));
                Math.min(txTimeMs.length, ModemActivityInfo.getNumTxPowerLevels()));
        mMonitoredRailChargeConsumedMaMs = monitoredRailChargeConsumedMaMs;
    }

+23 −46
Original line number Diff line number Diff line
@@ -65,7 +65,6 @@ import android.provider.Settings;
import android.telephony.CellSignalStrength;
import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.ModemActivityInfo;
import android.telephony.ModemActivityInfo.TransmitPower;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
@@ -7791,7 +7790,7 @@ public class BatteryStatsImpl extends BatteryStats {
        public ControllerActivityCounterImpl getOrCreateModemControllerActivityLocked() {
            if (mModemControllerActivity == null) {
                mModemControllerActivity = new ControllerActivityCounterImpl(mBsi.mOnBatteryTimeBase,
                        ModemActivityInfo.TX_POWER_LEVELS);
                        ModemActivityInfo.getNumTxPowerLevels());
            }
            return mModemControllerActivity;
        }
@@ -9257,7 +9256,7 @@ public class BatteryStatsImpl extends BatteryStats {
            if (in.readInt() != 0) {
                mModemControllerActivity = new ControllerActivityCounterImpl(mBsi.mOnBatteryTimeBase,
                        ModemActivityInfo.TX_POWER_LEVELS, in);
                        ModemActivityInfo.getNumTxPowerLevels(), in);
            } else {
                mModemControllerActivity = null;
            }
@@ -10520,7 +10519,7 @@ public class BatteryStatsImpl extends BatteryStats {
        mBluetoothActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
                NUM_BT_TX_LEVELS);
        mModemActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
                ModemActivityInfo.TX_POWER_LEVELS);
                ModemActivityInfo.getNumTxPowerLevels());
        mMobileRadioActiveTimer = new StopwatchTimer(mClocks, null, -400, null, mOnBatteryTimeBase);
        mMobileRadioActivePerAppTimer = new StopwatchTimer(mClocks, null, -401, null,
                mOnBatteryTimeBase);
@@ -11710,26 +11709,7 @@ public class BatteryStatsImpl extends BatteryStats {
        }
    }
    private ModemActivityInfo mLastModemActivityInfo =
            new ModemActivityInfo(0, 0, 0, new int[0], 0);
    private ModemActivityInfo getDeltaModemActivityInfo(ModemActivityInfo activityInfo) {
        if (activityInfo == null) {
            return null;
        }
        int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
        for (int i = 0; i < ModemActivityInfo.TX_POWER_LEVELS; i++) {
            txTimeMs[i] = activityInfo.getTransmitPowerInfo().get(i).getTimeInMillis()
                    - mLastModemActivityInfo.getTransmitPowerInfo().get(i).getTimeInMillis();
        }
        ModemActivityInfo deltaInfo = new ModemActivityInfo(activityInfo.getTimestamp(),
                activityInfo.getSleepTimeMillis() - mLastModemActivityInfo.getSleepTimeMillis(),
                activityInfo.getIdleTimeMillis() - mLastModemActivityInfo.getIdleTimeMillis(),
                txTimeMs,
                activityInfo.getReceiveTimeMillis() - mLastModemActivityInfo.getReceiveTimeMillis());
        mLastModemActivityInfo = activityInfo;
        return deltaInfo;
    }
    private ModemActivityInfo mLastModemActivityInfo = null;
    /**
     * Distribute Cell radio energy info and network traffic to apps.
@@ -11746,7 +11726,9 @@ public class BatteryStatsImpl extends BatteryStats {
        if (DEBUG_ENERGY) {
            Slog.d(TAG, "Updating mobile radio stats with " + activityInfo);
        }
        ModemActivityInfo deltaInfo = getDeltaModemActivityInfo(activityInfo);
        ModemActivityInfo deltaInfo = mLastModemActivityInfo == null ? activityInfo
                : mLastModemActivityInfo.getDelta(activityInfo);
        mLastModemActivityInfo = activityInfo;
        // Add modem tx power to history.
        addModemTxPowerToHistory(deltaInfo, elapsedRealtimeMs, uptimeMs);
@@ -11778,10 +11760,9 @@ public class BatteryStatsImpl extends BatteryStats {
                mModemActivity.getSleepTimeCounter().addCountLocked(
                        deltaInfo.getSleepTimeMillis());
                mModemActivity.getRxTimeCounter().addCountLocked(deltaInfo.getReceiveTimeMillis());
                for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
                for (int lvl = 0; lvl < ModemActivityInfo.getNumTxPowerLevels(); lvl++) {
                    mModemActivity.getTxTimeCounters()[lvl]
                        .addCountLocked(deltaInfo.getTransmitPowerInfo()
                            .get(lvl).getTimeInMillis());
                        .addCountLocked(deltaInfo.getTransmitDurationMillisAtPowerLevel(lvl));
                }
                // POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
@@ -11795,11 +11776,11 @@ public class BatteryStatsImpl extends BatteryStats {
                            mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_IDLE)
                            + deltaInfo.getReceiveTimeMillis() *
                            mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_RX);
                    List<TransmitPower> txPowerInfo = deltaInfo.getTransmitPowerInfo();
                    for (int i = 0; i < Math.min(txPowerInfo.size(),
                    for (int i = 0; i < Math.min(ModemActivityInfo.getNumTxPowerLevels(),
                            CellSignalStrength.getNumSignalStrengthLevels()); i++) {
                        energyUsed += txPowerInfo.get(i).getTimeInMillis() * mPowerProfile
                            .getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, i);
                        energyUsed += deltaInfo.getTransmitDurationMillisAtPowerLevel(i)
                                * mPowerProfile.getAveragePower(
                                        PowerProfile.POWER_MODEM_CONTROLLER_TX, i);
                    }
                    // We store the power drain as mAms.
@@ -11894,10 +11875,10 @@ public class BatteryStatsImpl extends BatteryStats {
                            }
                            if (totalTxPackets > 0 && entry.txPackets > 0) {
                                for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
                                    long txMs =
                                            entry.txPackets * deltaInfo.getTransmitPowerInfo()
                                                .get(lvl).getTimeInMillis();
                                for (int lvl = 0; lvl < ModemActivityInfo.getNumTxPowerLevels();
                                        lvl++) {
                                    long txMs = entry.txPackets
                                            * deltaInfo.getTransmitDurationMillisAtPowerLevel(lvl);
                                    txMs /= totalTxPackets;
                                    activityCounter.getTxTimeCounters()[lvl].addCountLocked(txMs);
                                }
@@ -11929,18 +11910,14 @@ public class BatteryStatsImpl extends BatteryStats {
        if (activityInfo == null) {
            return;
        }
        List<TransmitPower> txPowerInfo = activityInfo.getTransmitPowerInfo();
        if (txPowerInfo == null || txPowerInfo.size() != ModemActivityInfo.TX_POWER_LEVELS) {
            return;
        }
        int levelMaxTimeSpent = 0;
        for (int i = 1; i < txPowerInfo.size(); i++) {
            if (txPowerInfo.get(i).getTimeInMillis() > txPowerInfo.get(levelMaxTimeSpent)
                .getTimeInMillis()) {
        for (int i = 1; i < ModemActivityInfo.getNumTxPowerLevels(); i++) {
            if (activityInfo.getTransmitDurationMillisAtPowerLevel(i)
                    > activityInfo.getTransmitDurationMillisAtPowerLevel(levelMaxTimeSpent)) {
                levelMaxTimeSpent = i;
            }
        }
        if (levelMaxTimeSpent == ModemActivityInfo.TX_POWER_LEVELS - 1) {
        if (levelMaxTimeSpent == ModemActivityInfo.getNumTxPowerLevels() - 1) {
            mHistoryCur.states2 |= HistoryItem.STATE2_CELLULAR_HIGH_TX_POWER_FLAG;
            addHistoryRecordLocked(elapsedRealtimeMs, uptimeMs);
        }
@@ -13462,7 +13439,7 @@ public class BatteryStatsImpl extends BatteryStats {
            timeInRxSignalStrengthLevelMs[i] =
                getPhoneSignalStrengthTime(i, rawRealTimeUs, which) / 1000;
        }
        long[] txTimeMs = new long[Math.min(ModemActivityInfo.TX_POWER_LEVELS,
        long[] txTimeMs = new long[Math.min(ModemActivityInfo.getNumTxPowerLevels(),
            counter.getTxTimeCounters().length)];
        long totalTxTimeMs = 0;
        for (int i = 0; i < txTimeMs.length; i++) {
@@ -15601,7 +15578,7 @@ public class BatteryStatsImpl extends BatteryStats {
        mBluetoothActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
                NUM_BT_TX_LEVELS, in);
        mModemActivity = new ControllerActivityCounterImpl(mOnBatteryTimeBase,
                ModemActivityInfo.TX_POWER_LEVELS, in);
                ModemActivityInfo.getNumTxPowerLevels(), in);
        mHasWifiReporting = in.readInt() != 0;
        mHasBluetoothReporting = in.readInt() != 0;
        mHasModemReporting = in.readInt() != 0;
Loading