diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 01ccfeef19c..82133bb98f7 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -43,7 +43,6 @@ import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceCategory; -import android.support.v7.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; import android.view.ContextMenu; @@ -321,7 +320,6 @@ public class WifiSettings extends RestrictedSettingsFragment if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) { mOpenSsid = intent.getStringExtra(EXTRA_START_CONNECT_SSID); - updateAccessPointsDelayed(); } } @@ -354,13 +352,28 @@ public class WifiSettings extends RestrictedSettingsFragment onWifiStateChanged(mWifiManager.getWifiState()); } - private void forceUpdateAPs() { + /** + * Only update the AP list if there are not any APs currently shown. + * + *

Thus forceUpdate will only be called during cold start or when toggling between wifi on + * and off. In other use cases, the previous APs will remain until the next update is received + * from {@link WifiTracker}. + */ + private void conditionallyForceUpdateAPs() { + if (mAccessPointsPreferenceCategory.getPreferenceCount() > 0 + && mAccessPointsPreferenceCategory.getPreference(0) instanceof + AccessPointPreference) { + // Make sure we don't update due to callbacks initiated by sticky broadcasts in + // WifiTracker. + Log.d(TAG, "Did not force update APs due to existing APs displayed"); + getView().removeCallbacks(mUpdateAccessPointsRunnable); + return; + } setProgressBarVisible(true); mWifiTracker.forceUpdate(); if (DEBUG) { Log.d(TAG, "WifiSettings force update APs: " + mWifiTracker.getAccessPoints()); } - getView().removeCallbacks(mUpdateAccessPointsRunnable); updateAccessPointPreferences(); } @@ -654,6 +667,7 @@ public class WifiSettings extends RestrictedSettingsFragment */ @Override public void onAccessPointsChanged() { + Log.d(TAG, "onAccessPointsChanged (WifiTracker) callback initiated"); updateAccessPointsDelayed(); } @@ -679,7 +693,7 @@ public class WifiSettings extends RestrictedSettingsFragment final int wifiState = mWifiManager.getWifiState(); switch (wifiState) { case WifiManager.WIFI_STATE_ENABLED: - forceUpdateAPs(); + conditionallyForceUpdateAPs(); break; case WifiManager.WIFI_STATE_ENABLING: @@ -719,6 +733,9 @@ public class WifiSettings extends RestrictedSettingsFragment } // AccessPoints are sorted by the WifiTracker final List accessPoints = mWifiTracker.getAccessPoints(); + if (DEBUG) { + Log.d(TAG, "updateAccessPoints called for: " + accessPoints); + } boolean hasAvailableAccessPoints = false; mAccessPointsPreferenceCategory.removePreference(mStatusMessagePreference); @@ -1014,6 +1031,7 @@ public class WifiSettings extends RestrictedSettingsFragment @Override public void onAccessPointChanged(final AccessPoint accessPoint) { + Log.d(TAG, "onAccessPointChanged (singular) callback initiated"); View view = getView(); if (view != null) { view.post(new Runnable() { diff --git a/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java b/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java index c1c5199ff5f..3c464a76494 100644 --- a/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java +++ b/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java @@ -15,6 +15,7 @@ */ package com.android.settings.wifi; +import static android.support.test.InstrumentationRegistry.getInstrumentation; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; import static android.support.test.espresso.assertion.ViewAssertions.matches; @@ -22,13 +23,17 @@ import static android.support.test.espresso.matcher.ViewMatchers.Visibility.VISI import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; import static android.support.test.espresso.matcher.ViewMatchers.withText; + import static com.google.common.truth.Truth.assertThat; + import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.startsWith; +import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.content.Intent; @@ -41,12 +46,15 @@ import android.net.wifi.WifiSsid; import android.support.test.InstrumentationRegistry; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; + import com.android.settings.Settings.WifiSettingsActivity; import com.android.settingslib.wifi.AccessPoint; import com.android.settingslib.wifi.WifiTracker; import com.android.settingslib.wifi.WifiTracker.WifiListener; import com.android.settingslib.wifi.WifiTrackerFactory; + import com.google.common.collect.Lists; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -202,4 +210,23 @@ public class WifiSettingsUiTest { onView(withText(CONNECTED)).check(matches(isDisplayed())); } + + @Test + public void resumingAp_shouldNotForceUpdateWhenExistingAPsAreListed() { + setWifiState(WifiManager.WIFI_STATE_ENABLED); + setupConnectedAccessPoint(); + when(mWifiTracker.isConnected()).thenReturn(true); + + launchActivity(); + + onView(withText(CONNECTED)).check(matches(isDisplayed())); + verify(mWifiTracker).forceUpdate(); + + Activity activity = mActivityRule.getActivity(); + activity.finish(); + getInstrumentation().waitForIdleSync(); + + getInstrumentation().callActivityOnStart(activity); + verify(mWifiTracker, atMost(1)).forceUpdate(); + } }