Fix crash in Wifi QS Panel

When open QS wifi panel while wifi was off was causing a crash from
wifi enabling while the WifiTracker was not in a scanning state.
Fix plus a test enclosed.

Bug: 19322090
Change-Id: Id863cdcbf4aa8d50822de3a200355dbaee74b488
This commit is contained in:
Jason Monk
2015-02-05 10:34:20 -05:00
parent efee230fe1
commit 6572eae9d2
2 changed files with 48 additions and 10 deletions

View File

@@ -127,6 +127,7 @@ public class WifiTracker {
public void pauseScanning() {
if (mScanner != null) {
mScanner.pause();
mScanner = null;
}
}
@@ -134,10 +135,10 @@ public class WifiTracker {
* Resume scanning for wifi networks after it has been paused.
*/
public void resumeScanning() {
if (mScanner == null) {
mScanner = new Scanner();
}
if (mWifiManager.isWifiEnabled()) {
if (mScanner == null) {
mScanner = new Scanner();
}
mScanner.resume();
}
updateAccessPoints();
@@ -335,11 +336,17 @@ public class WifiTracker {
private void updateWifiState(int state) {
if (state == WifiManager.WIFI_STATE_ENABLED) {
mScanner.resume();
if (mScanner != null) {
// We only need to resume if mScanner isn't null because
// that means we want to be scanning.
mScanner.resume();
}
} else {
mLastInfo = null;
mLastNetworkInfo = null;
mScanner.pause();
if (mScanner != null) {
mScanner.pause();
}
}
if (mListener != null) {
mListener.onWifiStateChanged(state);
@@ -382,26 +389,34 @@ public class WifiTracker {
@VisibleForTesting
class Scanner extends Handler {
private static final int MSG_SCAN = 0;
private int mRetry = 0;
void resume() {
if (!hasMessages(0)) {
sendEmptyMessage(0);
if (!hasMessages(MSG_SCAN)) {
sendEmptyMessage(MSG_SCAN);
}
}
void forceScan() {
removeMessages(0);
sendEmptyMessage(0);
removeMessages(MSG_SCAN);
sendEmptyMessage(MSG_SCAN);
}
void pause() {
mRetry = 0;
removeMessages(0);
removeMessages(MSG_SCAN);
}
@VisibleForTesting
boolean isScanning() {
return hasMessages(MSG_SCAN);
}
@Override
public void handleMessage(Message message) {
if (message.what != MSG_SCAN) return;
if (mWifiManager.startScan()) {
mRetry = 0;
} else if (++mRetry >= 3) {

View File

@@ -201,6 +201,29 @@ public class WifiTrackerTest extends BaseTest {
assertTrue("Connected to wifi", accessPoints.get(0).isActive());
}
public void testEnableResumeScanning() {
mWifiTracker.mScanner = null;
Intent i = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION);
// Make sure disable/enable cycle works with no scanner (no crashing).
i.putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);
mWifiTracker.mReceiver.onReceive(mContext, i);
i.putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_ENABLED);
mWifiTracker.mReceiver.onReceive(mContext, i);
Mockito.when(mWifiManager.isWifiEnabled()).thenReturn(false);
i.putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);
mWifiTracker.mReceiver.onReceive(mContext, i);
// Now enable scanning while wifi is off, it shouldn't start.
mWifiTracker.resumeScanning();
assertFalse(mWifiTracker.mScanner.isScanning());
// Turn on wifi and make sure scanning starts.
i.putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_ENABLED);
mWifiTracker.mReceiver.onReceive(mContext, i);
assertTrue(mWifiTracker.mScanner.isScanning());
}
private String[] generateTestNetworks(List<WifiConfiguration> wifiConfigs,
List<ScanResult> scanResults, boolean connectedIsEphemeral) {
String[] expectedSsids = new String[NUM_NETWORKS];