From 2b48990b9c111b99b2a786f84e38de306dad48b3 Mon Sep 17 00:00:00 2001 From: Sundeep Ghuman Date: Wed, 22 Feb 2017 18:17:29 -0800 Subject: [PATCH] Process the NetworkInfo before updating AccessPoints. This fixes a UI issue where the Tracker first displays the connected accessPoint as inactive before processing the connected state, which causes the list to jump around. Also add useful debugging information to AccessPoint toString. Bug: 35681450 Test: runtest --path frameworks/base/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java Change-Id: I9a8356cfdd2e5be2da58ce5de82e228fddf301f9 --- .../android/settingslib/wifi/AccessPoint.java | 4 + .../android/settingslib/wifi/WifiTracker.java | 3 +- .../settingslib/wifi/WifiTrackerTest.java | 88 ++++++++++++++----- 3 files changed, 72 insertions(+), 23 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 2dcbf90c74b75..26ca3d4aa5d7f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -265,6 +265,9 @@ public class AccessPoint implements Comparable { public String toString() { StringBuilder builder = new StringBuilder().append("AccessPoint(") .append(ssid); + if (bssid != null) { + builder.append(":").append(bssid); + } if (isSaved()) { builder.append(',').append("saved"); } @@ -280,6 +283,7 @@ public class AccessPoint implements Comparable { if (security != SECURITY_NONE) { builder.append(',').append(securityToString(security, pskType)); } + builder.append(",level=").append(getLevel()); builder.append(",rankingScore=").append(mRankingScore); builder.append(",badge=").append(mBadge); diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index 11bcdcad40cfc..8421c2c9dee3b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -271,7 +271,6 @@ public class WifiTracker { if (mWifiManager.isWifiEnabled()) { mScanner.resume(); } - mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS); } /** @@ -715,9 +714,9 @@ public class WifiTracker { mMainHandler.sendEmptyMessage(MainHandler.MSG_CONNECTED_CHANGED); - mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS); mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO, info) .sendToTarget(); + mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS); } } }; diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java index 2018c13a622d3..e100884869101 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java @@ -15,6 +15,8 @@ */ package com.android.settingslib.wifi; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -28,6 +30,7 @@ import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkBadging; +import android.net.NetworkInfo; import android.net.NetworkKey; import android.net.NetworkScoreManager; import android.net.ScoredNetwork; @@ -35,6 +38,7 @@ import android.net.RssiCurve; import android.net.WifiKey; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiNetworkScoreCache; import android.net.wifi.WifiSsid; @@ -68,6 +72,8 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +// TODO(sghuman): Change these to robolectric tests b/35766684. + @SmallTest @RunWith(AndroidJUnit4.class) public class WifiTrackerTest { @@ -115,9 +121,10 @@ public class WifiTrackerTest { @Before public void setUp() { - mContext = InstrumentationRegistry.getTargetContext(); MockitoAnnotations.initMocks(this); + mContext = InstrumentationRegistry.getTargetContext(); + mWorkerThread = new HandlerThread("TestHandlerWorkerThread"); mWorkerThread.start(); mLooper = mWorkerThread.getLooper(); @@ -221,9 +228,15 @@ public class WifiTrackerTest { SystemClock.elapsedRealtime() * 1000 /* microsecond timestamp */); } - private WifiTracker createTrackerAndInjectInitialScanResults() throws InterruptedException { + private WifiTracker createTrackerWithImmediateBroadcastsAndInjectInitialScanResults( + Intent ... intents) + throws InterruptedException { WifiTracker tracker = createMockedWifiTracker(); + startTracking(tracker); + for (Intent intent : intents) { + tracker.mReceiver.onReceive(mContext, intent); + } mAccessPointsChangedLatch = new CountDownLatch(1); sendScanResultsAndProcess(tracker); @@ -235,16 +248,16 @@ public class WifiTrackerTest { private WifiTracker createMockedWifiTracker() { WifiTracker tracker = new WifiTracker( - mContext, - mockWifiListener, - mLooper, - true, - true, - true, - mockWifiManager, - mockConnectivityManager, - mockNetworkScoreManager, - mMainLooper + mContext, + mockWifiListener, + mLooper, + true, + true, + true, + mockWifiManager, + mockConnectivityManager, + mockNetworkScoreManager, + mMainLooper ); return tracker; @@ -294,6 +307,31 @@ public class WifiTrackerTest { scoreCache.updateScores(Arrays.asList(sc1, sc2)); } + private WifiTracker createTrackerWithScanResultsAndAccessPoint1Connected() + throws InterruptedException { + int networkId = 123; + + WifiInfo wifiInfo = new WifiInfo(); + wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(SSID_1)); + wifiInfo.setBSSID(BSSID_1); + wifiInfo.setNetworkId(networkId); + when(mockWifiManager.getConnectionInfo()).thenReturn(wifiInfo); + + WifiConfiguration configuration = new WifiConfiguration(); + configuration.SSID = SSID_1; + configuration.BSSID = BSSID_1; + configuration.networkId = networkId; + when(mockWifiManager.getConfiguredNetworks()).thenReturn(Arrays.asList(configuration)); + + NetworkInfo networkInfo = new NetworkInfo( + ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype"); + networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "connected", "test"); + + Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION); + intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo); + return createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(intent); + } + @Test public void testAccessPointListenerSetWhenLookingUpUsingScanResults() { ScanResult scanResult = new ScanResult(); @@ -356,13 +394,22 @@ public class WifiTrackerTest { .unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI, scoreCache); } + @Test + public void startTrackingShouldSetConnectedAccessPointAsActive() throws InterruptedException { + WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected(); + + List aps = tracker.getAccessPoints(); + + assertThat(aps).hasSize(2); + assertThat(aps.get(0).isActive()).isTrue(); + } + @Test public void startTrackingShouldRequestScoresForCurrentAccessPoints() throws InterruptedException { // Start the tracker and inject the initial scan results and then stop tracking - WifiTracker tracker = createTrackerAndInjectInitialScanResults(); + WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); tracker.stopTracking(); - android.util.Log.d("WifiTrackerTest", "Clearing previously captured requested keys"); mRequestedKeys.clear(); mRequestScoresLatch = new CountDownLatch(1); @@ -370,7 +417,6 @@ public class WifiTrackerTest { assertTrue("Latch timed out", mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS)); - android.util.Log.d("WifiTrackerTest", "requested keys: " + mRequestedKeys); assertTrue(mRequestedKeys.contains(NETWORK_KEY_1)); assertTrue(mRequestedKeys.contains(NETWORK_KEY_2)); } @@ -394,7 +440,7 @@ public class WifiTrackerTest { @Test public void scoreCacheUpdateScoresShouldChangeSortOrder() throws InterruptedException { - WifiTracker tracker = createTrackerAndInjectInitialScanResults(); + WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); List aps = tracker.getAccessPoints(); assertTrue(aps.size() == 2); assertEquals(aps.get(0).getSsidStr(), SSID_1); @@ -416,7 +462,7 @@ public class WifiTrackerTest { Settings.Global.NETWORK_SCORING_UI_ENABLED, 0 /* disabled */); - WifiTracker tracker = createTrackerAndInjectInitialScanResults(); + WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); List aps = tracker.getAccessPoints(); assertTrue(aps.size() == 2); assertEquals(aps.get(0).getSsidStr(), SSID_1); @@ -432,7 +478,7 @@ public class WifiTrackerTest { @Test public void scoreCacheUpdateScoresShouldInsertBadgeIntoAccessPoint() throws InterruptedException { - WifiTracker tracker = createTrackerAndInjectInitialScanResults(); + WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); updateScoresAndWaitForAccessPointsChangedCallback(); List aps = tracker.getAccessPoints(); @@ -454,7 +500,7 @@ public class WifiTrackerTest { Settings.Global.NETWORK_SCORING_UI_ENABLED, 0 /* disabled */); - WifiTracker tracker = createTrackerAndInjectInitialScanResults(); + WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); updateScoresAndWaitForAccessPointsChangedCallback(); List aps = tracker.getAccessPoints(); @@ -473,7 +519,7 @@ public class WifiTrackerTest { // Scores can be requested together or serially depending on how the scan results are // processed. mRequestScoresLatch = new CountDownLatch(2); - WifiTracker tracker = createTrackerAndInjectInitialScanResults(); + WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS); mRequestedKeys.clear(); @@ -503,7 +549,7 @@ public class WifiTrackerTest { @Test public void scoreCacheAndListenerShouldBeUnregisteredWhenStopTrackingIsCalled() throws Exception { - WifiTracker tracker = createTrackerAndInjectInitialScanResults(); + WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); WifiNetworkScoreCache cache = mScoreCacheCaptor.getValue(); tracker.stopTracking();