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
This commit is contained in:
Sundeep Ghuman
2017-02-22 18:17:29 -08:00
parent c182cde24f
commit 2b48990b9c
3 changed files with 72 additions and 23 deletions

View File

@@ -265,6 +265,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
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<AccessPoint> {
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);

View File

@@ -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);
}
}
};

View File

@@ -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<AccessPoint> 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<AccessPoint> 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<AccessPoint> 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<AccessPoint> 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<AccessPoint> 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();