Merge "Clear AccessPoints in WifiTracker when Wifi is Off." into oc-dr1-dev

am: e644b8cfa3

Change-Id: I003454ea1526b58d5ce52ad18b6a674c0c57dcea
This commit is contained in:
Sundeep Ghuman
2017-06-29 05:59:19 +00:00
committed by android-build-merger
2 changed files with 75 additions and 25 deletions

View File

@@ -91,7 +91,7 @@ public class WifiTracker {
private final boolean mIncludeScans; private final boolean mIncludeScans;
private final boolean mIncludePasspoints; private final boolean mIncludePasspoints;
@VisibleForTesting final MainHandler mMainHandler; @VisibleForTesting final MainHandler mMainHandler;
private final WorkHandler mWorkHandler; @VisibleForTesting final WorkHandler mWorkHandler;
private WifiTrackerNetworkCallback mNetworkCallback; private WifiTrackerNetworkCallback mNetworkCallback;
@@ -653,6 +653,7 @@ public class WifiTracker {
/* sticky broadcasts can call this when wifi is disabled */ /* sticky broadcasts can call this when wifi is disabled */
if (!mWifiManager.isWifiEnabled()) { if (!mWifiManager.isWifiEnabled()) {
mMainHandler.sendEmptyMessage(MainHandler.MSG_PAUSE_SCANNING); mMainHandler.sendEmptyMessage(MainHandler.MSG_PAUSE_SCANNING);
clearAccessPointsAndConditionallyUpdate();
return; return;
} }
@@ -696,6 +697,17 @@ public class WifiTracker {
} }
} }
private void clearAccessPointsAndConditionallyUpdate() {
synchronized (mLock) {
if (!mInternalAccessPoints.isEmpty()) {
mInternalAccessPoints.clear();
if (!mMainHandler.hasMessages(MainHandler.MSG_ACCESS_POINT_CHANGED)) {
mMainHandler.sendEmptyMessage(MainHandler.MSG_ACCESS_POINT_CHANGED);
}
}
}
}
/** /**
* Update all the internal access points rankingScores, badge and metering. * Update all the internal access points rankingScores, badge and metering.
* *
@@ -720,6 +732,9 @@ public class WifiTracker {
private void updateWifiState(int state) { private void updateWifiState(int state) {
mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_WIFI_STATE, state, 0).sendToTarget(); mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_WIFI_STATE, state, 0).sendToTarget();
if (!mWifiManager.isWifiEnabled()) {
clearAccessPointsAndConditionallyUpdate();
}
} }
public static List<AccessPoint> getCurrentAccessPoints(Context context, boolean includeSaved, public static List<AccessPoint> getCurrentAccessPoints(Context context, boolean includeSaved,
@@ -803,8 +818,15 @@ public class WifiTracker {
mListener.onWifiStateChanged(msg.arg1); mListener.onWifiStateChanged(msg.arg1);
break; break;
case MSG_ACCESS_POINT_CHANGED: case MSG_ACCESS_POINT_CHANGED:
copyAndNotifyListeners(true /*notifyListeners*/); // Only notify listeners of changes if we have fresh scan results, otherwise the
mListener.onAccessPointsChanged(); // UI will be updated with stale results. We want to copy the APs regardless,
// for instances where forceUpdate was invoked by the caller.
if (mStaleScanResults) {
copyAndNotifyListeners(false /*notifyListeners*/);
} else {
copyAndNotifyListeners(true /*notifyListeners*/);
mListener.onAccessPointsChanged();
}
break; break;
case MSG_RESUME_SCANNING: case MSG_RESUME_SCANNING:
if (mScanner != null) { if (mScanner != null) {
@@ -828,7 +850,8 @@ public class WifiTracker {
} }
} }
private final class WorkHandler extends Handler { @VisibleForTesting
final class WorkHandler extends Handler {
private static final int MSG_UPDATE_ACCESS_POINTS = 0; private static final int MSG_UPDATE_ACCESS_POINTS = 0;
private static final int MSG_UPDATE_NETWORK_INFO = 1; private static final int MSG_UPDATE_NETWORK_INFO = 1;
private static final int MSG_RESUME = 2; private static final int MSG_RESUME = 2;

View File

@@ -256,6 +256,7 @@ public class WifiTrackerTest {
} }
sendScanResultsAndProcess(tracker); sendScanResultsAndProcess(tracker);
waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
return tracker; return tracker;
} }
@@ -341,6 +342,23 @@ public class WifiTrackerTest {
return createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(intent); return createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(intent);
} }
private void waitForHandlersToProcessCurrentlyEnqueuedMessages(WifiTracker tracker)
throws InterruptedException {
CountDownLatch workerLatch = new CountDownLatch(1);
tracker.mWorkHandler.post(() -> {
workerLatch.countDown();
});
assertTrue("Latch timed out while waiting for WorkerHandler",
workerLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
CountDownLatch mainLatch = new CountDownLatch(1);
tracker.mMainHandler.post(() -> {
mainLatch.countDown();
});
assertTrue("Latch timed out while waiting for MainHandler",
mainLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
}
@Test @Test
public void testAccessPointListenerSetWhenLookingUpUsingScanResults() { public void testAccessPointListenerSetWhenLookingUpUsingScanResults() {
ScanResult scanResult = new ScanResult(); ScanResult scanResult = new ScanResult();
@@ -426,7 +444,7 @@ public class WifiTrackerTest {
@Test @Test
public void startTrackingShouldSetConnectedAccessPointAsActive() throws InterruptedException { public void startTrackingShouldSetConnectedAccessPointAsActive() throws InterruptedException {
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected(); WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
List<AccessPoint> aps = tracker.getAccessPoints(); List<AccessPoint> aps = tracker.getAccessPoints();
@@ -460,16 +478,18 @@ public class WifiTrackerTest {
startTracking(tracker); startTracking(tracker);
sendScanResultsAndProcess(tracker); sendScanResultsAndProcess(tracker);
updateScoresAndWaitForAccessPointsChangedCallback(); updateScoresAndWaitForAccessPointsChangedCallback(tracker);
} }
private void updateScoresAndWaitForAccessPointsChangedCallback() throws InterruptedException { private void updateScoresAndWaitForAccessPointsChangedCallback(WifiTracker tracker)
throws InterruptedException {
// Updating scores can happen together or one after the other, so the latch countdown is set // Updating scores can happen together or one after the other, so the latch countdown is set
// to 2. // to 2.
mAccessPointsChangedLatch = new CountDownLatch(2); mAccessPointsChangedLatch = new CountDownLatch(1);
updateScores(); updateScores();
assertTrue("onAccessPointChanged was not called twice", assertTrue("onAccessPointChanged was not called after updating scores",
mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS)); mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
} }
@Test @Test
@@ -480,7 +500,7 @@ public class WifiTrackerTest {
assertEquals(aps.get(0).getSsidStr(), SSID_1); assertEquals(aps.get(0).getSsidStr(), SSID_1);
assertEquals(aps.get(1).getSsidStr(), SSID_2); assertEquals(aps.get(1).getSsidStr(), SSID_2);
updateScoresAndWaitForAccessPointsChangedCallback(); updateScoresAndWaitForAccessPointsChangedCallback(tracker);
aps = tracker.getAccessPoints(); aps = tracker.getAccessPoints();
assertTrue(aps.size() == 2); assertTrue(aps.size() == 2);
@@ -502,7 +522,7 @@ public class WifiTrackerTest {
assertEquals(aps.get(0).getSsidStr(), SSID_1); assertEquals(aps.get(0).getSsidStr(), SSID_1);
assertEquals(aps.get(1).getSsidStr(), SSID_2); assertEquals(aps.get(1).getSsidStr(), SSID_2);
updateScoresAndWaitForAccessPointsChangedCallback(); updateScoresAndWaitForAccessPointsChangedCallback(tracker);
aps = tracker.getAccessPoints(); aps = tracker.getAccessPoints();
assertTrue(aps.size() == 2); assertTrue(aps.size() == 2);
@@ -514,7 +534,7 @@ public class WifiTrackerTest {
public void scoreCacheUpdateScoresShouldInsertSpeedIntoAccessPoint() public void scoreCacheUpdateScoresShouldInsertSpeedIntoAccessPoint()
throws InterruptedException { throws InterruptedException {
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
updateScoresAndWaitForAccessPointsChangedCallback(); updateScoresAndWaitForAccessPointsChangedCallback(tracker);
List<AccessPoint> aps = tracker.getAccessPoints(); List<AccessPoint> aps = tracker.getAccessPoints();
@@ -531,7 +551,7 @@ public class WifiTrackerTest {
public void scoreCacheUpdateMeteredShouldUpdateAccessPointMetering() public void scoreCacheUpdateMeteredShouldUpdateAccessPointMetering()
throws InterruptedException { throws InterruptedException {
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
updateScoresAndWaitForAccessPointsChangedCallback(); updateScoresAndWaitForAccessPointsChangedCallback(tracker);
List<AccessPoint> aps = tracker.getAccessPoints(); List<AccessPoint> aps = tracker.getAccessPoints();
@@ -553,7 +573,7 @@ public class WifiTrackerTest {
0 /* disabled */); 0 /* disabled */);
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
updateScoresAndWaitForAccessPointsChangedCallback(); updateScoresAndWaitForAccessPointsChangedCallback(tracker);
List<AccessPoint> aps = tracker.getAccessPoints(); List<AccessPoint> aps = tracker.getAccessPoints();
@@ -754,13 +774,10 @@ public class WifiTrackerTest {
throws Exception { throws Exception {
WifiTracker tracker = createMockedWifiTracker(); WifiTracker tracker = createMockedWifiTracker();
startTracking(tracker); startTracking(tracker);
tracker.stopTracking(); waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
CountDownLatch latch1 = new CountDownLatch(1); tracker.stopTracking();
tracker.mMainHandler.post(() -> { waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
latch1.countDown();
});
assertTrue("Latch 1 timed out", latch1.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
startTracking(tracker); startTracking(tracker);
@@ -770,14 +787,24 @@ public class WifiTrackerTest {
tracker.mReceiver.onReceive( tracker.mReceiver.onReceive(
mContext, new Intent(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION)); mContext, new Intent(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION));
CountDownLatch latch2 = new CountDownLatch(1); waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
tracker.mMainHandler.post(() -> {
latch2.countDown();
});
assertTrue("Latch 2 timed out", latch2.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
verify(mockWifiListener, never()).onAccessPointsChanged(); verify(mockWifiListener, never()).onAccessPointsChanged();
sendScanResultsAndProcess(tracker); // verifies onAccessPointsChanged is invoked sendScanResultsAndProcess(tracker); // verifies onAccessPointsChanged is invoked
} }
@Test
public void disablingWifiShouldClearExistingAccessPoints() throws Exception {
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
when(mockWifiManager.isWifiEnabled()).thenReturn(false);
mAccessPointsChangedLatch = new CountDownLatch(1);
tracker.mReceiver.onReceive(mContext, new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION));
mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS);
waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
assertThat(tracker.getAccessPoints()).isEmpty();
}
} }