ScanDetail.java revision b151395e1d4de62ea8a9254e69e1878d3d1cde28
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        mScanResult.channelWidth = networkDetail.getChannelWidth();
30        mScanResult.centerFreq0 = networkDetail.getCenterfreq0();
31        mScanResult.centerFreq1 = networkDetail.getCenterfreq1();
32        mScanResult.is80211McRTTResponder = networkDetail.is80211McResponderSupport();
33        mMatches = null;
34    }
35
36    private ScanDetail(ScanResult scanResult, NetworkDetail networkDetail,
37                       Map<HomeSP, PasspointMatch> matches) {
38        mScanResult = scanResult;
39        mNetworkDetail = networkDetail;
40        mMatches = matches;
41    }
42
43    public ScanDetail score(Map<HomeSP, PasspointMatch> matches) {
44        return new ScanDetail(mScanResult, mNetworkDetail, matches);
45    }
46
47    public void updateResults(NetworkDetail networkDetail, int level, WifiSsid wssid, String ssid,
48                              String flags, int freq, long tsf) {
49        mScanResult.level = level;
50        mScanResult.wifiSsid = wssid;
51        // Keep existing API
52        mScanResult.SSID = ssid;
53        mScanResult.capabilities = flags;
54        mScanResult.frequency = freq;
55        mScanResult.timestamp = tsf;
56        mScanResult.seen = System.currentTimeMillis();
57        mScanResult.channelWidth = networkDetail.getChannelWidth();
58        mScanResult.centerFreq0 = networkDetail.getCenterfreq0();
59        mScanResult.centerFreq1 = networkDetail.getCenterfreq1();
60        mScanResult.is80211McRTTResponder = networkDetail.is80211McResponderSupport();
61        mScanResult.passpointNetwork = networkDetail.isInterworking();
62    }
63
64    public void propagateANQPInfo(Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
65        mNetworkDetail = mNetworkDetail.complete(anqpElements);
66        HSFriendlyNameElement fne = (HSFriendlyNameElement)anqpElements.get(Constants
67                .ANQPElementType.HSFriendlyName);
68        // !!! Match with language
69        if (fne != null && !fne.getNames().isEmpty()) {
70            mScanResult.venueName = fne.getNames().get(0).getText();
71        } else {
72            VenueNameElement vne =
73                    (((VenueNameElement)anqpElements.get(Constants.ANQPElementType.ANQPVenueName)));
74            if (vne != null && !vne.getNames().isEmpty()) {
75                mScanResult.venueName = vne.getNames().get(0).getText();
76            }
77        }
78    }
79
80    public ScanResult getScanResult() {
81        return mScanResult;
82    }
83
84    public NetworkDetail getNetworkDetail() {
85        return mNetworkDetail;
86    }
87
88    public String getSSID() {
89        return mNetworkDetail.getSSID();
90    }
91
92    public String getBSSIDString() {
93        return mNetworkDetail.getBSSIDString();
94    }
95
96    public List<PasspointMatchInfo> getMatchList() {
97        if (mMatches == null || mMatches.isEmpty()) {
98            return null;
99        }
100
101        List<PasspointMatchInfo> list = new ArrayList<>();
102        for (Map.Entry<HomeSP, PasspointMatch> entry : mMatches.entrySet()) {
103            new PasspointMatchInfo(entry.getValue(), this, entry.getKey());
104        }
105        return list;
106    }
107}
108