Allow WifiSettings to show old APs on app resume.
If we do not have any recent scan results, show the previous APs from
when the app was last paused, by not triggering a force update.
Accompanying changes are also made in WifiTracker to prevent
onAccessPointsChanged callbacks from being invoked until the tracker
receives a new 'SCAN_RESULTS_AVAILABLE' broadcast (ag/2409026).
Bug: b/38212080
Test: runtest --path
packages/apps/Settings/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java
one minute later.
Change-Id: I4f9b2ec855e057e28235b0253ab42c6b4521bebc
Merged-In: I4f9b2ec855e057e28235b0253ab42c6b4521bebc
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 01ccfee..82133bb 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -43,7 +43,6 @@
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 @@
if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
mOpenSsid = intent.getStringExtra(EXTRA_START_CONNECT_SSID);
- updateAccessPointsDelayed();
}
}
@@ -354,13 +352,28 @@
onWifiStateChanged(mWifiManager.getWifiState());
}
- private void forceUpdateAPs() {
+ /**
+ * Only update the AP list if there are not any APs currently shown.
+ *
+ * <p>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 @@
*/
@Override
public void onAccessPointsChanged() {
+ Log.d(TAG, "onAccessPointsChanged (WifiTracker) callback initiated");
updateAccessPointsDelayed();
}
@@ -679,7 +693,7 @@
final int wifiState = mWifiManager.getWifiState();
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
- forceUpdateAPs();
+ conditionallyForceUpdateAPs();
break;
case WifiManager.WIFI_STATE_ENABLING:
@@ -719,6 +733,9 @@
}
// AccessPoints are sorted by the WifiTracker
final List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
+ if (DEBUG) {
+ Log.d(TAG, "updateAccessPoints called for: " + accessPoints);
+ }
boolean hasAvailableAccessPoints = false;
mAccessPointsPreferenceCategory.removePreference(mStatusMessagePreference);
@@ -1014,6 +1031,7 @@
@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 c1c5199..3c464a7 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.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.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 @@
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();
+ }
}