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

Commit 19b74d92 authored by Stephen Chen's avatar Stephen Chen
Browse files

Improve responsiveness of toggling wifi and refactor user restriction logic.

Moved logic for handling wifi state changes into correct listener
method. Changed logic for handling isUiRestricted. This should
streamline toggling flow for WiFi both when Wifi Scanning is on and off,
and in guest mode.

Bug: 36724409
Bug: 36711085
Bug: 36398321

Test: make, test cases in tracking bug
Change-Id: I69fe07369db192c94f81dd678087ac4e8c35197b
parent 82e2239c
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -57,8 +57,7 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
                handleWifiStateChanged(intent.getIntExtra(
                        WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN));
                handleWifiStateChanged(mWifiManager.getWifiState());
            } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
                if (!mConnected.get()) {
                    handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState)
+47 −51
Original line number Diff line number Diff line
@@ -196,7 +196,6 @@ public class WifiSettings extends RestrictedSettingsFragment

        mConnectedAccessPointPreferenceCategory =
                (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_ACCESS_POINTS);

        mAccessPointsPreferenceCategory =
                (PreferenceCategory) findPreference(PREF_KEY_ACCESS_POINTS);
        mAdditionalSettingsPreferenceCategory =
@@ -204,10 +203,6 @@ public class WifiSettings extends RestrictedSettingsFragment
        mConfigureWifiSettingsPreference = findPreference(PREF_KEY_CONFIGURE_WIFI_SETTINGS);
        mSavedNetworksPreference = findPreference(PREF_KEY_SAVED_NETWORKS);

        if (isUiRestricted()) {
            getPreferenceScreen().removePreference(mAdditionalSettingsPreferenceCategory);
        }

        Context prefContext = getPrefContext();
        mAddPreference = new Preference(prefContext);
        mAddPreference.setIcon(R.drawable.ic_menu_add_inset);
@@ -216,6 +211,11 @@ public class WifiSettings extends RestrictedSettingsFragment

        mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager());

        if (isUiRestricted()) {
            getPreferenceScreen().removePreference(mAdditionalSettingsPreferenceCategory);
            addMessagePreference(R.string.wifi_empty_list_user_restricted);
        }

        mBgThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
        mBgThread.start();
    }
@@ -314,7 +314,7 @@ public class WifiSettings extends RestrictedSettingsFragment

        if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
            mOpenSsid = intent.getStringExtra(EXTRA_START_CONNECT_SSID);
            onAccessPointsChanged();
            updateAccessPointsDelayed();
        }
    }

@@ -614,53 +614,75 @@ public class WifiSettings extends RestrictedSettingsFragment
    }

    /**
     * Shows the latest access points available with supplemental information like
     * the strength of network and the security for it.
     * Called to indicate the list of AccessPoints has been updated and
     * getAccessPoints should be called to get the latest information.
     */
    @Override
    public void onAccessPointsChanged() {
        updateAccessPointsDelayed();
    }

    /**
     * Updates access points from {@link WifiManager#getScanResults()}. Adds a delay to have
     * progress bar displayed before starting to modify APs.
     */
    private void updateAccessPointsDelayed() {
        // Safeguard from some delayed event handling
        if (getActivity() == null) return;
        final int wifiState = mWifiManager.getWifiState();
        if (isUiRestricted()) {
            removeConnectedAccessPointPreference();
            mAccessPointsPreferenceCategory.removeAll();
            if (!isUiRestrictedByOnlyAdmin()) {
                if (wifiState == WifiManager.WIFI_AP_STATE_DISABLED) {
                    setOffMessage();
                } else {
                    addMessagePreference(R.string.wifi_empty_list_user_restricted);
        if (getActivity() != null && !isUiRestricted() && mWifiManager.isWifiEnabled()) {
            setProgressBarVisible(true);
            getView().postDelayed(mUpdateAccessPointsRunnable, 300 /* delay milliseconds */);
        }
    }

    /** Called when the state of Wifi has changed. */
    @Override
    public void onWifiStateChanged(int state) {
        if (isUiRestricted()) {
            return;
        }

        final int wifiState = mWifiManager.getWifiState();
        switch (wifiState) {
            case WifiManager.WIFI_STATE_ENABLED:
                setProgressBarVisible(true);
                // Have the progress bar displayed before starting to modify APs
                getView().postDelayed(mUpdateAccessPointsRunnable, 300 /* delay milliseconds */);
                updateAccessPointsDelayed();
                break;

            case WifiManager.WIFI_STATE_ENABLING:
                removeConnectedAccessPointPreference();
                mAccessPointsPreferenceCategory.removeAll();
                addMessagePreference(R.string.wifi_starting);
                setProgressBarVisible(true);
                break;

            case WifiManager.WIFI_STATE_DISABLING:
                removeConnectedAccessPointPreference();
                mAccessPointsPreferenceCategory.removeAll();
                addMessagePreference(R.string.wifi_stopping);
                break;

            case WifiManager.WIFI_STATE_DISABLED:
                setOffMessage();
                setConfigureWifiSettingsVisibility();
                setProgressBarVisible(false);
                break;
        }
    }

    /**
     * Called when the connection state of wifi has changed and isConnected
     * should be called to get the updated state.
     */
    @Override
    public void onConnectedChanged() {
        updateAccessPointsDelayed();
        changeNextButtonState(mWifiTracker.isConnected());
    }


    private void updateAccessPointPreferences() {
        // in case state has changed
        if (!mWifiManager.isWifiEnabled()) {
            return;
        }
        // AccessPoints are sorted by the WifiTracker
        final List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();

@@ -796,10 +818,6 @@ public class WifiSettings extends RestrictedSettingsFragment
    }

    private void setConfigureWifiSettingsVisibility() {
        if (isUiRestricted()) {
            mAdditionalSettingsPreferenceCategory.removeAll();
            return;
        }
        mAdditionalSettingsPreferenceCategory.addPreference(mConfigureWifiSettingsPreference);
        boolean wifiWakeupEnabled = Settings.Global.getInt(
                getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED, 0) == 1;
@@ -824,7 +842,7 @@ public class WifiSettings extends RestrictedSettingsFragment
        // read the system settings directly. Because when the device is in Airplane mode, even if
        // Wi-Fi scanning mode is on, WifiManager.isScanAlwaysAvailable() still returns "off".
        final ContentResolver resolver = getActivity().getContentResolver();
        final boolean wifiScanningMode = !isUiRestricted() && Settings.Global.getInt(
        final boolean wifiScanningMode = Settings.Global.getInt(
                resolver, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1;

        if (!wifiScanningMode) {
@@ -858,30 +876,8 @@ public class WifiSettings extends RestrictedSettingsFragment

    protected void setProgressBarVisible(boolean visible) {
        if (mProgressHeader != null) {
            mProgressHeader.setVisibility(
                    visible && !isUiRestricted() ? View.VISIBLE : View.INVISIBLE);
        }
            mProgressHeader.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
        }

    @Override
    public void onWifiStateChanged(int state) {
        switch (state) {
            case WifiManager.WIFI_STATE_ENABLING:
                addMessagePreference(R.string.wifi_starting);
                setProgressBarVisible(true);
                break;

            case WifiManager.WIFI_STATE_DISABLED:
                setOffMessage();
                setProgressBarVisible(false);
                break;
        }
    }

    @Override
    public void onConnectedChanged() {
        onAccessPointsChanged();
        changeNextButtonState(mWifiTracker.isConnected());
    }

    /**