Fix startup jank in the Wifi Picker.

Synchronously fetch the latest APs during onResume and show these before
displaying the other wifi preferences. This fixes a visibile shuffling
issue. Additional Setting preferences are now programatically added
during onStart and hidden during onStop in order to avoid the animation
delay which causes a shuffling effect.

Bug: b/36406983
Test: Visual inspection. Animation jank is difficult to programatically
test.

Change-Id: I34b2d737a8e72e1dc296c170f753975fafce7a3e
This commit is contained in:
Sundeep Ghuman
2017-04-13 16:11:18 -07:00
parent a0e617f96d
commit 60c1d4ec64

View File

@@ -90,6 +90,7 @@ public class WifiSettings extends RestrictedSettingsFragment
WifiDialog.WifiDialogListener { WifiDialog.WifiDialogListener {
private static final String TAG = "WifiSettings"; private static final String TAG = "WifiSettings";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
/* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST; /* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST;
private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1; private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
@@ -203,6 +204,9 @@ public class WifiSettings extends RestrictedSettingsFragment
mConfigureWifiSettingsPreference = findPreference(PREF_KEY_CONFIGURE_WIFI_SETTINGS); mConfigureWifiSettingsPreference = findPreference(PREF_KEY_CONFIGURE_WIFI_SETTINGS);
mSavedNetworksPreference = findPreference(PREF_KEY_SAVED_NETWORKS); mSavedNetworksPreference = findPreference(PREF_KEY_SAVED_NETWORKS);
// Hide additional settings until access points are shown during onStart
showAdditionalSettings(false);
Context prefContext = getPrefContext(); Context prefContext = getPrefContext();
mAddPreference = new Preference(prefContext); mAddPreference = new Preference(prefContext);
mAddPreference.setIcon(R.drawable.ic_menu_add_inset); mAddPreference.setIcon(R.drawable.ic_menu_add_inset);
@@ -220,6 +224,17 @@ public class WifiSettings extends RestrictedSettingsFragment
mBgThread.start(); mBgThread.start();
} }
// TODO(b/37429702): Figure out how to temporarily disable animations during startup and remove
// this method.
private void showAdditionalSettings(boolean visible) {
mAdditionalSettingsPreferenceCategory.setVisible(visible);
mAdditionalSettingsPreferenceCategory.removeAll();
if (visible) {
mAdditionalSettingsPreferenceCategory.addPreference(mConfigureWifiSettingsPreference);
mAdditionalSettingsPreferenceCategory.addPreference(mSavedNetworksPreference);
}
}
@Override @Override
public void onDestroy() { public void onDestroy() {
mBgThread.quit(); mBgThread.quit();
@@ -335,6 +350,17 @@ public class WifiSettings extends RestrictedSettingsFragment
mWifiEnabler = createWifiEnabler(); mWifiEnabler = createWifiEnabler();
mWifiTracker.startTracking(); mWifiTracker.startTracking();
if (!isUiRestricted() && mWifiManager.isWifiEnabled()) {
setProgressBarVisible(true);
mWifiTracker.forceUpdate();
if (DEBUG) Log.d(TAG, "WifiSettings onStart APs: " + mWifiTracker.getAccessPoints());
getView().removeCallbacks(mUpdateAccessPointsRunnable);
updateAccessPointPreferences();
}
showAdditionalSettings(true);
} }
/** /**
@@ -353,8 +379,6 @@ public class WifiSettings extends RestrictedSettingsFragment
if (mWifiEnabler != null) { if (mWifiEnabler != null) {
mWifiEnabler.resume(activity); mWifiEnabler.resume(activity);
} }
activity.invalidateOptionsMenu();
} }
@Override @Override
@@ -370,6 +394,7 @@ public class WifiSettings extends RestrictedSettingsFragment
mWifiTracker.stopTracking(); mWifiTracker.stopTracking();
getView().removeCallbacks(mUpdateAccessPointsRunnable); getView().removeCallbacks(mUpdateAccessPointsRunnable);
getView().removeCallbacks(mHideProgressBarRunnable); getView().removeCallbacks(mHideProgressBarRunnable);
showAdditionalSettings(false);
super.onStop(); super.onStop();
} }
@@ -733,7 +758,7 @@ public class WifiSettings extends RestrictedSettingsFragment
removeCachedPrefs(mAccessPointsPreferenceCategory); removeCachedPrefs(mAccessPointsPreferenceCategory);
mAddPreference.setOrder(index); mAddPreference.setOrder(index);
mAccessPointsPreferenceCategory.addPreference(mAddPreference); mAccessPointsPreferenceCategory.addPreference(mAddPreference);
setConfigureWifiSettingsVisibility(); setAdditionalSettingsSummaries();
if (!hasAvailableAccessPoints) { if (!hasAvailableAccessPoints) {
setProgressBarVisible(true); setProgressBarVisible(true);
@@ -812,8 +837,8 @@ public class WifiSettings extends RestrictedSettingsFragment
// in the Wifi Network Details Fragment // in the Wifi Network Details Fragment
pref.getAccessPoint().saveWifiState(pref.getExtras()); pref.getAccessPoint().saveWifiState(pref.getExtras());
pref.setFragment(WifiNetworkDetailsFragment.class.getName()); pref.setFragment(WifiNetworkDetailsFragment.class.getName());
pref.refresh(); pref.refresh();
mConnectedAccessPointPreferenceCategory.addPreference(pref); mConnectedAccessPointPreferenceCategory.addPreference(pref);
mConnectedAccessPointPreferenceCategory.setVisible(true); mConnectedAccessPointPreferenceCategory.setVisible(true);
} }
@@ -824,7 +849,7 @@ public class WifiSettings extends RestrictedSettingsFragment
mConnectedAccessPointPreferenceCategory.setVisible(false); mConnectedAccessPointPreferenceCategory.setVisible(false);
} }
private void setConfigureWifiSettingsVisibility() { private void setAdditionalSettingsSummaries() {
mAdditionalSettingsPreferenceCategory.addPreference(mConfigureWifiSettingsPreference); mAdditionalSettingsPreferenceCategory.addPreference(mConfigureWifiSettingsPreference);
boolean wifiWakeupEnabled = Settings.Global.getInt( boolean wifiWakeupEnabled = Settings.Global.getInt(
getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED, 0) == 1; getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED, 0) == 1;