Merge "Listen to RSSI_CHANGED_ACTION broadcasts in WifiTracker." into oc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
56fcd408e6
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user