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