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