From b9647ebba07f4c7e1db9ccbbd3acc78323271c9d Mon Sep 17 00:00:00 2001 From: Sundeep Ghuman Date: Wed, 15 Mar 2017 20:09:47 -0700 Subject: [PATCH 1/2] Fix broken AccessPointTests. Bug: None Test: runtest --path frameworks/base/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java Change-Id: I5d5da5e7e0faf1c124816f0dd8ab5f0249e54637 --- .../wifi/TestAccessPointBuilder.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) 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 665c439c3d6d3..73ca1eab2c92a 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 @@ -79,19 +79,16 @@ public class TestAccessPointBuilder { * 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; } From ce78a5f2d33716fde95f12b1e02df953d013e986 Mon Sep 17 00:00:00 2001 From: Sundeep Ghuman Date: Wed, 15 Mar 2017 19:06:14 -0700 Subject: [PATCH 2/2] Average scan results for AccessPoints. This reduces jitter in the WifiTracker and is modeled after a prior broken implementation which attempted to half-life the rssi each time AccessPoint.update(ScanResult) is called. Bug: 34774783 Test: runtest --path frameworks/base/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java Change-Id: Iab3f9914af40f2fd56e8ae7b45dcbd62176c8a67 --- .../android/settingslib/wifi/AccessPoint.java | 11 +++++++--- .../settingslib/wifi/AccessPointTest.java | 21 +++++++++++++++++++ .../wifi/TestAccessPointBuilder.java | 10 +++++++-- 3 files changed, 37 insertions(+), 5 deletions(-) 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) {