ScanDetail.java revision d9f37b2f3df18e96246db93ec4c2a5159b5d3915
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.Utils;
14import com.android.server.wifi.hotspot2.pps.HomeSP;
15
16import java.util.ArrayList;
17import java.util.List;
18import java.util.Map;
19
20public class ScanDetail {
21    private final ScanResult mScanResult;
22    private volatile NetworkDetail mNetworkDetail;
23    private final Map<HomeSP, PasspointMatch> mMatches;
24    private long mSeen = 0;
25
26    public ScanDetail(NetworkDetail networkDetail, WifiSsid wifiSsid, String BSSID,
27                      String caps, int level, int frequency, long tsf) {
28        mNetworkDetail = networkDetail;
29        mScanResult = new ScanResult(wifiSsid, BSSID, caps, level, frequency, tsf );
30        mSeen = System.currentTimeMillis();
31        //mScanResult.seen = mSeen;
32        mScanResult.channelWidth = networkDetail.getChannelWidth();
33        mScanResult.centerFreq0 = networkDetail.getCenterfreq0();
34        mScanResult.centerFreq1 = networkDetail.getCenterfreq1();
35        if (networkDetail.is80211McResponderSupport())
36            mScanResult.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
37        mMatches = null;
38    }
39
40    public ScanDetail(WifiSsid wifiSsid, String BSSID, String caps, int level, int frequency,
41                      long tsf, long seen) {
42        mNetworkDetail = null;
43        mScanResult = new ScanResult(wifiSsid, BSSID, caps, level, frequency, tsf );
44        mSeen = seen;
45        //mScanResult.seen = mSeen;
46        mScanResult.channelWidth = 0;
47        mScanResult.centerFreq0 = 0;
48        mScanResult.centerFreq1 = 0;
49        mScanResult.flags = 0;
50        mMatches = null;
51    }
52
53    private ScanDetail(ScanResult scanResult, NetworkDetail networkDetail,
54                       Map<HomeSP, PasspointMatch> matches) {
55        mScanResult = scanResult;
56        mNetworkDetail = networkDetail;
57        mMatches = matches;
58    }
59
60    public void updateResults(NetworkDetail networkDetail, int level, WifiSsid wssid, String ssid,
61                              String flags, int freq, long tsf) {
62        mScanResult.level = level;
63        mScanResult.wifiSsid = wssid;
64        // Keep existing API
65        mScanResult.SSID = ssid;
66        mScanResult.capabilities = flags;
67        mScanResult.frequency = freq;
68        mScanResult.timestamp = tsf;
69        mSeen = System.currentTimeMillis();
70        //mScanResult.seen = mSeen;
71        mScanResult.channelWidth = networkDetail.getChannelWidth();
72        mScanResult.centerFreq0 = networkDetail.getCenterfreq0();
73        mScanResult.centerFreq1 = networkDetail.getCenterfreq1();
74        if (networkDetail.is80211McResponderSupport())
75            mScanResult.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
76        if (networkDetail.isInterworking())
77            mScanResult.setFlag(ScanResult.FLAG_PASSPOINT_NETWORK);
78    }
79
80    public void propagateANQPInfo(Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
81        if (anqpElements.isEmpty()) {
82            return;
83        }
84        mNetworkDetail = mNetworkDetail.complete(anqpElements);
85        HSFriendlyNameElement fne = (HSFriendlyNameElement)anqpElements.get(
86                Constants.ANQPElementType.HSFriendlyName);
87        // !!! Match with language
88        if (fne != null && !fne.getNames().isEmpty()) {
89            mScanResult.venueName = fne.getNames().get(0).getText();
90        } else {
91            VenueNameElement vne =
92                    (((VenueNameElement)anqpElements.get(Constants.ANQPElementType.ANQPVenueName)));
93            if (vne != null && !vne.getNames().isEmpty()) {
94                mScanResult.venueName = vne.getNames().get(0).getText();
95            }
96        }
97    }
98
99    public ScanResult getScanResult() {
100        return mScanResult;
101    }
102
103    public NetworkDetail getNetworkDetail() {
104        return mNetworkDetail;
105    }
106
107    public String getSSID() {
108        return mNetworkDetail == null ? mScanResult.SSID : mNetworkDetail.getSSID();
109    }
110
111    public String getBSSIDString() {
112        return  mNetworkDetail == null ? mScanResult.BSSID : mNetworkDetail.getBSSIDString();
113    }
114
115    public String toKeyString() {
116        NetworkDetail networkDetail = mNetworkDetail;
117        if (networkDetail != null) {
118            return networkDetail.toKeyString();
119        }
120        else {
121            return String.format("'%s':%012x", mScanResult.BSSID, Utils.parseMac(mScanResult.BSSID));
122        }
123    }
124
125    public long getSeen() {
126        return mSeen;
127    }
128
129    public long setSeen() {
130        mSeen = System.currentTimeMillis();
131        mScanResult.seen = mSeen;
132        return mSeen;
133    }
134
135    public List<PasspointMatchInfo> getMatchList() {
136        if (mMatches == null || mMatches.isEmpty()) {
137            return null;
138        }
139
140        List<PasspointMatchInfo> list = new ArrayList<>();
141        for (Map.Entry<HomeSP, PasspointMatch> entry : mMatches.entrySet()) {
142            new PasspointMatchInfo(entry.getValue(), this, entry.getKey());
143        }
144        return list;
145    }
146
147    @Override
148    public String toString() {
149        try {
150            return String.format("'%s'/%012x",
151                    mScanResult.SSID, Utils.parseMac(mScanResult.BSSID));
152        }
153        catch (IllegalArgumentException iae) {
154            return String.format("'%s'/----", mScanResult.BSSID);
155        }
156    }
157}
158