14d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 24d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandepackage com.android.server.wifi; 34d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 44d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport android.net.wifi.ScanResult; 54d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport android.net.wifi.WifiConfiguration; 68eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpandeimport android.util.Log; 7e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalleimport android.os.SystemClock; 84d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 94d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport com.android.server.wifi.ScanDetail; 104d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport com.android.server.wifi.hotspot2.PasspointMatch; 114d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport com.android.server.wifi.hotspot2.PasspointMatchInfo; 124d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport com.android.server.wifi.hotspot2.pps.HomeSP; 134d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 144d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport java.util.ArrayList; 154d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport java.util.Collection; 164d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport java.util.Collections; 174d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport java.util.Comparator; 184d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport java.util.HashMap; 194d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport java.util.Iterator; 204d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeimport java.util.List; 214d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 224d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeclass ScanDetailCache { 238eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande 248eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande private static final String TAG = "ScanDetailCache"; 258eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande 264d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande private WifiConfiguration mConfig; 274d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande private HashMap<String, ScanDetail> mMap; 284d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande private HashMap<String, PasspointMatchInfo> mPasspointMatches; 29e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle private static boolean DBG=false; 304d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanDetailCache(WifiConfiguration config) { 314d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande mConfig = config; 324d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande mMap = new HashMap(); 334d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande mPasspointMatches = new HashMap(); 344d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 354d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 364d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande void put(ScanDetail scanDetail) { 374d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande put(scanDetail, null, null); 384d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 394d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 404d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande void put(ScanDetail scanDetail, PasspointMatch match, HomeSP homeSp) { 41a547460e835d6dfde84eda72df470846d11ba807Vinit Deshpande 424d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande mMap.put(scanDetail.getBSSIDString(), scanDetail); 43a547460e835d6dfde84eda72df470846d11ba807Vinit Deshpande 44a547460e835d6dfde84eda72df470846d11ba807Vinit Deshpande if (match != null && homeSp != null) { 45a547460e835d6dfde84eda72df470846d11ba807Vinit Deshpande mPasspointMatches.put(scanDetail.getBSSIDString(), 46a547460e835d6dfde84eda72df470846d11ba807Vinit Deshpande new PasspointMatchInfo(match, scanDetail, homeSp)); 47a547460e835d6dfde84eda72df470846d11ba807Vinit Deshpande } 484d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 494d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 504d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanResult get(String bssid) { 514d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanDetail scanDetail = getScanDetail(bssid); 524d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return scanDetail == null ? null : scanDetail.getScanResult(); 534d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 544d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 554d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanDetail getScanDetail(String bssid) { 564d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return mMap.get(bssid); 574d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 584d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 594d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande void remove(String bssid) { 604d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande mMap.remove(bssid); 614d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 624d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 634d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande int size() { 644d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return mMap.size(); 654d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 664d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 674d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande boolean isEmpty() { 684d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return size() == 0; 694d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 704d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 714d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanDetail getFirst() { 724d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande Iterator<ScanDetail> it = mMap.values().iterator(); 734d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return it.hasNext() ? it.next() : null; 744d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 754d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 764d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande Collection<String> keySet() { 774d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return mMap.keySet(); 784d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 794d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 804d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande Collection<ScanDetail> values() { 814d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return mMap.values(); 824d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 834d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 844d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande public void trim(int num) { 854d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande int currentSize = mMap.size(); 864d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (currentSize <= num) { 874d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return; // Nothing to trim 884d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 894d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ArrayList<ScanDetail> list = new ArrayList<ScanDetail>(mMap.values()); 904d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (list.size() != 0) { 914d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande // Sort by descending timestamp 924d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande Collections.sort(list, new Comparator() { 934d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande public int compare(Object o1, Object o2) { 944d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanDetail a = (ScanDetail) o1; 954d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanDetail b = (ScanDetail) o2; 964d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (a.getSeen() > b.getSeen()) { 974d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return 1; 984d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 994d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (a.getSeen() < b.getSeen()) { 1004d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return -1; 1014d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1024d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return a.getBSSIDString().compareTo(b.getBSSIDString()); 1034d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1044d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande }); 1054d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1064d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande for (int i = 0; i < currentSize - num ; i++) { 1074d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande // Remove oldest results from scan cache 1084d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanDetail result = list.get(i); 1094d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande mMap.remove(result.getBSSIDString()); 1104d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande mPasspointMatches.remove(result.getBSSIDString()); 1114d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1124d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1134d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 1144d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande /* @hide */ 1154d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande private ArrayList<ScanDetail> sort() { 1164d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ArrayList<ScanDetail> list = new ArrayList<ScanDetail>(mMap.values()); 1174d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (list.size() != 0) { 1184d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande Collections.sort(list, new Comparator() { 1194d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande public int compare(Object o1, Object o2) { 1204d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanResult a = ((ScanDetail)o1).getScanResult(); 1214d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanResult b = ((ScanDetail)o2).getScanResult(); 1224d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (a.numIpConfigFailures > b.numIpConfigFailures) { 1234d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return 1; 1244d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1254d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (a.numIpConfigFailures < b.numIpConfigFailures) { 1264d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return -1; 1274d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1284d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (a.seen > b.seen) { 1294d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return -1; 1304d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1314d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (a.seen < b.seen) { 1324d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return 1; 1334d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1344d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (a.level > b.level) { 1354d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return -1; 1364d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1374d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (a.level < b.level) { 1384d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return 1; 1394d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1404d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return a.BSSID.compareTo(b.BSSID); 1414d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1424d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande }); 1434d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1444d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return list; 1454d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1464d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 1474d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande public WifiConfiguration.Visibility getVisibilityByRssi(long age) { 1484d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande WifiConfiguration.Visibility status = new WifiConfiguration.Visibility(); 1494d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 1504d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long now_ms = System.currentTimeMillis(); 151cb59612d2af82044ee74e8f595c9a40498db14b4Pierre Vandwalle long now_elapsed_ms = SystemClock.elapsedRealtime(); 1524d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande for(ScanDetail scanDetail : values()) { 1534d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanResult result = scanDetail.getScanResult(); 1544d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (scanDetail.getSeen() == 0) 1554d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande continue; 1564d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 1574d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (result.is5GHz()) { 1584d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande //strictly speaking: [4915, 5825] 1594d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande //number of known BSSID on 5GHz band 1604d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande status.num5 = status.num5 + 1; 1614d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } else if (result.is24GHz()) { 1624d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande //strictly speaking: [2412, 2482] 1634d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande //number of known BSSID on 2.4Ghz band 1644d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande status.num24 = status.num24 + 1; 1654d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1664d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 167e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle if (result.timestamp != 0) { 168e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle if (DBG) { 169e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle Log.e("getVisibilityByRssi", " considering " + result.SSID + " " + result.BSSID 170cb59612d2af82044ee74e8f595c9a40498db14b4Pierre Vandwalle + " elapsed=" + now_elapsed_ms + " timestamp=" + result.timestamp 171e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle + " age = " + age); 172e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle } 173cb59612d2af82044ee74e8f595c9a40498db14b4Pierre Vandwalle if ((now_elapsed_ms - (result.timestamp/1000)) > age) continue; 174e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle } else { 175e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle // This check the time at which we have received the scan result from supplicant 176e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle if ((now_ms - result.seen) > age) continue; 177e3e4fad6e9b2022018a33507e93a39c6446f9916Pierre Vandwalle } 1784d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 1794d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (result.is5GHz()) { 1804d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (result.level > status.rssi5) { 1814d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande status.rssi5 = result.level; 1824d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande status.age5 = result.seen; 1834d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande status.BSSID5 = result.BSSID; 1844d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1854d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } else if (result.is24GHz()) { 1864d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (result.level > status.rssi24) { 1874d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande status.rssi24 = result.level; 1884d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande status.age24 = result.seen; 1894d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande status.BSSID24 = result.BSSID; 1904d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1914d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1924d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1934d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 1944d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return status; 1954d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 1964d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 1974d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande public WifiConfiguration.Visibility getVisibilityByPasspointMatch(long age) { 1984d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 1994d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long now_ms = System.currentTimeMillis(); 2008eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande PasspointMatchInfo pmiBest24 = null, pmiBest5 = null; 2018eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande 2028eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande for(PasspointMatchInfo pmi : mPasspointMatches.values()) { 2038eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande ScanDetail scanDetail = pmi.getScanDetail(); 2048eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande if (scanDetail == null) continue; 2054d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanResult result = scanDetail.getScanResult(); 2068eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande if (result == null) continue; 2078eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande 2084d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (scanDetail.getSeen() == 0) 2094d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande continue; 2104d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2114d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if ((now_ms - result.seen) > age) continue; 2124d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2134d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (result.is5GHz()) { 2148eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande if (pmiBest5 == null || pmiBest5.compareTo(pmi) < 0) { 2158eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande pmiBest5 = pmi; 2164d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2174d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } else if (result.is24GHz()) { 2188eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande if (pmiBest24 == null || pmiBest24.compareTo(pmi) < 0) { 2198eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande pmiBest24 = pmi; 2204d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2214d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2224d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2234d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2248eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande WifiConfiguration.Visibility status = new WifiConfiguration.Visibility(); 2258eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande String logMsg = "Visiblity by passpoint match returned "; 2268eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande if (pmiBest5 != null) { 2278eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande ScanResult result = pmiBest5.getScanDetail().getScanResult(); 2288eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande status.rssi5 = result.level; 2298eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande status.age5 = result.seen; 2308eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande status.BSSID5 = result.BSSID; 2318eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande logMsg += "5 GHz BSSID of " + result.BSSID; 2328eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande } 2338eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande if (pmiBest24 != null) { 2348eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande ScanResult result = pmiBest24.getScanDetail().getScanResult(); 2358eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande status.rssi24 = result.level; 2368eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande status.age24 = result.seen; 2378eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande status.BSSID24 = result.BSSID; 2388eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande logMsg += "2.4 GHz BSSID of " + result.BSSID; 2398eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande } 2408eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande 2418eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande Log.d(TAG, logMsg); 2428eefaf2c281b44fb7a4d951ba587f447800c4b4fVinit Deshpande 2434d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return status; 2444d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2454d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2464d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande public WifiConfiguration.Visibility getVisibility(long age) { 2474d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (mConfig.isPasspoint()) { 2484d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return getVisibilityByPasspointMatch(age); 2494d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } else { 2504d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return getVisibilityByRssi(age); 2514d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2524d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2534d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2544d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2554d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2564d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande @Override 2574d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande public String toString() { 2584d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande StringBuilder sbuf = new StringBuilder(); 2594d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append("Scan Cache: ").append('\n'); 2604d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2614d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ArrayList<ScanDetail> list = sort(); 2624d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long now_ms = System.currentTimeMillis(); 2634d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (list.size() > 0) { 2644d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande for (ScanDetail scanDetail : list) { 2654d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ScanResult result = scanDetail.getScanResult(); 2664d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long milli = now_ms - scanDetail.getSeen(); 2674d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long ageSec = 0; 2684d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long ageMin = 0; 2694d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long ageHour = 0; 2704d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long ageMilli = 0; 2714d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande long ageDay = 0; 2724d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (now_ms > scanDetail.getSeen() && scanDetail.getSeen() > 0) { 2734d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ageMilli = milli % 1000; 2744d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ageSec = (milli / 1000) % 60; 2754d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ageMin = (milli / (60*1000)) % 60; 2764d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ageHour = (milli / (60*60*1000)) % 24; 2774d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ageDay = (milli / (24*60*60*1000)); 2784d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2794d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append("{").append(result.BSSID).append(",").append(result.frequency); 2804d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append(",").append(String.format("%3d", result.level)); 2814d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (result.autoJoinStatus > 0) { 2824d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append(",st=").append(result.autoJoinStatus); 2834d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2844d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (ageSec > 0 || ageMilli > 0) { 2854d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append(String.format(",%4d.%02d.%02d.%02d.%03dms", ageDay, 2864d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande ageHour, ageMin, ageSec, ageMilli)); 2874d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2884d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande if (result.numIpConfigFailures > 0) { 2894d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append(",ipfail="); 2904d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append(result.numIpConfigFailures); 2914d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2924d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append("} "); 2934d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2944d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande sbuf.append('\n'); 2954d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2964d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 2974d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande return sbuf.toString(); 2984d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande } 2994d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 3004d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande} 301