Loading src/java/com/android/internal/telephony/dataconnection/LinkBandwidthEstimator.java +43 −0 Original line number Diff line number Diff line Loading @@ -693,6 +693,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); Loading @@ -705,6 +744,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; } Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/LinkBandwidthEstimatorTest.java +29 −3 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading
src/java/com/android/internal/telephony/dataconnection/LinkBandwidthEstimator.java +43 −0 Original line number Diff line number Diff line Loading @@ -693,6 +693,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); Loading @@ -705,6 +744,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; } Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/LinkBandwidthEstimatorTest.java +29 −3 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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); Loading