Merge "Listen to RSSI_CHANGED_ACTION broadcasts in WifiTracker." into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-13 17:08:00 +00:00
committed by Android (Google) Code Review
3 changed files with 72 additions and 28 deletions

View File

@@ -985,25 +985,32 @@ public class AccessPoint implements Comparable<AccessPoint> {
return false; return false;
} }
/** Attempt to update the AccessPoint and return true if an update occurred. */
public boolean update(WifiConfiguration config, WifiInfo info, NetworkInfo networkInfo) { public boolean update(WifiConfiguration config, WifiInfo info, NetworkInfo networkInfo) {
boolean reorder = false; boolean updated = false;
final int oldLevel = getLevel();
if (info != null && isInfoForThisAccessPoint(config, info)) { if (info != null && isInfoForThisAccessPoint(config, info)) {
reorder = (mInfo == null); updated = (mInfo == null);
mRssi = info.getRssi(); if (mRssi != info.getRssi()) {
mInfo = info; mRssi = info.getRssi();
mNetworkInfo = networkInfo; updated = true;
if (mAccessPointListener != null) {
mAccessPointListener.onAccessPointChanged(this);
} }
mInfo = info;
// TODO(b/37289220): compare NetworkInfo states and set updated = true if necessary
mNetworkInfo = networkInfo;
} else if (mInfo != null) { } else if (mInfo != null) {
reorder = true; updated = true;
mInfo = null; mInfo = null;
mNetworkInfo = null; mNetworkInfo = null;
if (mAccessPointListener != null) { }
mAccessPointListener.onAccessPointChanged(this); if (updated && mAccessPointListener != null) {
mAccessPointListener.onAccessPointChanged(this);
if (oldLevel != getLevel() /* current level */) {
mAccessPointListener.onLevelChanged(this);
} }
} }
return reorder; return updated;
} }
void update(WifiConfiguration config) { void update(WifiConfiguration config) {

View File

@@ -203,6 +203,7 @@ public class WifiTracker {
mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
mNetworkRequest = new NetworkRequest.Builder() mNetworkRequest = new NetworkRequest.Builder()
.clearCapabilities() .clearCapabilities()
@@ -640,20 +641,24 @@ public class WifiTracker {
(System.currentTimeMillis() - before) + "ms."); (System.currentTimeMillis() - before) + "ms.");
} }
boolean reorder = false; boolean updated = false;
boolean reorder = false; // Only reorder if connected AP was changed
for (int i = mInternalAccessPoints.size() - 1; i >= 0; --i) { for (int i = mInternalAccessPoints.size() - 1; i >= 0; --i) {
AccessPoint ap = mInternalAccessPoints.get(i); AccessPoint ap = mInternalAccessPoints.get(i);
boolean previouslyConnected = ap.isActive();
if (ap.update(connectionConfig, mLastInfo, mLastNetworkInfo)) { if (ap.update(connectionConfig, mLastInfo, mLastNetworkInfo)) {
reorder = true; updated = true;
if (previouslyConnected != ap.isActive()) reorder = true;
} }
if (ap.update(mScoreCache, mNetworkScoringUiEnabled)) { if (ap.update(mScoreCache, mNetworkScoringUiEnabled)) {
reorder = true; reorder = true;
updated = true;
} }
} }
if (reorder) {
Collections.sort(mInternalAccessPoints); if (reorder) Collections.sort(mInternalAccessPoints);
mMainHandler.scheduleAPCopyingAndCloseWriteLock();
} if (updated) mMainHandler.scheduleAPCopyingAndCloseWriteLock();
} }
/** /**
@@ -718,6 +723,8 @@ public class WifiTracker {
mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO, info) mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO, info)
.sendToTarget(); .sendToTarget();
mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS); mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
} else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO);
} }
} }
}; };

View File

@@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.doThrow;
@@ -100,6 +101,16 @@ public class WifiTrackerTest {
private static final byte SCORE_2 = 15; private static final byte SCORE_2 = 15;
private static final int BADGE_2 = NetworkBadging.BADGING_HD; private static final int BADGE_2 = NetworkBadging.BADGING_HD;
private static final int CONNECTED_NETWORK_ID = 123;
private static final int CONNECTED_RSSI = -50;
private static final WifiInfo CONNECTED_AP_1_INFO = new WifiInfo();
static {
CONNECTED_AP_1_INFO.setSSID(WifiSsid.createFromAsciiEncoded(SSID_1));
CONNECTED_AP_1_INFO.setBSSID(BSSID_1);
CONNECTED_AP_1_INFO.setNetworkId(CONNECTED_NETWORK_ID);
CONNECTED_AP_1_INFO.setRssi(CONNECTED_RSSI);
}
@Captor ArgumentCaptor<WifiNetworkScoreCache> mScoreCacheCaptor; @Captor ArgumentCaptor<WifiNetworkScoreCache> mScoreCacheCaptor;
@Mock private ConnectivityManager mockConnectivityManager; @Mock private ConnectivityManager mockConnectivityManager;
@Mock private NetworkScoreManager mockNetworkScoreManager; @Mock private NetworkScoreManager mockNetworkScoreManager;
@@ -312,18 +323,12 @@ public class WifiTrackerTest {
private WifiTracker createTrackerWithScanResultsAndAccessPoint1Connected() private WifiTracker createTrackerWithScanResultsAndAccessPoint1Connected()
throws InterruptedException { throws InterruptedException {
int networkId = 123; when(mockWifiManager.getConnectionInfo()).thenReturn(CONNECTED_AP_1_INFO);
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(); WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = SSID_1; configuration.SSID = SSID_1;
configuration.BSSID = BSSID_1; configuration.BSSID = BSSID_1;
configuration.networkId = networkId; configuration.networkId = CONNECTED_NETWORK_ID;
when(mockWifiManager.getConfiguredNetworks()).thenReturn(Arrays.asList(configuration)); when(mockWifiManager.getConfiguredNetworks()).thenReturn(Arrays.asList(configuration));
NetworkInfo networkInfo = new NetworkInfo( NetworkInfo networkInfo = new NetworkInfo(
@@ -445,7 +450,8 @@ public class WifiTrackerTest {
} }
@Test @Test
public void scoreCacheUpdateScoresShouldTriggerOnAccessPointsChanged() throws InterruptedException { public void scoreCacheUpdateScoresShouldTriggerOnAccessPointsChanged()
throws InterruptedException {
WifiTracker tracker = createMockedWifiTracker(); WifiTracker tracker = createMockedWifiTracker();
startTracking(tracker); startTracking(tracker);
sendScanResultsAndProcess(tracker); sendScanResultsAndProcess(tracker);
@@ -463,7 +469,7 @@ public class WifiTrackerTest {
@Test @Test
public void scoreCacheUpdateScoresShouldChangeSortOrder() throws InterruptedException { public void scoreCacheUpdateScoresShouldChangeSortOrder() throws InterruptedException {
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(); WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
List<AccessPoint> aps = tracker.getAccessPoints(); List<AccessPoint> aps = tracker.getAccessPoints();
assertTrue(aps.size() == 2); assertTrue(aps.size() == 2);
assertEquals(aps.get(0).getSsidStr(), SSID_1); assertEquals(aps.get(0).getSsidStr(), SSID_1);
@@ -636,4 +642,28 @@ public class WifiTrackerTest {
tracker.forceUpdate(); tracker.forceUpdate();
verify(mockWifiManager).getMatchingWifiConfig(any(ScanResult.class)); verify(mockWifiManager).getMatchingWifiConfig(any(ScanResult.class));
} }
@Test
public void rssiChangeBroadcastShouldUpdateConnectedAp() throws Exception {
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
assertThat(tracker.getAccessPoints().get(0).isActive()).isTrue();
WifiConfiguration configuration = new WifiConfiguration();
configuration.SSID = SSID_1;
configuration.BSSID = BSSID_1;
configuration.networkId = CONNECTED_NETWORK_ID;
when(mockWifiManager.getConfiguredNetworks()).thenReturn(Arrays.asList(configuration));
int newRssi = CONNECTED_RSSI + 10;
WifiInfo info = new WifiInfo(CONNECTED_AP_1_INFO);
info.setRssi(newRssi);
when(mockWifiManager.getConnectionInfo()).thenReturn(info);
mAccessPointsChangedLatch = new CountDownLatch(1);
tracker.mReceiver.onReceive(mContext, new Intent(WifiManager.RSSI_CHANGED_ACTION));
assertTrue(mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
verify(mockWifiManager, atLeast(2)).getConnectionInfo();
assertThat(tracker.getAccessPoints().get(0).getRssi()).isEqualTo(newRssi);
}
} }