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