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