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

Commit 7f96ea26 authored by Kai Shi's avatar Kai Shi
Browse files

Report the bandwidth from adjacent signal level

Report the bandwidth from adjacent signal levels if there is no
sufficient data usage with current signal level.

Bug: 187520014
Bug: 196253433
Test: atest FrameworksTelephonyTests:com.android.internal.telephony
Change-Id: I7a1779896defa98d8d4bcd00e020555ea3bf8990
parent a39667b7
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
@@ -691,6 +691,45 @@ public class LinkBandwidthEstimator extends Handler {
            return -1;
        }

        private int getAvgUsedBandwidthAdjacentThreeLevelKbps() {
            String dataRatName = getDataRatName(mDataRat);
            NetworkBandwidth network = lookupNetwork(mPlmn, dataRatName);

            int bandwidthAtLow = getAvgUsedBandwidthAtLevel(network, mSignalLevel - 1);
            int bandwidthAtHigh = getAvgUsedBandwidthAtLevel(network, mSignalLevel + 1);
            if (bandwidthAtLow > 0 && bandwidthAtHigh > 0) {
                return (bandwidthAtLow + bandwidthAtHigh) / 2;
            }

            int count = 0;
            long value = 0;
            for (int i = -1; i <= 1; i++) {
                int currLevel = mSignalLevel + i;
                if (currLevel < 0 || currLevel >= NUM_SIGNAL_LEVEL) {
                    continue;
                }
                count += network.getCount(mLink, currLevel);
                value += network.getValue(mLink, currLevel);
            }

            if (count >= BW_STATS_COUNT_THRESHOLD) {
                return (int) (value / count);
            }
            return -1;
        }

        private int getAvgUsedBandwidthAtLevel(NetworkBandwidth network,
                int signalLevel) {
            if (signalLevel < 0 || signalLevel >= NUM_SIGNAL_LEVEL) {
                return -1;
            }
            int count = network.getCount(mLink, signalLevel);
            if (count >= BW_STATS_COUNT_THRESHOLD) {
                return (int) (network.getValue(mLink, signalLevel) / count);
            }
            return -1;
        }

        private int getCurrentCount() {
            String dataRatName = getDataRatName(mDataRat);
            NetworkBandwidth network = lookupNetwork(mPlmn, dataRatName);
@@ -703,6 +742,10 @@ public class LinkBandwidthEstimator extends Handler {
            if (mAvgUsedKbps > 0) {
                return mAvgUsedKbps;
            }
            mAvgUsedKbps = getAvgUsedBandwidthAdjacentThreeLevelKbps();
            if (mAvgUsedKbps > 0) {
                return mAvgUsedKbps;
            }
            // Fall back to static value
            return mStaticBwKbps;
        }
+29 −3
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest {
        when(mTelephonyFacade.getMobileTxBytes()).thenReturn(0L);
        when(mTelephonyFacade.getMobileTxBytes()).thenReturn(0L);
        when(mPhone.getCurrentCellIdentity()).thenReturn(mCellIdentity);
        // Note that signal level is 0 before 1st MSG_SIGNAL_STRENGTH_CHANGED
        when(mPhone.getSubId()).thenReturn(1);
        when(mSignalStrength.getDbm()).thenReturn(-100);
        when(mSignalStrength.getLevel()).thenReturn(1);
@@ -330,17 +331,43 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest {

        verifyUpdateBandwidth(-1, 19_597);

        addTxBytes(20_000L);
        addRxBytes(50_000L);
        when(mSignalStrength.getLevel()).thenReturn(1);
        when(mSignalStrength.getDbm()).thenReturn(-110);
        mLBE.obtainMessage(MSG_SIGNAL_STRENGTH_CHANGED, mSignalStrength).sendToTarget();
        addElapsedTime(6000);
        moveTimeForward(6000);
        processAllMessages();
        verifyUpdateBandwidth(-1, 19_535);

        when(mSignalStrength.getLevel()).thenReturn(2);
        when(mSignalStrength.getDbm()).thenReturn(-90);
        mLBE.obtainMessage(MSG_SIGNAL_STRENGTH_CHANGED, mSignalStrength).sendToTarget();
        addElapsedTime(6000);
        moveTimeForward(6000);
        processAllMessages();
        verifyUpdateBandwidth(-1, -1);

        for (int i = 0; i < BW_STATS_COUNT_THRESHOLD + 2; i++) {
            addTxBytes(10_000L);
            addRxBytes(1000_000L);
            addElapsedTime(5_100);
            moveTimeForward(5_100);
            processAllMessages();
            mLBE.obtainMessage(MSG_MODEM_ACTIVITY_RETURNED, new ModemActivityInfo(
                    i * 5_100L, 0, 0, TX_TIME_2_MS, i * RX_TIME_2_MS)).sendToTarget();
            processAllMessages();
        }

        when(mSignalStrength.getLevel()).thenReturn(1);
        when(mSignalStrength.getDbm()).thenReturn(-110);
        mLBE.obtainMessage(MSG_SIGNAL_STRENGTH_CHANGED, mSignalStrength).sendToTarget();
        addElapsedTime(6000);
        moveTimeForward(6000);
        processAllMessages();
        verifyUpdateBandwidth(-1, 30_821);
    }


    @Test
    public void testAvgBwForAllPossibleRat() throws Exception {
        Pair<Integer, Integer> values = mLBE.getStaticAvgBw(TelephonyManager.NETWORK_TYPE_GPRS);
@@ -401,7 +428,6 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest {
        addRxBytes(19_000L);
        when(mServiceState.getNrState()).thenReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED);
        when(mServiceState.getNrFrequencyRange()).thenReturn(ServiceState.FREQUENCY_RANGE_MMWAVE);
        when(mSignalStrength.getLevel()).thenReturn(2);
        mLBE.obtainMessage(MSG_NR_FREQUENCY_CHANGED).sendToTarget();
        addElapsedTime(6000);
        moveTimeForward(6000);