1d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk/* 2d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Copyright (C) 2015 The Android Open Source Project 3d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * 4d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 5d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * you may not use this file except in compliance with the License. 6d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * You may obtain a copy of the License at 7d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * 8d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 9d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * 10d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Unless required by applicable law or agreed to in writing, software 11d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * distributed under the License is distributed on an "AS IS" BASIS, 12d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * See the License for the specific language governing permissions and 14d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * limitations under the License. 15d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 16d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 17d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkpackage com.android.settingslib.wifi; 18d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 196980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.app.AppGlobals; 20d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.content.Context; 216980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.content.pm.ApplicationInfo; 226980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.content.pm.IPackageManager; 236980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.content.pm.PackageManager; 247094d22022c8e0c6ad71920b101434dded8a276eSanket Padaweimport android.net.ConnectivityManager; 257094d22022c8e0c6ad71920b101434dded8a276eSanket Padaweimport android.net.Network; 267094d22022c8e0c6ad71920b101434dded8a276eSanket Padaweimport android.net.NetworkCapabilities; 27d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.net.NetworkInfo; 28d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.net.NetworkInfo.DetailedState; 29d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.net.NetworkInfo.State; 307094d22022c8e0c6ad71920b101434dded8a276eSanket Padaweimport android.net.wifi.IWifiManager; 31d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.net.wifi.ScanResult; 32d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.net.wifi.WifiConfiguration; 33d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.net.wifi.WifiConfiguration.KeyMgmt; 34d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.net.wifi.WifiInfo; 35d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.net.wifi.WifiManager; 36d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.os.Bundle; 377094d22022c8e0c6ad71920b101434dded8a276eSanket Padaweimport android.os.RemoteException; 387094d22022c8e0c6ad71920b101434dded8a276eSanket Padaweimport android.os.ServiceManager; 396980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.os.UserHandle; 40a0e03ddd5f8b0f3dc0d3cd1c3432b137dd528a90Tony Mantlerimport android.support.annotation.NonNull; 416980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.text.Spannable; 426980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.text.SpannableString; 436980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.text.TextUtils; 446980d12c5864941e68933705c1f15a102ac348cbJason Monkimport android.text.style.TtsSpan; 45d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.util.Log; 46d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport android.util.LruCache; 47d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 48d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport com.android.settingslib.R; 49d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 50fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpandeimport java.util.ArrayList; 51d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport java.util.Map; 52d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 53d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 54d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkpublic class AccessPoint implements Comparable<AccessPoint> { 55d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk static final String TAG = "SettingsLib.AccessPoint"; 56d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 57d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 58d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Lower bound on the 2.4 GHz (802.11b/g/n) WLAN channels 59d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 60d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static final int LOWER_FREQ_24GHZ = 2400; 61d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 62d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 63d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Upper bound on the 2.4 GHz (802.11b/g/n) WLAN channels 64d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 65d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static final int HIGHER_FREQ_24GHZ = 2500; 66d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 67d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 68d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Lower bound on the 5.0 GHz (802.11a/h/j/n/ac) WLAN channels 69d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 70d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static final int LOWER_FREQ_5GHZ = 4900; 71d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 72d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 73d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Upper bound on the 5.0 GHz (802.11a/h/j/n/ac) WLAN channels 74d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 75d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static final int HIGHER_FREQ_5GHZ = 5900; 76d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 77d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 78d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 79d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Experimental: we should be able to show the user the list of BSSIDs and bands 80d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * for that SSID. 81d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * For now this data is used only with Verbose Logging so as to show the band and number 82d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * of BSSIDs on which that network is seen. 83d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 84fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande public LruCache<String, ScanResult> mScanResultCache = new LruCache<String, ScanResult>(32); 85fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 86d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static final String KEY_NETWORKINFO = "key_networkinfo"; 87d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static final String KEY_WIFIINFO = "key_wifiinfo"; 88d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static final String KEY_SCANRESULT = "key_scanresult"; 89fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande private static final String KEY_SSID = "key_ssid"; 90fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande private static final String KEY_SECURITY = "key_security"; 91fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande private static final String KEY_PSKTYPE = "key_psktype"; 92fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande private static final String KEY_SCANRESULTCACHE = "key_scanresultcache"; 93d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static final String KEY_CONFIG = "key_config"; 94d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 95d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 96d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * These values are matched in string arrays -- changes must be kept in sync 97d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 98d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static final int SECURITY_NONE = 0; 99d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static final int SECURITY_WEP = 1; 100d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static final int SECURITY_PSK = 2; 101d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static final int SECURITY_EAP = 3; 102d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 103d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static final int PSK_UNKNOWN = 0; 104d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static final int PSK_WPA = 1; 105d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static final int PSK_WPA2 = 2; 106d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static final int PSK_WPA_WPA2 = 3; 107d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 108a0e03ddd5f8b0f3dc0d3cd1c3432b137dd528a90Tony Mantler public static final int SIGNAL_LEVELS = 4; 109a0e03ddd5f8b0f3dc0d3cd1c3432b137dd528a90Tony Mantler 110d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private final Context mContext; 111d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 112d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private String ssid; 11360a82ffe457942bf9a106b406b14d10d09ba57efJason Monk private String bssid; 114d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private int security; 115d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private int networkId = WifiConfiguration.INVALID_NETWORK_ID; 116d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 117d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private int pskType = PSK_UNKNOWN; 118d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 119d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private WifiConfiguration mConfig; 120d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 121d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private int mRssi = Integer.MAX_VALUE; 122d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private long mSeen = 0; 123d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 124d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private WifiInfo mInfo; 125d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private NetworkInfo mNetworkInfo; 126d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private AccessPointListener mAccessPointListener; 127d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 128d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private Object mTag; 129d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 130d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public AccessPoint(Context context, Bundle savedState) { 131d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mContext = context; 132d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mConfig = savedState.getParcelable(KEY_CONFIG); 133d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mConfig != null) { 134d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk loadConfig(mConfig); 135d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 136fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (savedState.containsKey(KEY_SSID)) { 137fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande ssid = savedState.getString(KEY_SSID); 138fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 139fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (savedState.containsKey(KEY_SECURITY)) { 140fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande security = savedState.getInt(KEY_SECURITY); 141fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 142fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (savedState.containsKey(KEY_PSKTYPE)) { 143fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande pskType = savedState.getInt(KEY_PSKTYPE); 144d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 145d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mInfo = (WifiInfo) savedState.getParcelable(KEY_WIFIINFO); 146d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (savedState.containsKey(KEY_NETWORKINFO)) { 147d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mNetworkInfo = savedState.getParcelable(KEY_NETWORKINFO); 148d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 149fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (savedState.containsKey(KEY_SCANRESULTCACHE)) { 150fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande ArrayList<ScanResult> scanResultArrayList = 151fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande savedState.getParcelableArrayList(KEY_SCANRESULTCACHE); 152fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mScanResultCache.evictAll(); 153fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande for (ScanResult result : scanResultArrayList) { 154fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mScanResultCache.put(result.BSSID, result); 155fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 156fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 1575a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills update(mConfig, mInfo, mNetworkInfo); 158fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mRssi = getRssi(); 159fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mSeen = getSeen(); 160d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 161d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 162d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk AccessPoint(Context context, ScanResult result) { 163d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mContext = context; 164fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande initWithScanResult(result); 165d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 166d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 167d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk AccessPoint(Context context, WifiConfiguration config) { 168d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mContext = context; 169d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk loadConfig(config); 170d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 171d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 172d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk @Override 173a0e03ddd5f8b0f3dc0d3cd1c3432b137dd528a90Tony Mantler public int compareTo(@NonNull AccessPoint other) { 174d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // Active one goes first. 175d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (isActive() && !other.isActive()) return -1; 176d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (!isActive() && other.isActive()) return 1; 177d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 178d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // Reachable one goes before unreachable one. 179d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mRssi != Integer.MAX_VALUE && other.mRssi == Integer.MAX_VALUE) return -1; 180d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mRssi == Integer.MAX_VALUE && other.mRssi != Integer.MAX_VALUE) return 1; 181d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 182d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // Configured one goes before unconfigured one. 183d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (networkId != WifiConfiguration.INVALID_NETWORK_ID 184d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk && other.networkId == WifiConfiguration.INVALID_NETWORK_ID) return -1; 185d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (networkId == WifiConfiguration.INVALID_NETWORK_ID 186d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk && other.networkId != WifiConfiguration.INVALID_NETWORK_ID) return 1; 187d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 188a0e03ddd5f8b0f3dc0d3cd1c3432b137dd528a90Tony Mantler // Sort by signal strength, bucketed by level 189a0e03ddd5f8b0f3dc0d3cd1c3432b137dd528a90Tony Mantler int difference = WifiManager.calculateSignalLevel(other.mRssi, SIGNAL_LEVELS) 190a0e03ddd5f8b0f3dc0d3cd1c3432b137dd528a90Tony Mantler - WifiManager.calculateSignalLevel(mRssi, SIGNAL_LEVELS); 191d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (difference != 0) { 192d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return difference; 193d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 194d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // Sort by ssid. 195d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return ssid.compareToIgnoreCase(other.ssid); 196d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 197d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 198d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk @Override 199d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public boolean equals(Object other) { 200d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (!(other instanceof AccessPoint)) return false; 201d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return (this.compareTo((AccessPoint) other) == 0); 202d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 203d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 204d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk @Override 205d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public int hashCode() { 206d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk int result = 0; 207d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mInfo != null) result += 13 * mInfo.hashCode(); 208d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk result += 19 * mRssi; 209d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk result += 23 * networkId; 210d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk result += 29 * ssid.hashCode(); 211d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return result; 212d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 213d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 214d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk @Override 215d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public String toString() { 216d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk StringBuilder builder = new StringBuilder().append("AccessPoint(") 217d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk .append(ssid); 218d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (isSaved()) { 219d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk builder.append(',').append("saved"); 220d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 221d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (isActive()) { 222d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk builder.append(',').append("active"); 223d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 224d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (isEphemeral()) { 225d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk builder.append(',').append("ephemeral"); 226d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 227d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (isConnectable()) { 228d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk builder.append(',').append("connectable"); 229d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 230d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (security != SECURITY_NONE) { 231d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk builder.append(',').append(securityToString(security, pskType)); 232d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 233d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return builder.append(')').toString(); 234d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 235d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 236d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public boolean matches(ScanResult result) { 237d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return ssid.equals(result.SSID) && security == getSecurity(result); 238d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 239d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 240d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public boolean matches(WifiConfiguration config) { 2416fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski if (config.isPasspoint() && mConfig != null && mConfig.isPasspoint()) { 242dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande return config.FQDN.equals(mConfig.providerFriendlyName); 2436fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski } else { 2446fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski return ssid.equals(removeDoubleQuotes(config.SSID)) 2456fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski && security == getSecurity(config) 2466fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski && (mConfig == null || mConfig.shared == config.shared); 2476fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski } 248d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 249d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 250d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public WifiConfiguration getConfig() { 251d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return mConfig; 252d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 253d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 254d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public void clearConfig() { 255d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mConfig = null; 256d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk networkId = WifiConfiguration.INVALID_NETWORK_ID; 257d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 258d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 259d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public WifiInfo getInfo() { 260d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return mInfo; 261d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 262d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 263d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public int getLevel() { 264d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mRssi == Integer.MAX_VALUE) { 265d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return -1; 266d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 267a0e03ddd5f8b0f3dc0d3cd1c3432b137dd528a90Tony Mantler return WifiManager.calculateSignalLevel(mRssi, SIGNAL_LEVELS); 268d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 269d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 270fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande public int getRssi() { 271fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int rssi = Integer.MIN_VALUE; 272fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande for (ScanResult result : mScanResultCache.snapshot().values()) { 273fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (result.level > rssi) { 274fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande rssi = result.level; 275fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 276fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 277fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 278fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande return rssi; 279fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 280fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 281fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande public long getSeen() { 282fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande long seen = 0; 283fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande for (ScanResult result : mScanResultCache.snapshot().values()) { 284fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (result.timestamp > seen) { 285fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande seen = result.timestamp; 286fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 287fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 288fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 289fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande return seen; 290fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 291fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 292d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public NetworkInfo getNetworkInfo() { 293d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return mNetworkInfo; 294d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 295d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 296d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public int getSecurity() { 297d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return security; 298d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 299d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 300d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public String getSecurityString(boolean concise) { 301d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk Context context = mContext; 302d187880109a614f677911c89cdc1cb034341de3dSanket Padawe if (mConfig != null && mConfig.isPasspoint()) { 303194cce695b51604f6245a73cfec27631c7555429Sanket Padawe return concise ? context.getString(R.string.wifi_security_short_eap) : 304194cce695b51604f6245a73cfec27631c7555429Sanket Padawe context.getString(R.string.wifi_security_eap); 305d187880109a614f677911c89cdc1cb034341de3dSanket Padawe } 306d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk switch(security) { 307d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk case SECURITY_EAP: 308d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return concise ? context.getString(R.string.wifi_security_short_eap) : 309d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk context.getString(R.string.wifi_security_eap); 310d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk case SECURITY_PSK: 311d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk switch (pskType) { 312d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk case PSK_WPA: 313d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return concise ? context.getString(R.string.wifi_security_short_wpa) : 314d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk context.getString(R.string.wifi_security_wpa); 315d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk case PSK_WPA2: 316d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return concise ? context.getString(R.string.wifi_security_short_wpa2) : 317d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk context.getString(R.string.wifi_security_wpa2); 318d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk case PSK_WPA_WPA2: 319d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return concise ? context.getString(R.string.wifi_security_short_wpa_wpa2) : 320d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk context.getString(R.string.wifi_security_wpa_wpa2); 321d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk case PSK_UNKNOWN: 322d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk default: 323d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return concise ? context.getString(R.string.wifi_security_short_psk_generic) 324d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk : context.getString(R.string.wifi_security_psk_generic); 325d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 326d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk case SECURITY_WEP: 327d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return concise ? context.getString(R.string.wifi_security_short_wep) : 328d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk context.getString(R.string.wifi_security_wep); 329d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk case SECURITY_NONE: 330d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk default: 331d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return concise ? "" : context.getString(R.string.wifi_security_none); 332d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 333d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 334d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 3356980d12c5864941e68933705c1f15a102ac348cbJason Monk public String getSsidStr() { 336d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return ssid; 337d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 338d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 33960a82ffe457942bf9a106b406b14d10d09ba57efJason Monk public String getBssid() { 34060a82ffe457942bf9a106b406b14d10d09ba57efJason Monk return bssid; 34160a82ffe457942bf9a106b406b14d10d09ba57efJason Monk } 34260a82ffe457942bf9a106b406b14d10d09ba57efJason Monk 3436980d12c5864941e68933705c1f15a102ac348cbJason Monk public CharSequence getSsid() { 3446980d12c5864941e68933705c1f15a102ac348cbJason Monk SpannableString str = new SpannableString(ssid); 3456980d12c5864941e68933705c1f15a102ac348cbJason Monk str.setSpan(new TtsSpan.VerbatimBuilder(ssid).build(), 0, ssid.length(), 3466980d12c5864941e68933705c1f15a102ac348cbJason Monk Spannable.SPAN_INCLUSIVE_INCLUSIVE); 3476980d12c5864941e68933705c1f15a102ac348cbJason Monk return str; 3486980d12c5864941e68933705c1f15a102ac348cbJason Monk } 3496980d12c5864941e68933705c1f15a102ac348cbJason Monk 350dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande public String getConfigName() { 351dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande if (mConfig != null && mConfig.isPasspoint()) { 352dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande return mConfig.providerFriendlyName; 353dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } else { 354dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande return ssid; 355dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } 356dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } 357dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande 358d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public DetailedState getDetailedState() { 359d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return mNetworkInfo != null ? mNetworkInfo.getDetailedState() : null; 360d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 361d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 362dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande public String getSavedNetworkSummary() { 36356cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe if (mConfig != null) { 36456cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe PackageManager pm = mContext.getPackageManager(); 36556cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe String systemName = pm.getNameForUid(android.os.Process.SYSTEM_UID); 36656cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe int userId = UserHandle.getUserId(mConfig.creatorUid); 36756cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe ApplicationInfo appInfo = null; 36856cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe if (mConfig.creatorName != null && mConfig.creatorName.equals(systemName)) { 36956cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe appInfo = mContext.getApplicationInfo(); 37056cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe } else { 37156cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe try { 37256cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe IPackageManager ipm = AppGlobals.getPackageManager(); 37356cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe appInfo = ipm.getApplicationInfo(mConfig.creatorName, 0 /* flags */, userId); 37456cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe } catch (RemoteException rex) { 37556cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe } 37656cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe } 37756cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe if (appInfo != null && 37856cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe !appInfo.packageName.equals(mContext.getString(R.string.settings_package)) && 37956cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe !appInfo.packageName.equals( 38056cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe mContext.getString(R.string.certinstaller_package))) { 38156cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe return mContext.getString(R.string.saved_network, appInfo.loadLabel(pm)); 38256cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe } 383dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } 38456cfbfb0319dfed65b6307b1baf73cb9b92db9b9Sanket Padawe return ""; 385dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } 386dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande 387d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public String getSummary() { 388dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande return getSettingsSummary(); 389dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } 390dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande 391dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande public String getSettingsSummary() { 392d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // Update to new summary 393d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk StringBuilder summary = new StringBuilder(); 394d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 395dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande if (isActive() && mConfig != null && mConfig.isPasspoint()) { 396dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande // This is the active connection on passpoint 397d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(getSummary(mContext, getDetailedState(), 398dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande false, mConfig.providerFriendlyName)); 399dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } else if (isActive()) { 400dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande // This is the active connection on non-passpoint network 401dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande summary.append(getSummary(mContext, getDetailedState(), 402c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele mInfo != null && mInfo.isEphemeral())); 403dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } else if (mConfig != null && mConfig.isPasspoint()) { 404dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande String format = mContext.getString(R.string.available_via_passpoint); 405dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande summary.append(String.format(format, mConfig.providerFriendlyName)); 406dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } else if (mConfig != null && mConfig.hasNoInternetAccess()) { 407d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(mContext.getString(R.string.wifi_no_internet)); 408f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe } else if (mConfig != null && !mConfig.getNetworkSelectionStatus().isNetworkEnabled()) { 409f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe WifiConfiguration.NetworkSelectionStatus networkStatus = 410f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe mConfig.getNetworkSelectionStatus(); 411f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe switch (networkStatus.getNetworkSelectionDisableReason()) { 412f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe case WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE: 413d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(mContext.getString(R.string.wifi_disabled_password_failure)); 414f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe break; 415f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe case WifiConfiguration.NetworkSelectionStatus.DISABLED_DHCP_FAILURE: 416f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe case WifiConfiguration.NetworkSelectionStatus.DISABLED_DNS_FAILURE: 417f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe summary.append(mContext.getString(R.string.wifi_disabled_network_failure)); 418f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe break; 419f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe case WifiConfiguration.NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION: 420f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe summary.append(mContext.getString(R.string.wifi_disabled_generic)); 421f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe break; 422d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 423d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range 424d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(mContext.getString(R.string.wifi_not_in_range)); 425d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else { // In range, not disabled. 426d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mConfig != null) { // Is saved network 427d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(mContext.getString(R.string.wifi_remembered)); 428d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 429d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 430d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 431d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (WifiTracker.sVerboseLogging > 0) { 432d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // Add RSSI/band information for this config, what was seen up to 6 seconds ago 433d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // verbose WiFi Logging is only turned on thru developers settings 434d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mInfo != null && mNetworkInfo != null) { // This is the active connection 435d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(" f=" + Integer.toString(mInfo.getFrequency())); 436d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 437d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(" " + getVisibilityStatus()); 438f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe if (mConfig != null && !mConfig.getNetworkSelectionStatus().isNetworkEnabled()) { 439f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe summary.append(" (" + mConfig.getNetworkSelectionStatus().getNetworkStatusString()); 440f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe if (mConfig.getNetworkSelectionStatus().getDisableTime() > 0) { 441d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk long now = System.currentTimeMillis(); 442f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe long diff = (now - mConfig.getNetworkSelectionStatus().getDisableTime()) / 1000; 443d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk long sec = diff%60; //seconds 444d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk long min = (diff/60)%60; //minutes 445d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk long hour = (min/60)%60; //hours 446d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(", "); 447d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (hour > 0) summary.append(Long.toString(hour) + "h "); 448d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append( Long.toString(min) + "m "); 449d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append( Long.toString(sec) + "s "); 450d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 451d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk summary.append(")"); 452d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 453f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe 454f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe if (mConfig != null) { 455f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe WifiConfiguration.NetworkSelectionStatus networkStatus = 456f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe mConfig.getNetworkSelectionStatus(); 457f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe for (int index = WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLE; 458f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe index < WifiConfiguration.NetworkSelectionStatus 459f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe .NETWORK_SELECTION_DISABLED_MAX; index++) { 460f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe if (networkStatus.getDisableReasonCounter(index) != 0) { 461f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe summary.append(" " + WifiConfiguration.NetworkSelectionStatus 462f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe .getNetworkDisableReasonString(index) + "=" 463f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe + networkStatus.getDisableReasonCounter(index)); 464f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe } 465f7705c3ed6ac2e6d787f91c65feb003a8b749cebxinhe } 466d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 467d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 468d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return summary.toString(); 469d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 470d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 471d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 472d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Returns the visibility status of the WifiConfiguration. 473d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * 474d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * @return autojoin debugging information 475d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * TODO: use a string formatter 476d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * ["rssi 5Ghz", "num results on 5GHz" / "rssi 5Ghz", "num results on 5GHz"] 477d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * For instance [-40,5/-30,2] 478d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 479d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private String getVisibilityStatus() { 480d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk StringBuilder visibility = new StringBuilder(); 481d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk StringBuilder scans24GHz = null; 482d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk StringBuilder scans5GHz = null; 483d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk String bssid = null; 484d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 485d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk long now = System.currentTimeMillis(); 486d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 487d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mInfo != null) { 488d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk bssid = mInfo.getBSSID(); 489d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (bssid != null) { 490d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk visibility.append(" ").append(bssid); 491d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 492d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk visibility.append(" rssi=").append(mInfo.getRssi()); 493d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk visibility.append(" "); 494d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk visibility.append(" score=").append(mInfo.score); 495d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk visibility.append(String.format(" tx=%.1f,", mInfo.txSuccessRate)); 496d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk visibility.append(String.format("%.1f,", mInfo.txRetriesRate)); 497d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk visibility.append(String.format("%.1f ", mInfo.txBadRate)); 498d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk visibility.append(String.format("rx=%.1f", mInfo.rxSuccessRate)); 499d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 500d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 501fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int rssi5 = WifiConfiguration.INVALID_RSSI; 502fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int rssi24 = WifiConfiguration.INVALID_RSSI; 503fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int num5 = 0; 504fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int num24 = 0; 505fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int numBlackListed = 0; 506fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int n24 = 0; // Number scan results we included in the string 507fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int n5 = 0; // Number scan results we included in the string 508fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande Map<String, ScanResult> list = mScanResultCache.snapshot(); 509fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande // TODO: sort list by RSSI or age 510fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande for (ScanResult result : list.values()) { 511fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 512fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (result.frequency >= LOWER_FREQ_5GHZ 513fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande && result.frequency <= HIGHER_FREQ_5GHZ) { 514fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande // Strictly speaking: [4915, 5825] 515fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande // number of known BSSID on 5GHz band 516fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande num5 = num5 + 1; 517fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } else if (result.frequency >= LOWER_FREQ_24GHZ 518fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande && result.frequency <= HIGHER_FREQ_24GHZ) { 519fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande // Strictly speaking: [2412, 2482] 520fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande // number of known BSSID on 2.4Ghz band 521fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande num24 = num24 + 1; 522fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 523d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 524d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 525fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (result.frequency >= LOWER_FREQ_5GHZ 526fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande && result.frequency <= HIGHER_FREQ_5GHZ) { 527fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (result.level > rssi5) { 528fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande rssi5 = result.level; 529fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 530fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (n5 < 4) { 531fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (scans5GHz == null) scans5GHz = new StringBuilder(); 532fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande scans5GHz.append(" \n{").append(result.BSSID); 533fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (bssid != null && result.BSSID.equals(bssid)) scans5GHz.append("*"); 534fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande scans5GHz.append("=").append(result.frequency); 535fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande scans5GHz.append(",").append(result.level); 536fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande scans5GHz.append("}"); 537fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande n5++; 538d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 539fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } else if (result.frequency >= LOWER_FREQ_24GHZ 540fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande && result.frequency <= HIGHER_FREQ_24GHZ) { 541fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (result.level > rssi24) { 542fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande rssi24 = result.level; 543fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 544fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (n24 < 4) { 545fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (scans24GHz == null) scans24GHz = new StringBuilder(); 546fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande scans24GHz.append(" \n{").append(result.BSSID); 547fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (bssid != null && result.BSSID.equals(bssid)) scans24GHz.append("*"); 548fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande scans24GHz.append("=").append(result.frequency); 549fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande scans24GHz.append(",").append(result.level); 550fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande scans24GHz.append("}"); 551fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande n24++; 552d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 553d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 554fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 555fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append(" ["); 556fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (num24 > 0) { 557fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append("(").append(num24).append(")"); 558fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (n24 <= 4) { 559fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (scans24GHz != null) { 560fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append(scans24GHz.toString()); 561fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 562fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } else { 563fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append("max=").append(rssi24); 564fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (scans24GHz != null) { 565fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append(",").append(scans24GHz.toString()); 566d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 567d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 568fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 569fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append(";"); 570fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (num5 > 0) { 571fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append("(").append(num5).append(")"); 572fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (n5 <= 4) { 573fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (scans5GHz != null) { 574fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append(scans5GHz.toString()); 575fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } 576fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande } else { 577fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append("max=").append(rssi5); 578fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (scans5GHz != null) { 579fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append(",").append(scans5GHz.toString()); 580d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 581d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 582d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 583fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (numBlackListed > 0) 584fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append("!").append(numBlackListed); 585fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande visibility.append("]"); 586d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 587d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return visibility.toString(); 588d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 589d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 590d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 591d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Return whether this is the active connection. 592d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * For ephemeral connections (networkId is invalid), this returns false if the network is 593d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * disconnected. 594d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 595d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public boolean isActive() { 596d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return mNetworkInfo != null && 597d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk (networkId != WifiConfiguration.INVALID_NETWORK_ID || 598d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mNetworkInfo.getState() != State.DISCONNECTED); 599d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 600d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 601d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public boolean isConnectable() { 602d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return getLevel() != -1 && getDetailedState() == null; 603d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 604d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 605d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public boolean isEphemeral() { 606c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele return mInfo != null && mInfo.isEphemeral() && 607c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele mNetworkInfo != null && mNetworkInfo.getState() != State.DISCONNECTED; 608d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 609d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 6105b7352cf1bdcede7d018f9bb94667593b11b77c0Vinit Deshpande public boolean isPasspoint() { 6115b7352cf1bdcede7d018f9bb94667593b11b77c0Vinit Deshpande return mConfig != null && mConfig.isPasspoint(); 6125b7352cf1bdcede7d018f9bb94667593b11b77c0Vinit Deshpande } 6135b7352cf1bdcede7d018f9bb94667593b11b77c0Vinit Deshpande 6145a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills /** 6155a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills * Return whether the given {@link WifiInfo} is for this access point. 6165a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills * If the current AP does not have a network Id then the config is used to 6175a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills * match based on SSID and security. 6185a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills */ 6195a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills private boolean isInfoForThisAccessPoint(WifiConfiguration config, WifiInfo info) { 6205b7352cf1bdcede7d018f9bb94667593b11b77c0Vinit Deshpande if (isPasspoint() == false && networkId != WifiConfiguration.INVALID_NETWORK_ID) { 621d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return networkId == info.getNetworkId(); 6225a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills } else if (config != null) { 6235a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills return matches(config); 6245a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills } 6255a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills else { 626d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // Might be an ephemeral connection with no WifiConfiguration. Try matching on SSID. 627d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // (Note that we only do this if the WifiConfiguration explicitly equals INVALID). 628d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // TODO: Handle hex string SSIDs. 629d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return ssid.equals(removeDoubleQuotes(info.getSSID())); 630d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 631d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 632d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 633d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public boolean isSaved() { 634d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return networkId != WifiConfiguration.INVALID_NETWORK_ID; 635d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 636d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 637d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public Object getTag() { 638d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return mTag; 639d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 640d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 641d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public void setTag(Object tag) { 642d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mTag = tag; 643d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 644d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 645d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk /** 646d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Generate and save a default wifiConfiguration with common values. 647d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk * Can only be called for unsecured networks. 648d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk */ 649d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public void generateOpenNetworkConfig() { 650d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (security != SECURITY_NONE) 651d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk throw new IllegalStateException(); 652d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mConfig != null) 653d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return; 654d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mConfig = new WifiConfiguration(); 655d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mConfig.SSID = AccessPoint.convertToQuotedString(ssid); 656d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mConfig.allowedKeyManagement.set(KeyMgmt.NONE); 657d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 658d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 659d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk void loadConfig(WifiConfiguration config) { 660fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande if (config.isPasspoint()) 661fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande ssid = config.providerFriendlyName; 662fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande else 663fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID)); 664fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 66560a82ffe457942bf9a106b406b14d10d09ba57efJason Monk bssid = config.BSSID; 666d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk security = getSecurity(config); 667d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk networkId = config.networkId; 668d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mConfig = config; 669d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 670d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 671fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande private void initWithScanResult(ScanResult result) { 672d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk ssid = result.SSID; 67360a82ffe457942bf9a106b406b14d10d09ba57efJason Monk bssid = result.BSSID; 674d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk security = getSecurity(result); 675d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (security == SECURITY_PSK) 676d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk pskType = getPskType(result); 677d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mRssi = result.level; 678fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mSeen = result.timestamp; 679d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 680d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 681d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public void saveWifiState(Bundle savedState) { 682fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (ssid != null) savedState.putString(KEY_SSID, getSsidStr()); 683fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande savedState.putInt(KEY_SECURITY, security); 684fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande savedState.putInt(KEY_PSKTYPE, pskType); 685fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (mConfig != null) savedState.putParcelable(KEY_CONFIG, mConfig); 686d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk savedState.putParcelable(KEY_WIFIINFO, mInfo); 687fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande savedState.putParcelableArrayList(KEY_SCANRESULTCACHE, 688fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande new ArrayList<ScanResult>(mScanResultCache.snapshot().values())); 689d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mNetworkInfo != null) { 690d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk savedState.putParcelable(KEY_NETWORKINFO, mNetworkInfo); 691d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 692d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 693d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 694d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public void setListener(AccessPointListener listener) { 695d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mAccessPointListener = listener; 696d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 697d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 698d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk boolean update(ScanResult result) { 6995a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills if (matches(result)) { 700fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande /* Update the LRU timestamp, if BSSID exists */ 701fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mScanResultCache.get(result.BSSID); 702fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 703fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande /* Add or update the scan result for the BSSID */ 704d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mScanResultCache.put(result.BSSID, result); 705d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 706fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int oldLevel = getLevel(); 707fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int oldRssi = getRssi(); 708fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mSeen = getSeen(); 709fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mRssi = (getRssi() + oldRssi)/2; 710fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande int newLevel = getLevel(); 711fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 712fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande if (newLevel > 0 && newLevel != oldLevel && mAccessPointListener != null) { 713fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande mAccessPointListener.onLevelChanged(this); 714d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 715d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk // This flag only comes from scans, is not easily saved in config 716d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (security == SECURITY_PSK) { 717d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk pskType = getPskType(result); 718d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 719fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 720d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mAccessPointListener != null) { 721d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mAccessPointListener.onAccessPointChanged(this); 722d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 723fcd4612f70bb22e11bf776c76afc45b03a5b026cVinit Deshpande 724d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return true; 725d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 726d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return false; 727d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 728d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 7295a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills boolean update(WifiConfiguration config, WifiInfo info, NetworkInfo networkInfo) { 730d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk boolean reorder = false; 7315a42db2e9c4ce5700a321b9c2aa22189598ceeafMitchell Wills if (info != null && isInfoForThisAccessPoint(config, info)) { 732d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk reorder = (mInfo == null); 733d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mRssi = info.getRssi(); 734d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mInfo = info; 735d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mNetworkInfo = networkInfo; 736d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mAccessPointListener != null) { 737d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mAccessPointListener.onAccessPointChanged(this); 738d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 739d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (mInfo != null) { 740d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk reorder = true; 741d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mInfo = null; 742d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mNetworkInfo = null; 743d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (mAccessPointListener != null) { 744d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk mAccessPointListener.onAccessPointChanged(this); 745d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 746d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 747d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return reorder; 748d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 749d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 750fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande void update(WifiConfiguration config) { 751fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande mConfig = config; 752dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande networkId = config.networkId; 753dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande if (mAccessPointListener != null) { 754dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande mAccessPointListener.onAccessPointChanged(this); 755dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } 756fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande } 757c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele 7580775a98e2095224d4b1618a4739543ce6e7f32ecSanket Padawe void setRssi(int rssi) { 7590775a98e2095224d4b1618a4739543ce6e7f32ecSanket Padawe mRssi = rssi; 7600775a98e2095224d4b1618a4739543ce6e7f32ecSanket Padawe } 7610775a98e2095224d4b1618a4739543ce6e7f32ecSanket Padawe 762d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static String getSummary(Context context, String ssid, DetailedState state, 763fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande boolean isEphemeral, String passpointProvider) { 764dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande if (state == DetailedState.CONNECTED && ssid == null) { 765fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande if (TextUtils.isEmpty(passpointProvider) == false) { 766dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande // Special case for connected + passpoint networks. 767fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande String format = context.getString(R.string.connected_via_passpoint); 768fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande return String.format(format, passpointProvider); 769dcf00c9d0f6f985aef186cfe5d7b63761e2f8104Vinit Deshpande } else if (isEphemeral) { 770fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande // Special case for connected + ephemeral networks. 771fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande return context.getString(R.string.connected_via_wfa); 772fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande } 773d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 774d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 7757094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe // Case when there is wifi connected without internet connectivity. 7767094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe final ConnectivityManager cm = (ConnectivityManager) 7777094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe context.getSystemService(Context.CONNECTIVITY_SERVICE); 7787094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe if (state == DetailedState.CONNECTED) { 7797094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe IWifiManager wifiManager = IWifiManager.Stub.asInterface( 7807094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe ServiceManager.getService(Context.WIFI_SERVICE)); 7817094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe Network nw; 7827094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe 7837094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe try { 7847094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe nw = wifiManager.getCurrentNetwork(); 7857094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } catch (RemoteException e) { 7867094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe nw = null; 7877094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 7887094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe NetworkCapabilities nc = cm.getNetworkCapabilities(nw); 7897094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe if (nc != null && !nc.hasCapability(nc.NET_CAPABILITY_VALIDATED)) { 7907094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe return context.getString(R.string.wifi_connected_no_internet); 7917094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 7927094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 7937094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe 794d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk String[] formats = context.getResources().getStringArray((ssid == null) 795d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk ? R.array.wifi_status : R.array.wifi_status_with_ssid); 796d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk int index = state.ordinal(); 797d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 798d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (index >= formats.length || formats[index].length() == 0) { 7993e9e5fa66e222efb10125a08dc9e6ae359d9c1ccSanket Padawe return ""; 800d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 801d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return String.format(formats[index], ssid); 802d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 803d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 804d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static String getSummary(Context context, DetailedState state, boolean isEphemeral) { 805fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande return getSummary(context, null, state, isEphemeral, null); 806fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande } 807fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande 808fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande public static String getSummary(Context context, DetailedState state, boolean isEphemeral, 809fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande String passpointProvider) { 810fc40600e30e281712f6c2fc899fc3894b8ad0050Vinit Deshpande return getSummary(context, null, state, isEphemeral, passpointProvider); 811d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 812d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 813d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static String convertToQuotedString(String string) { 814d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return "\"" + string + "\""; 815d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 816d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 817d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static int getPskType(ScanResult result) { 818d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk boolean wpa = result.capabilities.contains("WPA-PSK"); 819d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk boolean wpa2 = result.capabilities.contains("WPA2-PSK"); 820d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (wpa2 && wpa) { 821d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return PSK_WPA_WPA2; 822d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (wpa2) { 823d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return PSK_WPA2; 824d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (wpa) { 825d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return PSK_WPA; 826d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else { 827d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk Log.w(TAG, "Received abnormal flag string: " + result.capabilities); 828d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return PSK_UNKNOWN; 829d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 830d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 831d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 832d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk private static int getSecurity(ScanResult result) { 833d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (result.capabilities.contains("WEP")) { 834d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return SECURITY_WEP; 835d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (result.capabilities.contains("PSK")) { 836d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return SECURITY_PSK; 837d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (result.capabilities.contains("EAP")) { 838d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return SECURITY_EAP; 839d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 840d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return SECURITY_NONE; 841d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 842d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 843d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk static int getSecurity(WifiConfiguration config) { 844d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { 845d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return SECURITY_PSK; 846d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 847d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) || 848d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { 849d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return SECURITY_EAP; 850d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 851d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return (config.wepKeys[0] != null) ? SECURITY_WEP : SECURITY_NONE; 852d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 853d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 854d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public static String securityToString(int security, int pskType) { 855d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (security == SECURITY_WEP) { 856d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return "WEP"; 857d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (security == SECURITY_PSK) { 858d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if (pskType == PSK_WPA) { 859d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return "WPA"; 860d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (pskType == PSK_WPA2) { 861d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return "WPA2"; 862d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (pskType == PSK_WPA_WPA2) { 863d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return "WPA_WPA2"; 864d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 865d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return "PSK"; 866d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } else if (security == SECURITY_EAP) { 867d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return "EAP"; 868d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 869d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return "NONE"; 870d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 871d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 872d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk static String removeDoubleQuotes(String string) { 8732b51cc30d523cce3609a498c466364caf3ce504eJason Monk if (TextUtils.isEmpty(string)) { 8742b51cc30d523cce3609a498c466364caf3ce504eJason Monk return ""; 8752b51cc30d523cce3609a498c466364caf3ce504eJason Monk } 876d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk int length = string.length(); 877d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk if ((length > 1) && (string.charAt(0) == '"') 878d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk && (string.charAt(length - 1) == '"')) { 879d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return string.substring(1, length - 1); 880d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 881d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk return string; 882d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 883d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk 884d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk public interface AccessPointListener { 885d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk void onAccessPointChanged(AccessPoint accessPoint); 886d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk void onLevelChanged(AccessPoint accessPoint); 887d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk } 888d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk} 889