diff options
3 files changed, 46 insertions, 17 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 48f3e2a855f3..fed48b441b1c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -394,8 +394,9 @@ public class AccessPoint implements Comparable<AccessPoint> { * * <p>If the given connection is active, the existing value of {@link #mRssi} will be returned. * If the given AccessPoint is not active, a value will be calculated from previous scan - * results, returning the best RSSI for all matching AccessPoints. If the access point is not - * connected and there are no scan results, the rssi will be set to {@link #UNREACHABLE_RSSI}. + * results, returning the best RSSI for all matching AccessPoints averaged with the previous + * value. If the access point is not connected and there are no scan results, the rssi will be + * set to {@link #UNREACHABLE_RSSI}. * * <p>Old scan results will be evicted from the cache when this method is invoked. */ @@ -413,7 +414,11 @@ public class AccessPoint implements Comparable<AccessPoint> { } } - mRssi = rssi; + if (rssi != UNREACHABLE_RSSI && mRssi != UNREACHABLE_RSSI) { + mRssi = (mRssi + rssi) / 2; // half-life previous value + } else { + mRssi = rssi; + } } /** diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java index e8a58c13baf0..b9b4ef31634a 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java @@ -195,6 +195,26 @@ public class AccessPointTest { assertThat(ap.getRssi()).isEqualTo(newRssi); } + @Test + public void testUpdateWithScanResultShouldAverageRssi() { + String ssid = "ssid"; + int originalRssi = -65; + int newRssi = -80; + int expectedRssi = (originalRssi + newRssi) / 2; + AccessPoint ap = + new TestAccessPointBuilder(mContext).setSsid(ssid).setRssi(originalRssi).build(); + + ScanResult scanResult = new ScanResult(); + scanResult.SSID = ssid; + scanResult.level = newRssi; + scanResult.BSSID = "bssid"; + scanResult.timestamp = SystemClock.elapsedRealtime() * 1000; + scanResult.capabilities = ""; + assertThat(ap.update(scanResult)).isTrue(); + + assertThat(ap.getRssi()).isEqualTo(expectedRssi); + } + private AccessPoint createAccessPointWithScanResultCache() { Bundle bundle = new Bundle(); ArrayList<ScanResult> scanResults = new ArrayList<>(); @@ -203,6 +223,7 @@ public class AccessPointTest { scanResult.level = i; scanResult.BSSID = "bssid-" + i; scanResult.timestamp = SystemClock.elapsedRealtime() * 1000; + scanResult.capabilities = ""; scanResults.add(scanResult); } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java index 665c439c3d6d..81bd723c3fe5 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java @@ -73,25 +73,28 @@ public class TestAccessPointBuilder { return this; } + public TestAccessPointBuilder setRssi(int rssi) { + mRssi = rssi; + return this; + } + /** - * Set the signal level. - * Side effect: if this AccessPoint was previously unreachable, + * Set the rssi based upon the desired signal level. + * + * <p>Side effect: if this AccessPoint was previously unreachable, * setting the level will also make it reachable. */ public TestAccessPointBuilder setLevel(int level) { - int outputRange = AccessPoint.SIGNAL_LEVELS - 1; - - if (level > outputRange) { - level = outputRange; - } else if (level < 0) { - level = 0; + // Reversal of WifiManager.calculateSignalLevels + if (level == 0) { + mRssi = MIN_RSSI; + } else if (level >= AccessPoint.SIGNAL_LEVELS) { + mRssi = MAX_RSSI; + } else { + float inputRange = MAX_RSSI - MIN_RSSI; + float outputRange = AccessPoint.SIGNAL_LEVELS - 1; + mRssi = (int) (level * inputRange / outputRange + MIN_RSSI); } - - int inputRange = MAX_RSSI - MIN_RSSI; - - // calculate the rssi required to get the level we want. - // this is a rearrangement of the formula from WifiManager.calculateSignalLevel() - mRssi = (int)((float)(level * inputRange) / (float)outputRange) + MIN_RSSI; return this; } |