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 Original line Diff line number Diff line
@@ -127,6 +127,7 @@ public class WifiTracker {
    public void pauseScanning() {
    public void pauseScanning() {
        if (mScanner != null) {
        if (mScanner != null) {
            mScanner.pause();
            mScanner.pause();
            mScanner = null;
        }
        }
    }
    }


@@ -134,10 +135,10 @@ public class WifiTracker {
     * Resume scanning for wifi networks after it has been paused.
     * Resume scanning for wifi networks after it has been paused.
     */
     */
    public void resumeScanning() {
    public void resumeScanning() {
        if (mWifiManager.isWifiEnabled()) {
        if (mScanner == null) {
        if (mScanner == null) {
            mScanner = new Scanner();
            mScanner = new Scanner();
        }
        }
        if (mWifiManager.isWifiEnabled()) {
            mScanner.resume();
            mScanner.resume();
        }
        }
        updateAccessPoints();
        updateAccessPoints();
@@ -335,12 +336,18 @@ public class WifiTracker {


    private void updateWifiState(int state) {
    private void updateWifiState(int state) {
        if (state == WifiManager.WIFI_STATE_ENABLED) {
        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();
                mScanner.resume();
            }
        } else {
        } else {
            mLastInfo = null;
            mLastInfo = null;
            mLastNetworkInfo = null;
            mLastNetworkInfo = null;
            if (mScanner != null) {
                mScanner.pause();
                mScanner.pause();
            }
            }
        }
        if (mListener != null) {
        if (mListener != null) {
            mListener.onWifiStateChanged(state);
            mListener.onWifiStateChanged(state);
        }
        }
@@ -382,26 +389,34 @@ public class WifiTracker {


    @VisibleForTesting
    @VisibleForTesting
    class Scanner extends Handler {
    class Scanner extends Handler {
        private static final int MSG_SCAN = 0;

        private int mRetry = 0;
        private int mRetry = 0;


        void resume() {
        void resume() {
            if (!hasMessages(0)) {
            if (!hasMessages(MSG_SCAN)) {
                sendEmptyMessage(0);
                sendEmptyMessage(MSG_SCAN);
            }
            }
        }
        }


        void forceScan() {
        void forceScan() {
            removeMessages(0);
            removeMessages(MSG_SCAN);
            sendEmptyMessage(0);
            sendEmptyMessage(MSG_SCAN);
        }
        }


        void pause() {
        void pause() {
            mRetry = 0;
            mRetry = 0;
            removeMessages(0);
            removeMessages(MSG_SCAN);
        }

        @VisibleForTesting
        boolean isScanning() {
            return hasMessages(MSG_SCAN);
        }
        }


        @Override
        @Override
        public void handleMessage(Message message) {
        public void handleMessage(Message message) {
            if (message.what != MSG_SCAN) return;
            if (mWifiManager.startScan()) {
            if (mWifiManager.startScan()) {
                mRetry = 0;
                mRetry = 0;
            } else if (++mRetry >= 3) {
            } else if (++mRetry >= 3) {
+23 −0
Original line number Original line Diff line number Diff line
@@ -201,6 +201,29 @@ public class WifiTrackerTest extends BaseTest {
        assertTrue("Connected to wifi", accessPoints.get(0).isActive());
        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,
    private String[] generateTestNetworks(List<WifiConfiguration> wifiConfigs,
            List<ScanResult> scanResults, boolean connectedIsEphemeral) {
            List<ScanResult> scanResults, boolean connectedIsEphemeral) {
        String[] expectedSsids = new String[NUM_NETWORKS];
        String[] expectedSsids = new String[NUM_NETWORKS];