ScanDetail.java revision 77f2b82a2e80af8da52c22d69a76def6d4209757
1package com.android.server.wifi;
2
3import android.net.wifi.ScanResult;
4import android.net.wifi.WifiSsid;
5
6import com.android.server.wifi.anqp.ANQPElement;
7import com.android.server.wifi.anqp.Constants;
8import com.android.server.wifi.anqp.HSFriendlyNameElement;
9import com.android.server.wifi.anqp.VenueNameElement;
10import com.android.server.wifi.hotspot2.NetworkDetail;
11import com.android.server.wifi.hotspot2.PasspointMatch;
12import com.android.server.wifi.hotspot2.PasspointMatchInfo;
13import com.android.server.wifi.hotspot2.pps.HomeSP;
14
15import java.util.ArrayList;
16import java.util.List;
17import java.util.Map;
18
19public class ScanDetail {
20    private final ScanResult mScanResult;
21    private volatile NetworkDetail mNetworkDetail;
22    private final Map<HomeSP, PasspointMatch> mMatches;
23
24    public ScanDetail(NetworkDetail networkDetail, WifiSsid wifiSsid, String BSSID,
25                      String caps, int level, int frequency, long tsf) {
26        mNetworkDetail = networkDetail;
27        mScanResult = new ScanResult(wifiSsid, BSSID, caps, level, frequency, tsf );
28        mScanResult.seen = System.currentTimeMillis();
29        mMatches = null;
30    }
31
32    private ScanDetail(ScanResult scanResult, NetworkDetail networkDetail,
33                       Map<HomeSP, PasspointMatch> matches) {
34        mScanResult = scanResult;
35        mNetworkDetail = networkDetail;
36        mMatches = matches;
37    }
38
39    public ScanDetail score(Map<HomeSP, PasspointMatch> matches) {
40        return new ScanDetail(mScanResult, mNetworkDetail, matches);
41    }
42
43    public void updateResults(int level, WifiSsid wssid, String ssid,
44                              String flags, int freq, long tsf) {
45        mScanResult.level = level;
46        mScanResult.wifiSsid = wssid;
47        // Keep existing API
48        mScanResult.SSID = ssid;
49        mScanResult.capabilities = flags;
50        mScanResult.frequency = freq;
51        mScanResult.timestamp = tsf;
52        mScanResult.seen = System.currentTimeMillis();
53    }
54
55    public void propagateANQPInfo(Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
56        mNetworkDetail = mNetworkDetail.complete(anqpElements);
57        ANQPElement nameElement = anqpElements.get(Constants.ANQPElementType.HSFriendlyName);
58        // !!! Match with language
59        /*
60        if (nameElement != null) {
61            mScanResult.friendlyName =
62                    (((HSFriendlyNameElement)nameElement).getNames().get(0).getText());
63        }
64        else {
65            nameElement = anqpElements.get(Constants.ANQPElementType.ANQPVenueName);
66            if (nameElement != null) {
67                mScanResult.friendlyName =
68                        (((VenueNameElement)nameElement).getNames().get(0).getText());
69            }
70        }
71        */
72    }
73
74    public ScanResult getScanResult() {
75        return mScanResult;
76    }
77
78    public NetworkDetail getNetworkDetail() {
79        return mNetworkDetail;
80    }
81
82    public String getSSID() {
83        return mNetworkDetail.getSSID();
84    }
85
86    public String getBSSIDString() {
87        return mNetworkDetail.getBSSIDString();
88    }
89
90    public List<PasspointMatchInfo> getMatchList() {
91        if (mMatches == null || mMatches.isEmpty()) {
92            return null;
93        }
94
95        List<PasspointMatchInfo> list = new ArrayList<>();
96        for (Map.Entry<HomeSP, PasspointMatch> entry : mMatches.entrySet()) {
97            new PasspointMatchInfo(entry.getValue(), mNetworkDetail, entry.getKey());
98        }
99        return list;
100    }
101}
102