In Android Lollipop 5.0, I noticed that "Developer Options" features a checkbox for "Aggressive Wi-Fi to Cellular handover" that is unchecked by default. Does anybody know what this setting does and why it's disabled by default and hidden under developer options?
The code for shouldSwitchNetwork()
best explains what it does. It just artificially reduces the WiFi RSSI (received signal strength indication) to encourage the WiFi state machine to decide to switch the connection from WiFi to cellular network. Around line 3559 of WifiStateMachine.java (line 4262 for Android 6.0.1_r10):
int rssi = mWifiInfo.getRssi() - 6 * mAggressiveHandover
+ (homeNetworkBoost ? WifiConfiguration.HOME_NETWORK_RSSI_BOOST : 0);
The variable mAggressiveHandover
is an int
that is set to 0 or 1 by the Developer Settings:
private void writeWifiAggressiveHandoverOptions() {
mWifiManager.enableAggressiveHandover(mWifiAggressiveHandover.isChecked() ? 1 : 0);
}
The rssi
variable goes on to influence how the connection is classified: isBadRSSI
, isLowRSSI
, or isHighRSSI
.
As to why it's hidden under the developer options, I'd say that is because it seems a little hackish, with a seemingly arbitrary scalar (6) that some dev came up with to nudge the behavior in the desired direction. Google is probably uncertain about the consequences of this setting and the optimal way to adjust rssi
. If I'm wrong and this is somehow meaningful, I'm happy to admit it and explain here why.
Turning this setting off does NOT turn off cellular handover altogether. The WiFi connection still gets a score and is disabled if the score is too low. But hey, the initial score is set arbitrarily too.