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

Commit f03d6200 authored by Irfan Sheriff's avatar Irfan Sheriff
Browse files

Fix persisting wifi state on setWifiEnabled() call

When somebody makes a quick setWifiEnabled calls in back to back succession,
we were missing setting the last state because we were only doing that
when wifi was in a particular state from a state machine's perspective.

This was done to handle the interaction b/w airplane and wifi and was
done in the wrong way. That part is now moved to the code which detects
airplane mode changes.

In the longer term, I want to move the whole persisting code as part of
wifi state machine which is more aware of the exact states wifi is in.

Bug: 6504534
Change-Id: I452f3f4efdeb84458dcfd280269e09ffa3844f05
parent ae147152
Loading
Loading
Loading
Loading
+35 −22
Original line number Diff line number Diff line
@@ -376,11 +376,7 @@ public class WifiService extends IWifiManager.Stub {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        mAirplaneModeOn.set(isAirplaneModeOn());
                        /* On airplane mode disable, restore wifi state if necessary */
                        if (!mAirplaneModeOn.get() && (testAndClearWifiSavedState() ||
                            mPersistWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE)) {
                                persistWifiState(true);
                        }
                        handleAirplaneModeToggled();
                        updateWifiState();
                    }
                },
@@ -447,7 +443,10 @@ public class WifiService extends IWifiManager.Stub {
        boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();
        Slog.i(TAG, "WifiService starting up with Wi-Fi " +
                (wifiEnabled ? "enabled" : "disabled"));
        setWifiEnabled(wifiEnabled);

        // If we are already disabled (could be due to airplane mode), avoid changing persist
        // state here
        if (wifiEnabled) setWifiEnabled(wifiEnabled);

        mWifiWatchdogStateMachine = WifiWatchdogStateMachine.
               makeWifiWatchdogStateMachine(mContext);
@@ -485,26 +484,43 @@ public class WifiService extends IWifiManager.Stub {
        }
    }

    private void persistWifiState(boolean enabled) {
        final ContentResolver cr = mContext.getContentResolver();
    private void handleWifiToggled(boolean enabled) {
        boolean airplane = mAirplaneModeOn.get() && isAirplaneToggleable();
        if (enabled) {
            if (airplane) {
                mPersistWifiState.set(WIFI_ENABLED_AIRPLANE_OVERRIDE);
                persistWifiState(WIFI_ENABLED_AIRPLANE_OVERRIDE);
            } else {
                mPersistWifiState.set(WIFI_ENABLED);
                persistWifiState(WIFI_ENABLED);
            }
        } else {
            if (airplane) {
                mPersistWifiState.set(WIFI_DISABLED_AIRPLANE_ON);
            } else {
                mPersistWifiState.set(WIFI_DISABLED);
            // When wifi state is disabled, we do not care
            // if airplane mode is on or not. The scenario of
            // wifi being disabled due to airplane mode being turned on
            // is handled handleAirplaneModeToggled()
            persistWifiState(WIFI_DISABLED);
        }
    }

        Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, mPersistWifiState.get());
    private void handleAirplaneModeToggled() {
        if (mAirplaneModeOn.get()) {
            // Wifi disabled due to airplane on
            if (mWifiEnabled) {
                persistWifiState(WIFI_DISABLED_AIRPLANE_ON);
            }
        } else {
            /* On airplane mode disable, restore wifi state if necessary */
            if (testAndClearWifiSavedState() ||
                    mPersistWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE) {
                persistWifiState(WIFI_ENABLED);
            }
        }
    }

    private void persistWifiState(int state) {
        final ContentResolver cr = mContext.getContentResolver();
        mPersistWifiState.set(state);
        Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, state);
    }

    /**
     * see {@link android.net.wifi.WifiManager#pingSupplicant()}
@@ -576,12 +592,9 @@ public class WifiService extends IWifiManager.Stub {
         * only CHANGE_WIFI_STATE is enforced
         */

        /* Avoids overriding of airplane state when wifi is already in the expected state */
        if (enable != mWifiEnabled) {
        long ident = Binder.clearCallingIdentity();
            persistWifiState(enable);
        handleWifiToggled(enable);
        Binder.restoreCallingIdentity(ident);
        }

        if (enable) {
            if (!mIsReceiverRegistered) {