/* * 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]; } }; }