summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiScoreReport.java22
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java50
2 files changed, 65 insertions, 7 deletions
diff --git a/service/java/com/android/server/wifi/WifiScoreReport.java b/service/java/com/android/server/wifi/WifiScoreReport.java
index 8bc8bf37a..74ddf99ec 100644
--- a/service/java/com/android/server/wifi/WifiScoreReport.java
+++ b/service/java/com/android/server/wifi/WifiScoreReport.java
@@ -148,8 +148,13 @@ public class WifiScoreReport {
int aggressiveHandover, WifiMetrics wifiMetrics) {
int score;
- updateScoringState(wifiInfo, aggressiveHandover);
- score = calculateScore(wifiInfo, aggressiveHandover);
+ if (aggressiveHandover == 0) {
+ // Use the old method
+ updateScoringState(wifiInfo, aggressiveHandover);
+ score = calculateScore(wifiInfo, aggressiveHandover);
+ } else {
+ score = calculateAlternativeScore(wifiInfo);
+ }
//sanitize boundaries
if (score > NetworkAgent.WIFI_BASE_SCORE) {
@@ -320,4 +325,17 @@ public class WifiScoreReport {
}
return false;
}
+
+ /**
+ * Experimental scorer, used when aggressive handover preference is set
+ */
+ private int calculateAlternativeScore(WifiInfo wifiInfo) {
+ double rssi = wifiInfo.getRssi();
+ double badRssi = wifiInfo.is5GHz() ? mThresholdQualifiedRssi5 : mThresholdQualifiedRssi24;
+
+ double baseScore = 50.0; // The score to beat to be chosen over mobile data
+ double score = (rssi - badRssi) + baseScore;
+ return (int) Math.round(score);
+ }
+
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
index 41f14dd75..1f5927d95 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
@@ -49,6 +49,7 @@ public class WifiScoreReportTest {
WifiScoreReport mWifiScoreReport;
ScanDetailCache mScanDetailCache;
WifiInfo mWifiInfo;
+ int mAggr; // Aggressive handover
@Mock Context mContext;
@Mock NetworkAgent mNetworkAgent;
@Mock Resources mResources;
@@ -106,6 +107,7 @@ public class WifiScoreReportTest {
config.hiddenSSID = false;
mWifiInfo = new WifiInfo();
mWifiInfo.setFrequency(2412);
+ mAggr = 0;
when(mWifiConfigManager.getSavedNetworks()).thenReturn(Arrays.asList(config));
when(mWifiConfigManager.getConfiguredNetwork(anyInt())).thenReturn(config);
mWifiConfiguration = config;
@@ -138,10 +140,9 @@ public class WifiScoreReportTest {
*/
@Test
public void calculateAndReportScoreSucceeds() throws Exception {
- int aggressiveHandover = 0;
mWifiInfo.setRssi(-77);
mWifiScoreReport.calculateAndReportScore(mWifiInfo,
- mNetworkAgent, aggressiveHandover, mWifiMetrics);
+ mNetworkAgent, mAggr, mWifiMetrics);
verify(mNetworkAgent).sendNetworkScore(anyInt());
verify(mWifiMetrics).incrementWifiScoreCount(anyInt());
}
@@ -155,7 +156,7 @@ public class WifiScoreReportTest {
public void networkAgentMayBeNull() throws Exception {
mWifiInfo.setRssi(-33);
mWifiScoreReport.enableVerboseLogging(true);
- mWifiScoreReport.calculateAndReportScore(mWifiInfo, null, 0, mWifiMetrics);
+ mWifiScoreReport.calculateAndReportScore(mWifiInfo, null, mAggr, mWifiMetrics);
verify(mWifiMetrics).incrementWifiScoreCount(anyInt());
}
@@ -174,7 +175,7 @@ public class WifiScoreReportTest {
mWifiInfo.txSuccessRate = 5.1; // proportional to pps
mWifiInfo.rxSuccessRate = 5.1;
for (int i = 0; i < 10; i++) {
- mWifiScoreReport.calculateAndReportScore(mWifiInfo, mNetworkAgent, 0, mWifiMetrics);
+ mWifiScoreReport.calculateAndReportScore(mWifiInfo, mNetworkAgent, mAggr, mWifiMetrics);
}
int score = mWifiInfo.score;
assertTrue(score > CELLULAR_THRESHOLD_SCORE);
@@ -197,10 +198,49 @@ public class WifiScoreReportTest {
mWifiInfo.txSuccessRate = 0.1;
mWifiInfo.rxSuccessRate = 0.1;
for (int i = 0; i < 10; i++) {
- mWifiScoreReport.calculateAndReportScore(mWifiInfo, mNetworkAgent, 0, mWifiMetrics);
+ mWifiScoreReport.calculateAndReportScore(mWifiInfo, mNetworkAgent, mAggr, mWifiMetrics);
}
int score = mWifiInfo.score;
assertTrue(score < CELLULAR_THRESHOLD_SCORE);
verify(mNetworkAgent, atLeast(1)).sendNetworkScore(score);
}
+
+ /**
+ * Test reporting with aggressive handover
+ */
+ @Test
+ public void calculateAndReportScoreSucceedsAggressively() throws Exception {
+ mAggr = 1;
+ mWifiInfo.setRssi(-77);
+ mWifiScoreReport.calculateAndReportScore(mWifiInfo, mNetworkAgent, mAggr, mWifiMetrics);
+ verify(mNetworkAgent).sendNetworkScore(anyInt());
+ verify(mWifiMetrics).incrementWifiScoreCount(anyInt());
+ }
+
+ /**
+ * Test low rssi with aggressive handover
+ */
+ @Test
+ public void giveUpOnBadRssiAggressively() throws Exception {
+ mAggr = 1;
+ mWifiInfo.setRssi(-83);
+ mWifiScoreReport.calculateAndReportScore(mWifiInfo, mNetworkAgent, mAggr, mWifiMetrics);
+ int score = mWifiInfo.score;
+ verify(mNetworkAgent, atLeast(1)).sendNetworkScore(score);
+ assertTrue(score < CELLULAR_THRESHOLD_SCORE);
+ }
+
+ /**
+ * Test high rssi with aggressive handover
+ */
+ @Test
+ public void allowGoodRssiAggressively() throws Exception {
+ mAggr = 1;
+ mWifiInfo.setRssi(-65);
+ mWifiScoreReport.calculateAndReportScore(mWifiInfo, mNetworkAgent, mAggr, mWifiMetrics);
+ int score = mWifiInfo.score;
+ verify(mNetworkAgent, atLeast(1)).sendNetworkScore(score);
+ assertTrue(score > CELLULAR_THRESHOLD_SCORE);
+ }
+
}