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

Commit 700b2aee authored by Michael Wachenschwanz's avatar Michael Wachenschwanz Committed by Presubmit Automerger Backend
Browse files

[automerge] Utilize specific info provided by the Modem HAL 2p: adfc51a5

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17185841

Bug: 207697945
Change-Id: I544f2ecf3dba4efe7c6ba39392f20b72e5535317
parents d353e355 adfc51a5
Loading
Loading
Loading
Loading
+117 −60
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ import android.os.connectivity.GpsBatteryStats;
import android.os.connectivity.WifiActivityEnergyInfo;
import android.os.connectivity.WifiBatteryStats;
import android.provider.Settings;
import android.telephony.AccessNetworkConstants;
import android.telephony.Annotation.NetworkType;
import android.telephony.CellSignalStrength;
import android.telephony.CellSignalStrengthLte;
@@ -6830,6 +6831,27 @@ public class BatteryStatsImpl extends BatteryStats {
        }
    }
    @RadioAccessTechnology
    private static int mapRadioAccessNetworkTypeToRadioAccessTechnology(
            @AccessNetworkConstants.RadioAccessNetworkType int dataType) {
        switch (dataType) {
            case AccessNetworkConstants.AccessNetworkType.NGRAN:
                return RADIO_ACCESS_TECHNOLOGY_NR;
            case AccessNetworkConstants.AccessNetworkType.EUTRAN:
                return RADIO_ACCESS_TECHNOLOGY_LTE;
            case AccessNetworkConstants.AccessNetworkType.UNKNOWN: //fallthrough
            case AccessNetworkConstants.AccessNetworkType.GERAN: //fallthrough
            case AccessNetworkConstants.AccessNetworkType.UTRAN: //fallthrough
            case AccessNetworkConstants.AccessNetworkType.CDMA2000: //fallthrough
            case AccessNetworkConstants.AccessNetworkType.IWLAN:
                return RADIO_ACCESS_TECHNOLOGY_OTHER;
            default:
                Slog.w(TAG,
                        "Unhandled RadioAccessNetworkType (" + dataType + "), mapping to OTHER");
                return RADIO_ACCESS_TECHNOLOGY_OTHER;
        }
    }
    @GuardedBy("this")
    public void noteWifiOnLocked() {
        noteWifiOnLocked(mClock.elapsedRealtime(), mClock.uptimeMillis());
@@ -13721,66 +13743,7 @@ public class BatteryStatsImpl extends BatteryStats {
                    mTmpRailStats.resetCellularTotalEnergyUsed();
                }
                // Proportionally smear Rx and Tx times across each RAt
                final int levelCount = CellSignalStrength.getNumSignalStrengthLevels();
                long[] perSignalStrengthActiveTimeMs = new long[levelCount];
                long totalActiveTimeMs = 0;
                for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
                    final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
                    if (ratStats == null) continue;
                    final int freqCount = ratStats.getFrequencyRangeCount();
                    for (int freq = 0; freq < freqCount; freq++) {
                        for (int level = 0; level < levelCount; level++) {
                            final long durationMs = ratStats.getTimeSinceMark(freq, level,
                                    elapsedRealtimeMs);
                            perSignalStrengthActiveTimeMs[level] += durationMs;
                            totalActiveTimeMs += durationMs;
                        }
                    }
                }
                if (totalActiveTimeMs != 0) {
                    // Smear the provided Tx/Rx durations across each RAT, frequency, and signal
                    // strength.
                    for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
                        final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
                        if (ratStats == null) continue;
                        final int freqCount = ratStats.getFrequencyRangeCount();
                        for (int freq = 0; freq < freqCount; freq++) {
                            long frequencyDurationMs = 0;
                            for (int level = 0; level < levelCount; level++) {
                                final long durationMs = ratStats.getTimeSinceMark(freq, level,
                                        elapsedRealtimeMs);
                                final long totalLvlDurationMs =
                                        perSignalStrengthActiveTimeMs[level];
                                if (totalLvlDurationMs == 0) continue;
                                final long totalTxLvlDurations =
                                        deltaInfo.getTransmitDurationMillisAtPowerLevel(level);
                                // Smear HAL provided Tx power level duration based on active modem
                                // duration in a given state. (Add totalLvlDurationMs / 2 before
                                // the integer division with totalLvlDurationMs for rounding.)
                                final long proportionalTxDurationMs =
                                        (durationMs * totalTxLvlDurations
                                                + (totalLvlDurationMs / 2)) / totalLvlDurationMs;
                                ratStats.incrementTxDuration(freq, level, proportionalTxDurationMs);
                                frequencyDurationMs += durationMs;
                            }
                            final long totalRxDuration = deltaInfo.getReceiveTimeMillis();
                            // Smear HAL provided Rx power duration based on active modem
                            // duration in a given state.  (Add totalActiveTimeMs / 2 before the
                            // integer division with totalActiveTimeMs for rounding.)
                            final long proportionalRxDurationMs =
                                    (frequencyDurationMs * totalRxDuration + (totalActiveTimeMs
                                            / 2)) / totalActiveTimeMs;
                            ratStats.incrementRxDuration(freq, proportionalRxDurationMs);
                        }
                        ratStats.setMark(elapsedRealtimeMs);
                    }
                }
                incrementPerRatDataLocked(deltaInfo, elapsedRealtimeMs);
            }
            long totalAppRadioTimeUs = mMobileRadioActivePerAppTimer.getTimeSinceMarkLocked(
                    elapsedRealtimeMs * 1000);
