Ensure BSSIDs are correctly aged out in settings view

When verbose logging is on, recent BSSIDs are displayed under the
network. This ensures that the BSSIDs are aged out after a period of
time instead of based on a fixed size LRU cache. This prevents BSSIDs
that are no longer present from appearing in the results.

FIXED=30711015
TEST=setup two APs, observe both BSSIDs in settings, turn off one,
     observe it disappearing after a short period of time.

Change-Id: Id2b2ccd0899eae8d4e2e1c2b3ae9409136a8c948
(cherry picked from commit b744d6e865)
This commit is contained in:
Mitchell Wills
2016-08-10 13:49:21 -07:00
parent 4503dc6fba
commit 18af49395c

View File

@@ -36,6 +36,7 @@ import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.support.annotation.NonNull;
import android.text.Spannable;
@@ -43,12 +44,13 @@ import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.TtsSpan;
import android.util.Log;
import android.util.LruCache;
import com.android.settingslib.R;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class AccessPoint implements Comparable<AccessPoint> {
@@ -81,7 +83,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
* For now this data is used only with Verbose Logging so as to show the band and number
* of BSSIDs on which that network is seen.
*/
public LruCache<String, ScanResult> mScanResultCache = new LruCache<String, ScanResult>(32);
private final ConcurrentHashMap<String, ScanResult> mScanResultCache =
new ConcurrentHashMap<String, ScanResult>(32);
private static final long MAX_SCAN_RESULT_AGE_MS = 15000;
private static final String KEY_NETWORKINFO = "key_networkinfo";
private static final String KEY_WIFIINFO = "key_wifiinfo";
@@ -149,7 +153,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
if (savedState.containsKey(KEY_SCANRESULTCACHE)) {
ArrayList<ScanResult> scanResultArrayList =
savedState.getParcelableArrayList(KEY_SCANRESULTCACHE);
mScanResultCache.evictAll();
mScanResultCache.clear();
for (ScanResult result : scanResultArrayList) {
mScanResultCache.put(result.BSSID, result);
}
@@ -233,6 +237,17 @@ public class AccessPoint implements Comparable<AccessPoint> {
return builder.append(')').toString();
}
private void evictOldScanResults() {
long nowMs = SystemClock.elapsedRealtime();
for (Iterator<ScanResult> iter = mScanResultCache.values().iterator(); iter.hasNext(); ) {
ScanResult result = iter.next();
// result timestamp is in microseconds
if (nowMs - result.timestamp / 1000 > MAX_SCAN_RESULT_AGE_MS) {
iter.remove();
}
}
}
public boolean matches(ScanResult result) {
return ssid.equals(result.SSID) && security == getSecurity(result);
}
@@ -268,8 +283,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
public int getRssi() {
evictOldScanResults();
int rssi = Integer.MIN_VALUE;
for (ScanResult result : mScanResultCache.snapshot().values()) {
for (ScanResult result : mScanResultCache.values()) {
if (result.level > rssi) {
rssi = result.level;
}
@@ -279,8 +295,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
public long getSeen() {
evictOldScanResults();
long seen = 0;
for (ScanResult result : mScanResultCache.snapshot().values()) {
for (ScanResult result : mScanResultCache.values()) {
if (result.timestamp > seen) {
seen = result.timestamp;
}
@@ -505,9 +522,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
int numBlackListed = 0;
int n24 = 0; // Number scan results we included in the string
int n5 = 0; // Number scan results we included in the string
Map<String, ScanResult> list = mScanResultCache.snapshot();
evictOldScanResults();
// TODO: sort list by RSSI or age
for (ScanResult result : list.values()) {
for (ScanResult result : mScanResultCache.values()) {
if (result.frequency >= LOWER_FREQ_5GHZ
&& result.frequency <= HIGHER_FREQ_5GHZ) {
@@ -684,8 +701,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
savedState.putInt(KEY_PSKTYPE, pskType);
if (mConfig != null) savedState.putParcelable(KEY_CONFIG, mConfig);
savedState.putParcelable(KEY_WIFIINFO, mInfo);
evictOldScanResults();
savedState.putParcelableArrayList(KEY_SCANRESULTCACHE,
new ArrayList<ScanResult>(mScanResultCache.snapshot().values()));
new ArrayList<ScanResult>(mScanResultCache.values()));
if (mNetworkInfo != null) {
savedState.putParcelable(KEY_NETWORKINFO, mNetworkInfo);
}
@@ -697,9 +715,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
boolean update(ScanResult result) {
if (matches(result)) {
/* Update the LRU timestamp, if BSSID exists */
mScanResultCache.get(result.BSSID);
/* Add or update the scan result for the BSSID */
mScanResultCache.put(result.BSSID, result);