diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index c3e23d245de45..2eb7abff6587d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -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) { diff --git a/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java index 73d49380b5247..8eb1ca485881a 100644 --- a/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java +++ b/packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java @@ -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 wifiConfigs, List scanResults, boolean connectedIsEphemeral) { String[] expectedSsids = new String[NUM_NETWORKS];