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