| package com.android.server.wifi; |
| |
| import android.net.wifi.ScanResult; |
| import android.net.wifi.WifiSsid; |
| |
| import com.android.server.wifi.anqp.ANQPElement; |
| import com.android.server.wifi.anqp.Constants; |
| import com.android.server.wifi.anqp.HSFriendlyNameElement; |
| import com.android.server.wifi.anqp.VenueNameElement; |
| import com.android.server.wifi.hotspot2.NetworkDetail; |
| import com.android.server.wifi.hotspot2.PasspointMatch; |
| import com.android.server.wifi.hotspot2.PasspointMatchInfo; |
| import com.android.server.wifi.hotspot2.pps.HomeSP; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| |
| public class ScanDetail { |
| private final ScanResult mScanResult; |
| private volatile NetworkDetail mNetworkDetail; |
| private final Map<HomeSP, PasspointMatch> mMatches; |
| private long mSeen = 0; |
| |
| public ScanDetail(NetworkDetail networkDetail, WifiSsid wifiSsid, String BSSID, |
| String caps, int level, int frequency, long tsf) { |
| mNetworkDetail = networkDetail; |
| mScanResult = new ScanResult(wifiSsid, BSSID, caps, level, frequency, tsf ); |
| mSeen = System.currentTimeMillis(); |
| mScanResult.seen = mSeen; |
| mScanResult.channelWidth = networkDetail.getChannelWidth(); |
| mScanResult.centerFreq0 = networkDetail.getCenterfreq0(); |
| mScanResult.centerFreq1 = networkDetail.getCenterfreq1(); |
| mScanResult.is80211McRTTResponder = networkDetail.is80211McResponderSupport(); |
| mMatches = null; |
| } |
| |
| public ScanDetail(WifiSsid wifiSsid, String BSSID, String caps, int level, int frequency, |
| long tsf, long seen) { |
| mNetworkDetail = null; |
| mScanResult = new ScanResult(wifiSsid, BSSID, caps, level, frequency, tsf ); |
| mSeen = seen; |
| mScanResult.seen = mSeen; |
| mScanResult.channelWidth = 0; |
| mScanResult.centerFreq0 = 0; |
| mScanResult.centerFreq1 = 0; |
| mScanResult.is80211McRTTResponder = false; |
| mMatches = null; |
| } |
| |
| private ScanDetail(ScanResult scanResult, NetworkDetail networkDetail, |
| Map<HomeSP, PasspointMatch> matches) { |
| mScanResult = scanResult; |
| mNetworkDetail = networkDetail; |
| mMatches = matches; |
| } |
| |
| public void updateResults(NetworkDetail networkDetail, int level, WifiSsid wssid, String ssid, |
| String flags, int freq, long tsf) { |
| mScanResult.level = level; |
| mScanResult.wifiSsid = wssid; |
| // Keep existing API |
| mScanResult.SSID = ssid; |
| mScanResult.capabilities = flags; |
| mScanResult.frequency = freq; |
| mScanResult.timestamp = tsf; |
| mSeen = System.currentTimeMillis(); |
| mScanResult.seen = mSeen; |
| mScanResult.channelWidth = networkDetail.getChannelWidth(); |
| mScanResult.centerFreq0 = networkDetail.getCenterfreq0(); |
| mScanResult.centerFreq1 = networkDetail.getCenterfreq1(); |
| mScanResult.is80211McRTTResponder = networkDetail.is80211McResponderSupport(); |
| mScanResult.passpointNetwork = networkDetail.isInterworking(); |
| } |
| |
| public void propagateANQPInfo(Map<Constants.ANQPElementType, ANQPElement> anqpElements) { |
| mNetworkDetail = mNetworkDetail.complete(anqpElements); |
| HSFriendlyNameElement fne = (HSFriendlyNameElement)anqpElements.get(Constants |
| .ANQPElementType.HSFriendlyName); |
| // !!! Match with language |
| if (fne != null && !fne.getNames().isEmpty()) { |
| mScanResult.venueName = fne.getNames().get(0).getText(); |
| } else { |
| VenueNameElement vne = |
| (((VenueNameElement)anqpElements.get(Constants.ANQPElementType.ANQPVenueName))); |
| if (vne != null && !vne.getNames().isEmpty()) { |
| mScanResult.venueName = vne.getNames().get(0).getText(); |
| } |
| } |
| } |
| |
| public ScanResult getScanResult() { |
| return mScanResult; |
| } |
| |
| public NetworkDetail getNetworkDetail() { |
| return mNetworkDetail; |
| } |
| |
| public String getSSID() { |
| return mNetworkDetail == null ? mScanResult.SSID : mNetworkDetail.getSSID(); |
| } |
| |
| public String getBSSIDString() { |
| return mNetworkDetail == null ? mScanResult.BSSID : mNetworkDetail.getBSSIDString(); |
| } |
| |
| public long getSeen() { |
| return mSeen; |
| } |
| |
| public long setSeen() { |
| mSeen = System.currentTimeMillis(); |
| mScanResult.seen = mSeen; |
| return mSeen; |
| } |
| |
| public List<PasspointMatchInfo> getMatchList() { |
| if (mMatches == null || mMatches.isEmpty()) { |
| return null; |
| } |
| |
| List<PasspointMatchInfo> list = new ArrayList<>(); |
| for (Map.Entry<HomeSP, PasspointMatch> entry : mMatches.entrySet()) { |
| new PasspointMatchInfo(entry.getValue(), this, entry.getKey()); |
| } |
| return list; |
| } |
| } |