summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java11
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java21
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/TestAccessPointBuilder.java31
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;
}