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

Commit c71006ed authored by Irfan Sheriff's avatar Irfan Sheriff Committed by The Android Automerger
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 da12b32b
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()}
@@ -578,12 +594,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) {