Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6572eae9 authored by Jason Monk's avatar Jason Monk
Browse files

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
parent efee230f
Loading
Loading
Loading
Loading
+25 −10
Original line number Diff line number Diff line
@@ -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 (mWifiManager.isWifiEnabled()) {
        if (mScanner == null) {
            mScanner = new Scanner();
        }
        if (mWifiManager.isWifiEnabled()) {
            mScanner.resume();
        }
        updateAccessPoints();
@@ -335,12 +336,18 @@ public class WifiTracker {

    private void updateWifiState(int state) {
        if (state == WifiManager.WIFI_STATE_ENABLED) {
            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;
            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) {
+23 −0
Original line number Diff line number Diff line
@@ -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];