diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 48f3e2a855f3c..fed48b441b1ce 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 { * *

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}. * *

Old scan results will be evicted from the cache when this method is invoked. */ @@ -413,7 +414,11 @@ public class AccessPoint implements Comparable { } } - 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 e8a58c13baf0d..b9b4ef31634a7 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 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 73ca1eab2c92a..81bd723c3fe57 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,9 +73,15 @@ 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. + * + *

Side effect: if this AccessPoint was previously unreachable, * setting the level will also make it reachable. */ public TestAccessPointBuilder setLevel(int level) {