@@ -13931,6 +13894,100 @@ public class BatteryStatsImpl extends BatteryStats {
        }
    }
    @GuardedBy("this")
    private void incrementPerRatDataLocked(ModemActivityInfo deltaInfo, long elapsedRealtimeMs) {
        final int infoSize = deltaInfo.getSpecificInfoLength();
        if (infoSize == 1 && deltaInfo.getSpecificInfoRat(0)
                == AccessNetworkConstants.AccessNetworkType.UNKNOWN
                && deltaInfo.getSpecificInfoFrequencyRange(0)
                == ServiceState.FREQUENCY_RANGE_UNKNOWN) {
            // Specific info data unavailable. Proportionally smear Rx and Tx times across each RAT.
            final int levelCount = CellSignalStrength.getNumSignalStrengthLevels();
            long[] perSignalStrengthActiveTimeMs = new long[levelCount];
            long totalActiveTimeMs = 0;
            for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
                final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
                if (ratStats == null) continue;
                final int freqCount = ratStats.getFrequencyRangeCount();
                for (int freq = 0; freq < freqCount; freq++) {
                    for (int level = 0; level < levelCount; level++) {
                        final long durationMs = ratStats.getTimeSinceMark(freq, level,
                                elapsedRealtimeMs);
                        perSignalStrengthActiveTimeMs[level] += durationMs;
                        totalActiveTimeMs += durationMs;
                    }
                }
            }
            if (totalActiveTimeMs != 0) {
                // Smear the provided Tx/Rx durations across each RAT, frequency, and signal
                // strength.
                for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
                    final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
                    if (ratStats == null) continue;
                    final int freqCount = ratStats.getFrequencyRangeCount();
                    for (int freq = 0; freq < freqCount; freq++) {
                        long frequencyDurationMs = 0;
                        for (int level = 0; level < levelCount; level++) {
                            final long durationMs = ratStats.getTimeSinceMark(freq, level,
                                    elapsedRealtimeMs);
                            final long totalLvlDurationMs =
                                    perSignalStrengthActiveTimeMs[level];
                            if (totalLvlDurationMs == 0) continue;
                            final long totalTxLvlDurations =
                                    deltaInfo.getTransmitDurationMillisAtPowerLevel(level);
                            // Smear HAL provided Tx power level duration based on active modem
                            // duration in a given state. (Add totalLvlDurationMs / 2 before
                            // the integer division with totalLvlDurationMs for rounding.)
                            final long proportionalTxDurationMs =
                                    (durationMs * totalTxLvlDurations
                                            + (totalLvlDurationMs / 2)) / totalLvlDurationMs;
                            ratStats.incrementTxDuration(freq, level, proportionalTxDurationMs);
                            frequencyDurationMs += durationMs;
                        }
                        final long totalRxDuration = deltaInfo.getReceiveTimeMillis();
                        // Smear HAL provided Rx power duration based on active modem
                        // duration in a given state.  (Add totalActiveTimeMs / 2 before the
                        // integer division with totalActiveTimeMs for rounding.)
                        final long proportionalRxDurationMs =
                                (frequencyDurationMs * totalRxDuration + (totalActiveTimeMs
                                        / 2)) / totalActiveTimeMs;
                        ratStats.incrementRxDuration(freq, proportionalRxDurationMs);
                    }
                }
            }
        } else {
            // Specific data available.
            for (int index = 0; index < infoSize; index++) {
                final int rat = deltaInfo.getSpecificInfoRat(index);
                final int freq = deltaInfo.getSpecificInfoFrequencyRange(index);
                // Map RadioAccessNetworkType to course grain RadioAccessTechnology.
                final int ratBucket = mapRadioAccessNetworkTypeToRadioAccessTechnology(rat);
                final RadioAccessTechnologyBatteryStats ratStats = getRatBatteryStatsLocked(
                        ratBucket);
                final long rxTimeMs = deltaInfo.getReceiveTimeMillis(rat, freq);
                final int[] txTimesMs = deltaInfo.getTransmitTimeMillis(rat, freq);
                ratStats.incrementRxDuration(freq, rxTimeMs);
                final int numTxLvl = txTimesMs.length;
                for (int lvl = 0; lvl < numTxLvl; lvl++) {
                    ratStats.incrementTxDuration(freq, lvl, txTimesMs[lvl]);
                }
            }
        }
        for (int rat = 0; rat < RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) {
            final RadioAccessTechnologyBatteryStats ratStats = mPerRatBatteryStats[rat];
            if (ratStats == null) continue;
            ratStats.setMark(elapsedRealtimeMs);
        }
    }
    /**
     * Add modem tx power to history
     * Device is said to be in high cellular transmit power when it has spent most of the transmit
+338 −23

File changed.

Preview size limit exceeded, changes collapsed.

+2 −2
Original line number Diff line number Diff line
@@ -383,8 +383,6 @@ public final class ModemActivityInfo implements Parcelable {
     * activity.
     */
    public @NonNull ModemActivityInfo getDelta(@NonNull ModemActivityInfo other) {
        int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];

        ActivityStatsTechSpecificInfo[] mDeltaSpecificInfo;
        mDeltaSpecificInfo = new ActivityStatsTechSpecificInfo[other.getSpecificInfoLength()];

@@ -399,6 +397,7 @@ public final class ModemActivityInfo implements Parcelable {
                        if (other.mActivityStatsTechSpecificInfo[i].getFrequencyRange()
                                == mActivityStatsTechSpecificInfo[j].getFrequencyRange()) {
                            int freq = mActivityStatsTechSpecificInfo[j].getFrequencyRange();
                            int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
                            for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
                                txTimeMs[lvl] =
                                        (int) (other.getTransmitDurationMillisAtPowerLevel(
@@ -416,6 +415,7 @@ public final class ModemActivityInfo implements Parcelable {
                                                        - getReceiveTimeMillis(rat, freq)));
                        }
                    } else {
                        int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
                        for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
                            txTimeMs[lvl] =
                                    (int) (other.getTransmitDurationMillisAtPowerLevel(lvl, rat)