19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.wifi; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.NetworkInfo.DetailedState; 22124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwaltimport android.net.NetworkUtils; 23b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport android.text.TextUtils; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwaltimport java.net.InetAddress; 26124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwaltimport java.net.Inet6Address; 27124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwaltimport java.net.UnknownHostException; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.EnumMap; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Describes the state of any Wifi connection that is active or 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is in the process of being set up. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiInfo implements Parcelable { 35b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff private static final String TAG = "WifiInfo"; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the map described in the Javadoc comment above. The positions 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the elements of the array must correspond to the ordinal values 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of <code>DetailedState</code>. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final EnumMap<SupplicantState, DetailedState> stateMap = 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new EnumMap<SupplicantState, DetailedState>(SupplicantState.class); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.DISCONNECTED, DetailedState.DISCONNECTED); 46319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff stateMap.put(SupplicantState.INTERFACE_DISABLED, DetailedState.DISCONNECTED); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.INACTIVE, DetailedState.IDLE); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.SCANNING, DetailedState.SCANNING); 49319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff stateMap.put(SupplicantState.AUTHENTICATING, DetailedState.CONNECTING); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.ASSOCIATING, DetailedState.CONNECTING); 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.ASSOCIATED, DetailedState.CONNECTING); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.FOUR_WAY_HANDSHAKE, DetailedState.AUTHENTICATING); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.GROUP_HANDSHAKE, DetailedState.AUTHENTICATING); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.COMPLETED, DetailedState.OBTAINING_IPADDR); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.DORMANT, DetailedState.DISCONNECTED); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.UNINITIALIZED, DetailedState.IDLE); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.INVALID, DetailedState.FAILED); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SupplicantState mSupplicantState; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mBSSID; 62b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff private WifiSsid mWifiSsid; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNetworkId; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHiddenSSID; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Received Signal Strength Indicator */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRssi; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Link speed in Mbps */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LINK_SPEED_UNITS = "Mbps"; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLinkSpeed; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt private InetAddress mIpAddress; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mMacAddress; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey /** 769f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey * Flag indicating that AP has hinted that upstream connection is metered, 779f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey * and sensitive to heavy data transfers. 789f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey */ 799f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey private boolean mMeteredHint; 809f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WifiInfo() { 82b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff mWifiSsid = null; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBSSID = null; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNetworkId = -1; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSupplicantState = SupplicantState.UNINITIALIZED; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRssi = -9999; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLinkSpeed = -1; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHiddenSSID = false; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 913550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy /** 923550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * Copy constructor 933550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * @hide 943550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy */ 953550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy public WifiInfo(WifiInfo source) { 963550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy if (source != null) { 973550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mSupplicantState = source.mSupplicantState; 983550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mBSSID = source.mBSSID; 99b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff mWifiSsid = source.mWifiSsid; 1003550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mNetworkId = source.mNetworkId; 1013550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mHiddenSSID = source.mHiddenSSID; 1023550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mRssi = source.mRssi; 1033550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mLinkSpeed = source.mLinkSpeed; 1043550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mIpAddress = source.mIpAddress; 1053550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mMacAddress = source.mMacAddress; 1069f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey mMeteredHint = source.mMeteredHint; 1073550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy } 1083550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy } 1093550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy 110b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff void setSSID(WifiSsid wifiSsid) { 111b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff mWifiSsid = wifiSsid; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // network is considered not hidden by default 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHiddenSSID = false; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the service set identifier (SSID) of the current 802.11 network. 118b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * If the SSID can be decoded as UTF-8, it will be returned surrounded by double 119b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * quotation marks. Otherwise, it is returned as a string of hex digits. The 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SSID may be {@code null} if there is no network currently connected. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the SSID 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getSSID() { 124b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (mWifiSsid != null) { 125b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff String unicode = mWifiSsid.toString(); 126b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (!TextUtils.isEmpty(unicode)) { 127b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return "\"" + unicode + "\""; 128b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } else { 129b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return mWifiSsid.getHexString(); 130b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 131b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 132b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return WifiSsid.NONE; 133b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 134b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff 135b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff /** @hide */ 136b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff public WifiSsid getWifiSsid() { 137b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return mWifiSsid; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setBSSID(String BSSID) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBSSID = BSSID; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the basic service set identifier (BSSID) of the current access point. 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The BSSID may be {@code null} if there is no network currently connected. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the BSSID, in the form of a six-byte MAC address: {@code XX:XX:XX:XX:XX:XX} 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getBSSID() { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBSSID; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the received signal strength indicator of the current 802.11 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network. 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This is not normalized, but should be!</strong></p> 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the RSSI, in the range ??? to ??? 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRssi() { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRssi; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setRssi(int rssi) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRssi = rssi; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current link speed in {@link #LINK_SPEED_UNITS}. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the link speed. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #LINK_SPEED_UNITS 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLinkSpeed() { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLinkSpeed; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setLinkSpeed(int linkSpeed) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mLinkSpeed = linkSpeed; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Record the MAC address of the WLAN interface 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param macAddress the MAC address in {@code XX:XX:XX:XX:XX:XX} form 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setMacAddress(String macAddress) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mMacAddress = macAddress; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getMacAddress() { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMacAddress; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey /** {@hide} */ 1939f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey public void setMeteredHint(boolean meteredHint) { 1949f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey mMeteredHint = meteredHint; 1959f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey } 1969f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey 1979f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey /** {@hide} */ 1989f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey public boolean getMeteredHint() { 1999f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey return mMeteredHint; 2009f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey } 2019f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setNetworkId(int id) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNetworkId = id; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each configured network has a unique small integer ID, used to identify 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the network when performing operations on the supplicant. This method 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns the ID for the currently connected network. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the network ID, or -1 if there is no currently connected network 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getNetworkId() { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNetworkId; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the detailed state of the supplicant's negotiation with an 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * access point, in the form of a {@link SupplicantState SupplicantState} object. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current {@link SupplicantState SupplicantState} 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SupplicantState getSupplicantState() { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSupplicantState; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setSupplicantState(SupplicantState state) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSupplicantState = state; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt void setInetAddress(InetAddress address) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIpAddress = address; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIpAddress() { 234124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt if (mIpAddress == null || mIpAddress instanceof Inet6Address) return 0; 235124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt return NetworkUtils.inetAddressToInt(mIpAddress); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if this network does not broadcast its SSID, so an 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SSID-specific probe request must be used for scans. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getHiddenSSID() { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHiddenSSID; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setHiddenSSID(boolean hiddenSSID) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHiddenSSID = hiddenSSID; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Map a supplicant state into a fine-grained network connectivity state. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param suppState the supplicant state 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the corresponding {@link DetailedState} 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static DetailedState getDetailedStateOf(SupplicantState suppState) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stateMap.get(suppState); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the <code>SupplicantState</code> from the string name 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the state. 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param stateName the name of the state, as a <code>String</code> returned 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in an event sent by {@code wpa_supplicant}. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setSupplicantState(String stateName) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSupplicantState = valueOf(stateName); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SupplicantState valueOf(String stateName) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("4WAY_HANDSHAKE".equalsIgnoreCase(stateName)) 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SupplicantState.FOUR_WAY_HANDSHAKE; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SupplicantState.valueOf(stateName.toUpperCase()); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalArgumentException e) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SupplicantState.INVALID; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey /** {@hide} */ 2839f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey public static String removeDoubleQuotes(String string) { 28400a10a1494954d124e1b11bc1ba3128e47b8ffbdIrfan Sheriff if (string == null) return null; 2859f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey final int length = string.length(); 2869f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) { 2879f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey return string.substring(1, length - 1); 2889f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey } 2899f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey return string; 2909f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey } 2919f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer sb = new StringBuffer(); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String none = "<none>"; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 297b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff sb.append("SSID: ").append(mWifiSsid == null ? WifiSsid.NONE : mWifiSsid). 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", BSSID: ").append(mBSSID == null ? none : mBSSID). 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", MAC: ").append(mMacAddress == null ? none : mMacAddress). 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", Supplicant state: "). 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(mSupplicantState == null ? none : mSupplicantState). 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", RSSI: ").append(mRssi). 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", Link speed: ").append(mLinkSpeed). 3049f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey append(", Net ID: ").append(mNetworkId). 3059f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey append(", Metered hint: ").append(mMeteredHint); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mNetworkId); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mRssi); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mLinkSpeed); 320124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt if (mIpAddress != null) { 321124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt dest.writeByte((byte)1); 322124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt dest.writeByteArray(mIpAddress.getAddress()); 323124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt } else { 324124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt dest.writeByte((byte)0); 325124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt } 326b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (mWifiSsid != null) { 327b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff dest.writeInt(1); 328b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff mWifiSsid.writeToParcel(dest, flags); 329b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } else { 330b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff dest.writeInt(0); 331b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mBSSID); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mMacAddress); 3349f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey dest.writeInt(mMeteredHint ? 1 : 0); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSupplicantState.writeToParcel(dest, flags); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<WifiInfo> CREATOR = 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Creator<WifiInfo>() { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo createFromParcel(Parcel in) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WifiInfo info = new WifiInfo(); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.setNetworkId(in.readInt()); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.setRssi(in.readInt()); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.setLinkSpeed(in.readInt()); 346124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt if (in.readByte() == 1) { 347124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt try { 348124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt info.setInetAddress(InetAddress.getByAddress(in.createByteArray())); 349124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt } catch (UnknownHostException e) {} 350124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt } 351b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (in.readInt() == 1) { 352b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff info.mWifiSsid = WifiSsid.CREATOR.createFromParcel(in); 353b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.mBSSID = in.readString(); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.mMacAddress = in.readString(); 3569f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey info.mMeteredHint = in.readInt() != 0; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.mSupplicantState = SupplicantState.CREATOR.createFromParcel(in); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return info; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo[] newArray(int size) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiInfo[size]; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 366