From 60b814ba434f346779635d8fe1a91296856e474f Mon Sep 17 00:00:00 2001 From: Sundeep Ghuman Date: Mon, 12 Jun 2017 18:16:53 -0700 Subject: [PATCH] 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 --- .../android/settings/wifi/WifiSettings.java | 28 +++++++++++++++---- .../settings/wifi/WifiSettingsUiTest.java | 27 ++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) 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(); + } }