| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.net.wifi; |
| |
| import android.os.Parcelable; |
| import android.os.Parcel; |
| import android.net.NetworkInfo.DetailedState; |
| |
| import java.util.EnumMap; |
| |
| /** |
| * Describes the state of any Wifi connection that is active or |
| * is in the process of being set up. |
| */ |
| public class WifiInfo implements Parcelable { |
| /** |
| * This is the map described in the Javadoc comment above. The positions |
| * of the elements of the array must correspond to the ordinal values |
| * of <code>DetailedState</code>. |
| */ |
| private static final EnumMap<SupplicantState, DetailedState> stateMap = |
| new EnumMap<SupplicantState, DetailedState>(SupplicantState.class); |
| |
| static { |
| stateMap.put(SupplicantState.DISCONNECTED, DetailedState.DISCONNECTED); |
| stateMap.put(SupplicantState.INACTIVE, DetailedState.IDLE); |
| stateMap.put(SupplicantState.SCANNING, DetailedState.SCANNING); |
| stateMap.put(SupplicantState.ASSOCIATING, DetailedState.CONNECTING); |
| stateMap.put(SupplicantState.ASSOCIATED, DetailedState.CONNECTING); |
| stateMap.put(SupplicantState.FOUR_WAY_HANDSHAKE, DetailedState.AUTHENTICATING); |
| stateMap.put(SupplicantState.GROUP_HANDSHAKE, DetailedState.AUTHENTICATING); |
| stateMap.put(SupplicantState.COMPLETED, DetailedState.OBTAINING_IPADDR); |
| stateMap.put(SupplicantState.DORMANT, DetailedState.DISCONNECTED); |
| stateMap.put(SupplicantState.UNINITIALIZED, DetailedState.IDLE); |
| stateMap.put(SupplicantState.INVALID, DetailedState.FAILED); |
| } |
| |
| private SupplicantState mSupplicantState; |
| private String mBSSID; |
| private String mSSID; |
| private int mNetworkId; |
| private boolean mHiddenSSID; |
| /** Received Signal Strength Indicator */ |
| private int mRssi; |
| |
| /** Link speed in Mbps */ |
| public static final String LINK_SPEED_UNITS = "Mbps"; |
| private int mLinkSpeed; |
| |
| private int mIpAddress; |
| |
| private String mMacAddress; |
| |
| WifiInfo() { |
| mSSID = null; |
| mBSSID = null; |
| mNetworkId = -1; |
| mSupplicantState = SupplicantState.UNINITIALIZED; |
| mRssi = -9999; |
| mLinkSpeed = -1; |
| mIpAddress = 0; |
| mHiddenSSID = false; |
| } |
| |
| void setSSID(String SSID) { |
| mSSID = SSID; |
| // network is considered not hidden by default |
| mHiddenSSID = false; |
| } |
| |
| /** |
| * Returns the service set identifier (SSID) of the current 802.11 network. |
| * If the SSID is an ASCII string, it will be returned surrounded by double |
| * quotation marks.Otherwise, it is returned as a string of hex digits. The |
| * SSID may be {@code null} if there is no network currently connected. |
| * @return the SSID |
| */ |
| public String getSSID() { |
| return mSSID; |
| } |
| |
| void setBSSID(String BSSID) { |
| mBSSID = BSSID; |
| } |
| |
| /** |
| * Return the basic service set identifier (BSSID) of the current access point. |
| * The BSSID may be {@code null} if there is no network currently connected. |
| * @return the BSSID, in the form of a six-byte MAC address: {@code XX:XX:XX:XX:XX:XX} |
| */ |
| public String getBSSID() { |
| return mBSSID; |
| } |
| |
| /** |
| * Returns the received signal strength indicator of the current 802.11 |
| * network. |
| * <p><strong>This is not normalized, but should be!</strong></p> |
| * @return the RSSI, in the range ??? to ??? |
| */ |
| public int getRssi() { |
| return mRssi; |
| } |
| |
| void setRssi(int rssi) { |
| mRssi = rssi; |
| } |
| |
| /** |
| * Returns the current link speed in {@link #LINK_SPEED_UNITS}. |
| * @return the link speed. |
| * @see #LINK_SPEED_UNITS |
| */ |
| public int getLinkSpeed() { |
| return mLinkSpeed; |
| } |
| |
| void setLinkSpeed(int linkSpeed) { |
| this.mLinkSpeed = linkSpeed; |
| } |
| |
| /** |
| * Record the MAC address of the WLAN interface |
| * @param macAddress the MAC address in {@code XX:XX:XX:XX:XX:XX} form |
| */ |
| void setMacAddress(String macAddress) { |
| this.mMacAddress = macAddress; |
| } |
| |
| public String getMacAddress() { |
| return mMacAddress; |
| } |
| |
| void setNetworkId(int id) { |
| mNetworkId = id; |
| } |
| |
| /** |
| * Each configured network has a unique small integer ID, used to identify |
| * the network when performing operations on the supplicant. This method |
| * returns the ID for the currently connected network. |
| * @return the network ID, or -1 if there is no currently connected network |
| */ |
| public int getNetworkId() { |
| return mNetworkId; |
| } |
| |
| /** |
| * Return the detailed state of the supplicant's negotiation with an |
| * access point, in the form of a {@link SupplicantState SupplicantState} object. |
| * @return the current {@link SupplicantState SupplicantState} |
| */ |
| public SupplicantState getSupplicantState() { |
| return mSupplicantState; |
| } |
| |
| void setSupplicantState(SupplicantState state) { |
| mSupplicantState = state; |
| } |
| |
| void setIpAddress(int address) { |
| mIpAddress = address; |
| } |
| |
| public int getIpAddress() { |
| return mIpAddress; |
| } |
| |
| /** |
| * @return {@code true} if this network does not broadcast its SSID, so an |
| * SSID-specific probe request must be used for scans. |
| */ |
| public boolean getHiddenSSID() { |
| return mHiddenSSID; |
| } |
| |
| /** {@hide} */ |
| public void setHiddenSSID(boolean hiddenSSID) { |
| mHiddenSSID = hiddenSSID; |
| } |
| |
| /** |
| * Map a supplicant state into a fine-grained network connectivity state. |
| * @param suppState the supplicant state |
| * @return the corresponding {@link DetailedState} |
| */ |
| public static DetailedState getDetailedStateOf(SupplicantState suppState) { |
| return stateMap.get(suppState); |
| } |
| |
| /** |
| * Set the <code>SupplicantState</code> from the string name |
| * of the state. |
| * @param stateName the name of the state, as a <code>String</code> returned |
| * in an event sent by {@code wpa_supplicant}. |
| */ |
| void setSupplicantState(String stateName) { |
| mSupplicantState = valueOf(stateName); |
| } |
| |
| static SupplicantState valueOf(String stateName) { |
| if ("4WAY_HANDSHAKE".equalsIgnoreCase(stateName)) |
| return SupplicantState.FOUR_WAY_HANDSHAKE; |
| else { |
| try { |
| return SupplicantState.valueOf(stateName.toUpperCase()); |
| } catch (IllegalArgumentException e) { |
| return SupplicantState.INVALID; |
| } |
| } |
| } |
| |
| @Override |
| public String toString() { |
| StringBuffer sb = new StringBuffer(); |
| String none = "<none>"; |
| |
| sb.append("SSID: ").append(mSSID == null ? none : mSSID). |
| append(", BSSID: ").append(mBSSID == null ? none : mBSSID). |
| append(", MAC: ").append(mMacAddress == null ? none : mMacAddress). |
| append(", Supplicant state: "). |
| append(mSupplicantState == null ? none : mSupplicantState). |
| append(", RSSI: ").append(mRssi). |
| append(", Link speed: ").append(mLinkSpeed). |
| append(", Net ID: ").append(mNetworkId); |
| |
| return sb.toString(); |
| } |
| |
| /** Implement the Parcelable interface {@hide} */ |
| public int describeContents() { |
| return 0; |
| } |
| |
| /** Implement the Parcelable interface {@hide} */ |
| public void writeToParcel(Parcel dest, int flags) { |
| dest.writeInt(mNetworkId); |
| dest.writeInt(mRssi); |
| dest.writeInt(mLinkSpeed); |
| dest.writeInt(mIpAddress); |
| dest.writeString(getSSID()); |
| dest.writeString(mBSSID); |
| dest.writeString(mMacAddress); |
| mSupplicantState.writeToParcel(dest, flags); |
| } |
| |
| /** Implement the Parcelable interface {@hide} */ |
| public static final Creator<WifiInfo> CREATOR = |
| new Creator<WifiInfo>() { |
| public WifiInfo createFromParcel(Parcel in) { |
| WifiInfo info = new WifiInfo(); |
| info.setNetworkId(in.readInt()); |
| info.setRssi(in.readInt()); |
| info.setLinkSpeed(in.readInt()); |
| info.setIpAddress(in.readInt()); |
| info.setSSID(in.readString()); |
| info.mBSSID = in.readString(); |
| info.mMacAddress = in.readString(); |
| info.mSupplicantState = SupplicantState.CREATOR.createFromParcel(in); |
| return info; |
| } |
| |
| public WifiInfo[] newArray(int size) { |
| return new WifiInfo[size]; |
| } |
| }; |
| } |