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;
264717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwaltimport java.net.Inet4Address;
27124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwaltimport java.net.UnknownHostException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.EnumMap;
29ee00b353a4070a9ddbdf67fa715dc84e7282f7c2Elliott Hughesimport java.util.Locale;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Describes the state of any Wifi connection that is active or
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is in the process of being set up.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiInfo implements Parcelable {
36b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    private static final String TAG = "WifiInfo";
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is the map described in the Javadoc comment above. The positions
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the elements of the array must correspond to the ordinal values
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of <code>DetailedState</code>.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final EnumMap<SupplicantState, DetailedState> stateMap =
432ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            new EnumMap<SupplicantState, DetailedState>(SupplicantState.class);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov    /**
46408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov     * Default MAC address reported to a client that does not have the
47408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov     * android.permission.LOCAL_MAC_ADDRESS permission.
48408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov     *
49408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov     * @hide
50408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov     */
51408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov    public static final String DEFAULT_MAC_ADDRESS = "02:00:00:00:00:00";
52408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.DISCONNECTED, DetailedState.DISCONNECTED);
55319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff        stateMap.put(SupplicantState.INTERFACE_DISABLED, DetailedState.DISCONNECTED);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.INACTIVE, DetailedState.IDLE);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.SCANNING, DetailedState.SCANNING);
58319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff        stateMap.put(SupplicantState.AUTHENTICATING, DetailedState.CONNECTING);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.ASSOCIATING, DetailedState.CONNECTING);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.ASSOCIATED, DetailedState.CONNECTING);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.FOUR_WAY_HANDSHAKE, DetailedState.AUTHENTICATING);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.GROUP_HANDSHAKE, DetailedState.AUTHENTICATING);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.COMPLETED, DetailedState.OBTAINING_IPADDR);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.DORMANT, DetailedState.DISCONNECTED);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.UNINITIALIZED, DetailedState.IDLE);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stateMap.put(SupplicantState.INVALID, DetailedState.FAILED);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SupplicantState mSupplicantState;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mBSSID;
71b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    private WifiSsid mWifiSsid;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNetworkId;
73111fa0274d1d6620f9634783585387f3b773949evandwalle
74111fa0274d1d6620f9634783585387f3b773949evandwalle    /** @hide **/
75111fa0274d1d6620f9634783585387f3b773949evandwalle    public static final int INVALID_RSSI = -127;
76111fa0274d1d6620f9634783585387f3b773949evandwalle
77111fa0274d1d6620f9634783585387f3b773949evandwalle    /** @hide **/
78111fa0274d1d6620f9634783585387f3b773949evandwalle    public static final int MIN_RSSI = -126;
79111fa0274d1d6620f9634783585387f3b773949evandwalle
80111fa0274d1d6620f9634783585387f3b773949evandwalle    /** @hide **/
81111fa0274d1d6620f9634783585387f3b773949evandwalle    public static final int MAX_RSSI = 200;
82111fa0274d1d6620f9634783585387f3b773949evandwalle
83111fa0274d1d6620f9634783585387f3b773949evandwalle
842ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
852ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * Received Signal Strength Indicator
862ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRssi;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
892ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
902ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * Link speed in Mbps
912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String LINK_SPEED_UNITS = "Mbps";
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mLinkSpeed;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * Frequency in MHz
972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
9870a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme    public static final String FREQUENCY_UNITS = "MHz";
9970a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme    private int mFrequency;
10070a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme
101124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt    private InetAddress mIpAddress;
102408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov    private String mMacAddress = DEFAULT_MAC_ADDRESS;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
104c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele    private boolean mEphemeral;
105c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele
1069f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    /**
1072ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1082ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1092ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public long txBad;
1102ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1112ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1122ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1132ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public long txRetries;
1142ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1152ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1162ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1172ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public long txSuccess;
1182ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1192ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1202ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1212ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public long rxSuccess;
1222ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1232ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1242ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1252ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public double txBadRate;
1262ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1272ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1282ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1292ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public double txRetriesRate;
1302ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1312ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1322ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1332ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public double txSuccessRate;
1342ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1352ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1362ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1372ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public double rxSuccessRate;
1382ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
1392ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1402ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1412ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1422ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public int badRssiCount;
1432ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
1442ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
1452ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
1462ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
147d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    public int linkStuckCount;
148d524c78d9358e2fa1e67124468cffa5284870c62vandwalle
149d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    /**
150d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * @hide
151d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     */
1522ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public int lowRssiCount;
1532ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
1542ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
15572d87d99b02c6523a4a3cb83e0d5cf6c8e01075fvandwalle     * @hide
1562ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1572ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public int score;
1582ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
1592ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
160111fa0274d1d6620f9634783585387f3b773949evandwalle     * TODO: get actual timestamp and calculate true rates
161111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
1622ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
1632ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public void updatePacketRates(WifiLinkLayerStats stats) {
1642ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        if (stats != null) {
1652ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            long txgood = stats.txmpdu_be + stats.txmpdu_bk + stats.txmpdu_vi + stats.txmpdu_vo;
1662ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            long txretries = stats.retries_be + stats.retries_bk
1672ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                    + stats.retries_vi + stats.retries_vo;
1682ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            long rxgood = stats.rxmpdu_be + stats.rxmpdu_bk + stats.rxmpdu_vi + stats.rxmpdu_vo;
1692ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            long txbad = stats.lostmpdu_be + stats.lostmpdu_bk
1702ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                    + stats.lostmpdu_vi + stats.lostmpdu_vo;
1712ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
172d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle            if (txBad <= txbad
173d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                    && txSuccess <= txgood
174d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                    && rxSuccess <= rxgood
175d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                    && txRetries <= txretries) {
176d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                txBadRate = (txBadRate * 0.5)
177d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                        + ((double) (txbad - txBad) * 0.5);
178d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                txSuccessRate = (txSuccessRate * 0.5)
179d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                        + ((double) (txgood - txSuccess) * 0.5);
180d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                rxSuccessRate = (rxSuccessRate * 0.5)
181d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                        + ((double) (rxgood - rxSuccess) * 0.5);
182d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                txRetriesRate = (txRetriesRate * 0.5)
183d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                        + ((double) (txretries - txRetries) * 0.5);
184d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle            } else {
185d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                txBadRate = 0;
186d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                txSuccessRate = 0;
187d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                rxSuccessRate = 0;
188d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                txRetriesRate = 0;
189d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle            }
1902ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txBad = txbad;
1912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txSuccess = txgood;
1922ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            rxSuccess = rxgood;
1932ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txRetries = txretries;
1942ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        } else {
195111fa0274d1d6620f9634783585387f3b773949evandwalle            txBad = 0;
1962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txSuccess = 0;
1972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            rxSuccess = 0;
1982ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txRetries = 0;
199111fa0274d1d6620f9634783585387f3b773949evandwalle            txBadRate = 0;
200111fa0274d1d6620f9634783585387f3b773949evandwalle            txSuccessRate = 0;
201111fa0274d1d6620f9634783585387f3b773949evandwalle            rxSuccessRate = 0;
202111fa0274d1d6620f9634783585387f3b773949evandwalle            txRetriesRate = 0;
2032ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        }
2042ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    }
2052ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
206111fa0274d1d6620f9634783585387f3b773949evandwalle
2072ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
208111fa0274d1d6620f9634783585387f3b773949evandwalle     * This function is less powerful and used if the WifiLinkLayerStats API is not implemented
209111fa0274d1d6620f9634783585387f3b773949evandwalle     * at the Wifi HAL
210111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
2119f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey     */
212111fa0274d1d6620f9634783585387f3b773949evandwalle    public void updatePacketRates(long txPackets, long rxPackets) {
213111fa0274d1d6620f9634783585387f3b773949evandwalle        //paranoia
214111fa0274d1d6620f9634783585387f3b773949evandwalle        txBad = 0;
215111fa0274d1d6620f9634783585387f3b773949evandwalle        txRetries = 0;
216111fa0274d1d6620f9634783585387f3b773949evandwalle        txBadRate = 0;
217111fa0274d1d6620f9634783585387f3b773949evandwalle        txRetriesRate = 0;
218d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle        if (txSuccess <= txPackets && rxSuccess <= rxPackets) {
219d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle            txSuccessRate = (txSuccessRate * 0.5)
220d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                    + ((double) (txPackets - txSuccess) * 0.5);
221d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle            rxSuccessRate = (rxSuccessRate * 0.5)
222d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle                    + ((double) (rxPackets - rxSuccess) * 0.5);
223d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle        } else {
224d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle            txBadRate = 0;
225d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle            txRetriesRate = 0;
226d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle        }
227111fa0274d1d6620f9634783585387f3b773949evandwalle        txSuccess = txPackets;
228111fa0274d1d6620f9634783585387f3b773949evandwalle        rxSuccess = rxPackets;
229111fa0274d1d6620f9634783585387f3b773949evandwalle    }
230111fa0274d1d6620f9634783585387f3b773949evandwalle
231111fa0274d1d6620f9634783585387f3b773949evandwalle        /**
232111fa0274d1d6620f9634783585387f3b773949evandwalle         * Flag indicating that AP has hinted that upstream connection is metered,
233111fa0274d1d6620f9634783585387f3b773949evandwalle         * and sensitive to heavy data transfers.
234111fa0274d1d6620f9634783585387f3b773949evandwalle         */
2359f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    private boolean mMeteredHint;
2369f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey
237ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
238ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public WifiInfo() {
239b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        mWifiSsid = null;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBSSID = null;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNetworkId = -1;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSupplicantState = SupplicantState.UNINITIALIZED;
243111fa0274d1d6620f9634783585387f3b773949evandwalle        mRssi = INVALID_RSSI;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLinkSpeed = -1;
24570a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme        mFrequency = -1;
246111fa0274d1d6620f9634783585387f3b773949evandwalle    }
247111fa0274d1d6620f9634783585387f3b773949evandwalle
248111fa0274d1d6620f9634783585387f3b773949evandwalle    /** @hide */
249111fa0274d1d6620f9634783585387f3b773949evandwalle    public void reset() {
250111fa0274d1d6620f9634783585387f3b773949evandwalle        setInetAddress(null);
251111fa0274d1d6620f9634783585387f3b773949evandwalle        setBSSID(null);
252111fa0274d1d6620f9634783585387f3b773949evandwalle        setSSID(null);
253111fa0274d1d6620f9634783585387f3b773949evandwalle        setNetworkId(-1);
254111fa0274d1d6620f9634783585387f3b773949evandwalle        setRssi(INVALID_RSSI);
255111fa0274d1d6620f9634783585387f3b773949evandwalle        setLinkSpeed(-1);
256111fa0274d1d6620f9634783585387f3b773949evandwalle        setFrequency(-1);
257111fa0274d1d6620f9634783585387f3b773949evandwalle        setMeteredHint(false);
258c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele        setEphemeral(false);
25972d87d99b02c6523a4a3cb83e0d5cf6c8e01075fvandwalle        txBad = 0;
260f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        txSuccess = 0;
261f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        rxSuccess = 0;
262f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        txRetries = 0;
263f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        txBadRate = 0;
264f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        txSuccessRate = 0;
265f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        rxSuccessRate = 0;
266f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        txRetriesRate = 0;
267f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        lowRssiCount = 0;
268f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        badRssiCount = 0;
269d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        linkStuckCount = 0;
270f980c53f86affedc51d31c939a1435d26bc0e050vandwalle        score = 0;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2733550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy    /**
2743550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * Copy constructor
2753550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * @hide
2763550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     */
2773550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy    public WifiInfo(WifiInfo source) {
2783550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy        if (source != null) {
2793550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy            mSupplicantState = source.mSupplicantState;
2803550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy            mBSSID = source.mBSSID;
281b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            mWifiSsid = source.mWifiSsid;
2823550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy            mNetworkId = source.mNetworkId;
2833550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy            mRssi = source.mRssi;
2843550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy            mLinkSpeed = source.mLinkSpeed;
28570a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme            mFrequency = source.mFrequency;
2863550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy            mIpAddress = source.mIpAddress;
2873550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy            mMacAddress = source.mMacAddress;
2889f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey            mMeteredHint = source.mMeteredHint;
289c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele            mEphemeral = source.mEphemeral;
2902ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txBad = source.txBad;
2912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txRetries = source.txRetries;
2922ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txSuccess = source.txSuccess;
2932ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            rxSuccess = source.rxSuccess;
2942ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txBadRate = source.txBadRate;
2952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txRetriesRate = source.txRetriesRate;
2962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            txSuccessRate = source.txSuccessRate;
2972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            rxSuccessRate = source.rxSuccessRate;
2982ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            score = source.score;
2992ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            badRssiCount = source.badRssiCount;
3002ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            lowRssiCount = source.lowRssiCount;
301d524c78d9358e2fa1e67124468cffa5284870c62vandwalle            linkStuckCount = source.linkStuckCount;
3023550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy        }
3033550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy    }
3043550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy
305ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
306ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void setSSID(WifiSsid wifiSsid) {
307b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        mWifiSsid = wifiSsid;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the service set identifier (SSID) of the current 802.11 network.
312b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff     * If the SSID can be decoded as UTF-8, it will be returned surrounded by double
313b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff     * quotation marks. Otherwise, it is returned as a string of hex digits. The
314f92fc1ca6541ab833e2f0fc09b57fb95294411c0Jeff Davidson     * SSID may be &lt;unknown ssid&gt; if there is no network currently connected.
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the SSID
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getSSID() {
318b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (mWifiSsid != null) {
319b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            String unicode = mWifiSsid.toString();
320b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            if (!TextUtils.isEmpty(unicode)) {
321b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                return "\"" + unicode + "\"";
322b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            } else {
323f51097c743fc43ac52b343cf1066801d918f6fa0zhangshuxiao                String hex = mWifiSsid.getHexString();
324f51097c743fc43ac52b343cf1066801d918f6fa0zhangshuxiao                return (hex != null) ? hex : WifiSsid.NONE;
325b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            }
326b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
327b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return WifiSsid.NONE;
328b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
329b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
330b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** @hide */
331b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public WifiSsid getWifiSsid() {
332b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return mWifiSsid;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
335ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
336ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void setBSSID(String BSSID) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBSSID = BSSID;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the basic service set identifier (BSSID) of the current access point.
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The BSSID may be {@code null} if there is no network currently connected.
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the BSSID, in the form of a six-byte MAC address: {@code XX:XX:XX:XX:XX:XX}
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getBSSID() {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBSSID;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the received signal strength indicator of the current 802.11
351137ff532ebb062ea513d6ea0dd894b91f373d1a3Brian Williammee     * network, in dBm.
352e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     *
353e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     * <p>Use {@link android.net.wifi.WifiManager#calculateSignalLevel} to convert this number into
354e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     * an absolute signal level which can be displayed to a user.
355e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     *
356e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson     * @return the RSSI.
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRssi() {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRssi;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
362ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
363ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void setRssi(int rssi) {
364111fa0274d1d6620f9634783585387f3b773949evandwalle        if (rssi < INVALID_RSSI)
365111fa0274d1d6620f9634783585387f3b773949evandwalle            rssi = INVALID_RSSI;
366111fa0274d1d6620f9634783585387f3b773949evandwalle        if (rssi > MAX_RSSI)
367111fa0274d1d6620f9634783585387f3b773949evandwalle            rssi = MAX_RSSI;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRssi = rssi;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current link speed in {@link #LINK_SPEED_UNITS}.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the link speed.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #LINK_SPEED_UNITS
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getLinkSpeed() {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLinkSpeed;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
380ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
381ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void setLinkSpeed(int linkSpeed) {
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.mLinkSpeed = linkSpeed;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38670a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme     * Returns the current frequency in {@link #FREQUENCY_UNITS}.
38770a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme     * @return the frequency.
38870a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme     * @see #FREQUENCY_UNITS
38970a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme     */
39070a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme    public int getFrequency() {
39170a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme        return mFrequency;
39270a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme    }
39370a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme
39470a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme    /** @hide */
39570a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme    public void setFrequency(int frequency) {
39670a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme        this.mFrequency = frequency;
39770a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme    }
39870a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme
39970a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme    /**
4002ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
4012ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * TODO: makes real freq boundaries
4022ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
4032ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public boolean is24GHz() {
4044eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        return ScanResult.is24GHz(mFrequency);
4052ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    }
4062ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4072ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
4082ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
4092ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * TODO: makes real freq boundaries
4102ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
4112ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public boolean is5GHz() {
4124eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        return ScanResult.is5GHz(mFrequency);
4132ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    }
4142ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4152ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Record the MAC address of the WLAN interface
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param macAddress the MAC address in {@code XX:XX:XX:XX:XX:XX} form
418ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde     * @hide
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
420ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void setMacAddress(String macAddress) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.mMacAddress = macAddress;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getMacAddress() {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMacAddress;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
428a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki    /**
429a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki     * @return true if {@link #getMacAddress()} has a real MAC address.
430a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki     *
431a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki     * @hide
432a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki     */
433a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki    public boolean hasRealMacAddress() {
434a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki        return mMacAddress != null && !DEFAULT_MAC_ADDRESS.equals(mMacAddress);
435a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki    }
436a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki
4379f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    /** {@hide} */
4389f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    public void setMeteredHint(boolean meteredHint) {
4399f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey        mMeteredHint = meteredHint;
4409f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    }
4419f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey
4429f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    /** {@hide} */
4439f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    public boolean getMeteredHint() {
4449f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey        return mMeteredHint;
4459f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    }
4469f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey
447c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele    /** {@hide} */
448c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele    public void setEphemeral(boolean ephemeral) {
449c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele        mEphemeral = ephemeral;
450c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele    }
451c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele
452c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele    /** {@hide} */
453c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele    public boolean isEphemeral() {
454c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele        return mEphemeral;
455c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele    }
456c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele
457ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
458ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void setNetworkId(int id) {
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNetworkId = id;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each configured network has a unique small integer ID, used to identify
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the network when performing operations on the supplicant. This method
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns the ID for the currently connected network.
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the network ID, or -1 if there is no currently connected network
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getNetworkId() {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNetworkId;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the detailed state of the supplicant's negotiation with an
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * access point, in the form of a {@link SupplicantState SupplicantState} object.
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current {@link SupplicantState SupplicantState}
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SupplicantState getSupplicantState() {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSupplicantState;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
481ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
482ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void setSupplicantState(SupplicantState state) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSupplicantState = state;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
486ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
487ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public void setInetAddress(InetAddress address) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIpAddress = address;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIpAddress() {
4924717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        int result = 0;
4934717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        if (mIpAddress instanceof Inet4Address) {
4944717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            result = NetworkUtils.inetAddressToInt((Inet4Address)mIpAddress);
4954717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        }
4964717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        return result;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if this network does not broadcast its SSID, so an
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SSID-specific probe request must be used for scans.
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getHiddenSSID() {
50463edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle        if (mWifiSsid == null) return false;
5056e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath        return mWifiSsid.isHidden();
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   /**
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Map a supplicant state into a fine-grained network connectivity state.
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param suppState the supplicant state
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the corresponding {@link DetailedState}
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static DetailedState getDetailedStateOf(SupplicantState suppState) {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return stateMap.get(suppState);
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the <code>SupplicantState</code> from the string name
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the state.
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param stateName the name of the state, as a <code>String</code> returned
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in an event sent by {@code wpa_supplicant}.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setSupplicantState(String stateName) {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSupplicantState = valueOf(stateName);
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SupplicantState valueOf(String stateName) {
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ("4WAY_HANDSHAKE".equalsIgnoreCase(stateName))
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return SupplicantState.FOUR_WAY_HANDSHAKE;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
532ee00b353a4070a9ddbdf67fa715dc84e7282f7c2Elliott Hughes                return SupplicantState.valueOf(stateName.toUpperCase(Locale.ROOT));
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IllegalArgumentException e) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return SupplicantState.INVALID;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    /** {@hide} */
5409f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    public static String removeDoubleQuotes(String string) {
54100a10a1494954d124e1b11bc1ba3128e47b8ffbdIrfan Sheriff        if (string == null) return null;
5429f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey        final int length = string.length();
5439f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey        if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
5449f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey            return string.substring(1, length - 1);
5459f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey        }
5469f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey        return string;
5479f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey    }
5489f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuffer sb = new StringBuffer();
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String none = "<none>";
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
554b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        sb.append("SSID: ").append(mWifiSsid == null ? WifiSsid.NONE : mWifiSsid).
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(", BSSID: ").append(mBSSID == null ? none : mBSSID).
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(", MAC: ").append(mMacAddress == null ? none : mMacAddress).
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(", Supplicant state: ").
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(mSupplicantState == null ? none : mSupplicantState).
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            append(", RSSI: ").append(mRssi).
56070a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme            append(", Link speed: ").append(mLinkSpeed).append(LINK_SPEED_UNITS).
56170a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme            append(", Frequency: ").append(mFrequency).append(FREQUENCY_UNITS).
5629f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey            append(", Net ID: ").append(mNetworkId).
5632ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            append(", Metered hint: ").append(mMeteredHint).
5642ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            append(", score: ").append(Integer.toString(score));
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int flags) {
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(mNetworkId);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(mRssi);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(mLinkSpeed);
57870a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme        dest.writeInt(mFrequency);
579124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt        if (mIpAddress != null) {
580124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt            dest.writeByte((byte)1);
581124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt            dest.writeByteArray(mIpAddress.getAddress());
582124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt        } else {
583124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt            dest.writeByte((byte)0);
584124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt        }
585b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (mWifiSsid != null) {
586b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            dest.writeInt(1);
587b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            mWifiSsid.writeToParcel(dest, flags);
588b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        } else {
589b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            dest.writeInt(0);
590b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(mBSSID);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(mMacAddress);
5939f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey        dest.writeInt(mMeteredHint ? 1 : 0);
594c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele        dest.writeInt(mEphemeral ? 1 : 0);
5952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        dest.writeInt(score);
5962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        dest.writeDouble(txSuccessRate);
5972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        dest.writeDouble(txRetriesRate);
5982ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        dest.writeDouble(txBadRate);
5992ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        dest.writeDouble(rxSuccessRate);
6002ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        dest.writeInt(badRssiCount);
6012ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        dest.writeInt(lowRssiCount);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSupplicantState.writeToParcel(dest, flags);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<WifiInfo> CREATOR =
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Creator<WifiInfo>() {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiInfo createFromParcel(Parcel in) {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WifiInfo info = new WifiInfo();
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                info.setNetworkId(in.readInt());
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                info.setRssi(in.readInt());
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                info.setLinkSpeed(in.readInt());
61370a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme                info.setFrequency(in.readInt());
614124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt                if (in.readByte() == 1) {
615124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt                    try {
616124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt                        info.setInetAddress(InetAddress.getByAddress(in.createByteArray()));
617124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt                    } catch (UnknownHostException e) {}
618124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt                }
619b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                if (in.readInt() == 1) {
620b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    info.mWifiSsid = WifiSsid.CREATOR.createFromParcel(in);
621b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                info.mBSSID = in.readString();
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                info.mMacAddress = in.readString();
6249f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey                info.mMeteredHint = in.readInt() != 0;
625c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele                info.mEphemeral = in.readInt() != 0;
6262ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                info.score = in.readInt();
6272ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                info.txSuccessRate = in.readDouble();
6282ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                info.txRetriesRate = in.readDouble();
6292ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                info.txBadRate = in.readDouble();
6302ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                info.rxSuccessRate = in.readDouble();
6312ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                info.badRssiCount = in.readInt();
6322ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                info.lowRssiCount = in.readInt();
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                info.mSupplicantState = SupplicantState.CREATOR.createFromParcel(in);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return info;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiInfo[] newArray(int size) {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new WifiInfo[size];
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
642