From 19b74d92139ee4cd47afe07685bcceddec190d13 Mon Sep 17 00:00:00 2001 From: Stephen Chen Date: Fri, 31 Mar 2017 14:42:20 -0700 Subject: [PATCH] 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 --- .../android/settings/wifi/WifiEnabler.java | 3 +- .../android/settings/wifi/WifiSettings.java | 98 +++++++++---------- 2 files changed, 48 insertions(+), 53 deletions(-) diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java index e0e6a1acc38..abab154f249 100644 --- a/src/com/android/settings/wifi/WifiEnabler.java +++ b/src/com/android/settings/wifi/WifiEnabler.java @@ -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) diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 20f723c269d..8784d0954cc 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -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 (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()) { - removeConnectedAccessPointPreference(); - mAccessPointsPreferenceCategory.removeAll(); - if (!isUiRestrictedByOnlyAdmin()) { - if (wifiState == WifiManager.WIFI_AP_STATE_DISABLED) { - setOffMessage(); - } else { - addMessagePreference(R.string.wifi_empty_list_user_restricted); - } - } 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 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,32 +876,10 @@ 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()); - } - /** * Renames/replaces "Next" button when appropriate. "Next" button usually exists in * Wifi setup screens, not in usual wifi settings screen.