release-request-bfd62fea-ae1d-4d0d-80fd-4ff0d407c488-for-git_oc-release-4102265 snap-temp-L40000000074340189

Change-Id: I8b537e130f6584fbdeec967c6fca35fc02d542c1
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();
+    }
 }