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
1996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport android.net.LinkProperties;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
2226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriffimport android.text.TextUtils;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.BitSet;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class representing a configured Wi-Fi network, including the
289b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff * security configuration.
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiConfiguration implements Parcelable {
319b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    private static final String TAG = "WifiConfiguration";
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String ssidVarName = "ssid";
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String bssidVarName = "bssid";
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String pskVarName = "psk";
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String[] wepKeyVarNames = { "wep_key0", "wep_key1", "wep_key2", "wep_key3" };
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String wepTxKeyIdxVarName = "wep_tx_keyidx";
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String priorityVarName = "priority";
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String hiddenSSIDVarName = "scan_ssid";
465ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    /** {@hide} */
475ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    public static final int INVALID_NETWORK_ID = -1;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized key management schemes.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class KeyMgmt {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private KeyMgmt() { }
535069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA is not used; plaintext or static WEP could be used. */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int NONE = 0;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA pre-shared key (requires {@code preSharedKey} to be specified). */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA_PSK = 1;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA using EAP authentication. Generally used with an external authentication server. */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA_EAP = 2;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** IEEE 802.1X using EAP authentication and (optionally) dynamically
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * generated WEP keys. */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int IEEE8021X = 3;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        /** WPA2 pre-shared key for use with soft access point
65ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          * (requires {@code preSharedKey} to be specified).
66ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          * @hide
67ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          */
68ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        public static final int WPA2_PSK = 4;
69ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "key_mgmt";
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP", "IEEE8021X",
73ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff                "WPA2_PSK" };
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
755069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized security protocols.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Protocol {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Protocol() { }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA/IEEE 802.11i/D3.0 */
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA = 0;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA2/IEEE 802.11i */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RSN = 1;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "proto";
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "WPA", "RSN" };
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized IEEE 802.11 authentication algorithms.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class AuthAlgorithm {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private AuthAlgorithm() { }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Open System authentication (required for WPA/WPA2) */
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int OPEN = 0;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Shared Key authentication (requires static WEP keys) */
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int SHARED = 1;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** LEAP/Network EAP (only used with LEAP) */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int LEAP = 2;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "auth_alg";
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "OPEN", "SHARED", "LEAP" };
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized pairwise ciphers for WPA.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class PairwiseCipher {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private PairwiseCipher() { }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Use only Group keys (deprecated) */
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int NONE = 0;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TKIP = 1;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CCMP = 2;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "pairwise";
1245069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "NONE", "TKIP", "CCMP" };
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized group ciphers.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <pre>
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11)
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </pre>
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class GroupCipher {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private GroupCipher() { }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11) */
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WEP40 = 0;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WEP104 = 1;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TKIP = 2;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CCMP = 3;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "group";
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "WEP40", "WEP104", "TKIP", "CCMP" };
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Possible status of a network configuration. */
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Status {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Status() { }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** this is the network we are currently connected to */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CURRENT = 0;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** supplicant will not attempt to use this network */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DISABLED = 1;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** supplicant will consider this network available for association */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ENABLED = 2;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "current", "disabled", "enabled" };
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1688dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1698dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public static final int DISABLED_UNKNOWN_REASON                         = 0;
1708dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1718dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public static final int DISABLED_DNS_FAILURE                            = 1;
1728dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1738dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public static final int DISABLED_DHCP_FAILURE                           = 2;
1748dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1758dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public static final int DISABLED_AUTH_FAILURE                           = 3;
176c1b631e757999232674e53e9a1bc21abed6b1862Deepthi Gowri    /** @hide */
177c1b631e757999232674e53e9a1bc21abed6b1862Deepthi Gowri    public static final int DISABLED_ASSOCIATION_REJECT                     = 4;
1788dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The ID number that the supplicant uses to identify this
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * network configuration entry. This must be passed as an argument
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to most calls into the supplicant.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int networkId;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The current status of this network configuration entry.
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Status
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int status;
1918dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy
1928dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /**
1938dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy     * The code referring to a reason for disabling the network
1948dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy     * Valid when {@link #status} == Status.DISABLED
1958dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy     * @hide
1968dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy     */
1978dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public int disableReason;
1988dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The network's SSID. Can either be an ASCII string,
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which must be enclosed in double quotation marks
2024e8620f868e2490782ebb960404140ea9482c91dBen Dodson     * (e.g., {@code "MyNetwork"}, or a string of
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * hex digits,which are not enclosed in quotes
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (e.g., {@code 01a243f405}).
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String SSID;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When set, this network configuration entry should only be used when
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associating with the AP having the specified BSSID. The value is
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a string in the format of an Ethernet MAC address, e.g.,
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>XX:XX:XX:XX:XX:XX</code> where each <code>X</code> is a hex digit.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String BSSID;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pre-shared key for use with WPA-PSK.
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the value of this key is read, the actual key is
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not returned, just a "*" if the key has a value, or the null
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * string otherwise.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String preSharedKey;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Up to four WEP keys. Either an ASCII string enclosed in double
2254e8620f868e2490782ebb960404140ea9482c91dBen Dodson     * quotation marks (e.g., {@code "abcdef"} or a string
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of hex digits (e.g., {@code 0102030405}).
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the value of one of these keys is read, the actual key is
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not returned, just a "*" if the key has a value, or the null
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * string otherwise.
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] wepKeys;
2335069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Default WEP key index, ranging from 0 to 3. */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int wepTxKeyIndex;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Priority determines the preference given to a network by {@code wpa_supplicant}
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when choosing an access point with which to associate.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int priority;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a network that does not broadcast its SSID, so an
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SSID-specific probe request must be used for scans.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hiddenSSID;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of key management protocols supported by this configuration.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link KeyMgmt} for descriptions of the values.
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to WPA-PSK WPA-EAP.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedKeyManagement;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of security protocols supported by this configuration.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link Protocol} for descriptions of the values.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to WPA RSN.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedProtocols;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of authentication protocols supported by this configuration.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link AuthAlgorithm} for descriptions of the values.
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to automatic selection.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedAuthAlgorithms;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of pairwise ciphers for WPA supported by this configuration.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link PairwiseCipher} for descriptions of the values.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to CCMP TKIP.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedPairwiseCiphers;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of group ciphers supported by this configuration.
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link GroupCipher} for descriptions of the values.
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to CCMP TKIP WEP104 WEP40.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedGroupCiphers;
2799b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    /**
28026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * The enterprise configuration details specifying the EAP method,
28126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * certificates and other settings associated with the EAP.
2829b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff     */
2839b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    public WifiEnterpriseConfig enterpriseConfig;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff    /**
28631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff     * @hide
28731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff     */
28831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff    public enum IpAssignment {
289128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        /* Use statically configured IP settings. Configuration can be accessed
29096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff         * with linkProperties */
29131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff        STATIC,
292128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        /* Use dynamically configured IP settigns */
29331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff        DHCP,
294128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        /* no IP details are assigned, this is used to indicate
295128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff         * that any existing IP settings should be retained */
29631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff        UNASSIGNED
29731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff    }
29831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff    /**
29931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff     * @hide
30031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff     */
30131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff    public IpAssignment ipAssignment;
3025069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
303128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    /**
304128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff     * @hide
305128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff     */
306128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    public enum ProxySettings {
307128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        /* No proxy is to be used. Any existing proxy settings
308128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff         * should be cleared. */
309128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        NONE,
310128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        /* Use statically configured proxy. Configuration can be accessed
31196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff         * with linkProperties */
312128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        STATIC,
313128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        /* no proxy details are assigned, this is used to indicate
314128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff         * that any existing proxy settings should be retained */
315602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk        UNASSIGNED,
316602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk        /* Use a Pac based proxy.
317602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk         */
318602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk        PAC
319128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    }
320128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    /**
321128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff     * @hide
322128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff     */
323128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    public ProxySettings proxySettings;
324128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    /**
325128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff     * @hide
326128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff     */
32796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff    public LinkProperties linkProperties;
328128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiConfiguration() {
3305ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff        networkId = INVALID_NETWORK_ID;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SSID = null;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BSSID = null;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        priority = 0;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hiddenSSID = false;
3358dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy        disableReason = DISABLED_UNKNOWN_REASON;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedKeyManagement = new BitSet();
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedProtocols = new BitSet();
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedAuthAlgorithms = new BitSet();
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedPairwiseCiphers = new BitSet();
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedGroupCiphers = new BitSet();
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wepKeys = new String[4];
3429b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (int i = 0; i < wepKeys.length; i++) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wepKeys[i] = null;
3444337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang        }
3459b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        enterpriseConfig = new WifiEnterpriseConfig();
34631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff        ipAssignment = IpAssignment.UNASSIGNED;
347128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        proxySettings = ProxySettings.UNASSIGNED;
34896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        linkProperties = new LinkProperties();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35110652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    /**
35210652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     * indicates whether the configuration is valid
35310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     * @return true if valid, false otherwise
35410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     * @hide
35510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     */
35610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    public boolean isValid() {
35710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde        if (allowedKeyManagement.cardinality() > 1) {
3583b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            if (allowedKeyManagement.cardinality() != 2) {
3593b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde                return false;
3603b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            }
3613b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            if (allowedKeyManagement.get(KeyMgmt.WPA_EAP) == false) {
3623b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde                return false;
3633b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            }
3642871588101c9bf1e6c9573599dee9be106466175Vinit Deshapnde            if ((allowedKeyManagement.get(KeyMgmt.IEEE8021X) == false)
3652871588101c9bf1e6c9573599dee9be106466175Vinit Deshapnde                    && (allowedKeyManagement.get(KeyMgmt.WPA_PSK) == false)) {
3663b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde                return false;
3673b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            }
36810652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde        }
36910652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde
37010652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde        // TODO: Add more checks
37110652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde        return true;
37210652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    }
37310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde
3748dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    @Override
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
3768dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy        StringBuilder sbuf = new StringBuilder();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.status == WifiConfiguration.Status.CURRENT) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sbuf.append("* ");
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (this.status == WifiConfiguration.Status.DISABLED) {
3808dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy            sbuf.append("- DSBLE: ").append(this.disableReason).append(" ");
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append("ID: ").append(this.networkId).append(" SSID: ").append(this.SSID).
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                append(" BSSID: ").append(this.BSSID).append(" PRIO: ").append(this.priority).
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                append('\n');
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" KeyMgmt:");
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int k = 0; k < this.allowedKeyManagement.size(); k++) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedKeyManagement.get(k)) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (k < KeyMgmt.strings.length) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(KeyMgmt.strings[k]);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" Protocols:");
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int p = 0; p < this.allowedProtocols.size(); p++) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedProtocols.get(p)) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p < Protocol.strings.length) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(Protocol.strings[p]);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" AuthAlgorithms:");
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int a = 0; a < this.allowedAuthAlgorithms.size(); a++) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedAuthAlgorithms.get(a)) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a < AuthAlgorithm.strings.length) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(AuthAlgorithm.strings[a]);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" PairwiseCiphers:");
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int pc = 0; pc < this.allowedPairwiseCiphers.size(); pc++) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedPairwiseCiphers.get(pc)) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pc < PairwiseCipher.strings.length) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(PairwiseCipher.strings[pc]);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" GroupCiphers:");
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int gc = 0; gc < this.allowedGroupCiphers.size(); gc++) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedGroupCiphers.get(gc)) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (gc < GroupCipher.strings.length) {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(GroupCipher.strings[gc]);
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4435069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        sbuf.append('\n').append(" PSK: ");
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.preSharedKey != null) {
4455069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang            sbuf.append('*');
4465069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        }
4474337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
4489b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        sbuf.append(enterpriseConfig);
4495069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        sbuf.append('\n');
4509b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff
45196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        sbuf.append("IP assignment: " + ipAssignment.toString());
45296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        sbuf.append("\n");
45396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        sbuf.append("Proxy settings: " + proxySettings.toString());
45496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        sbuf.append("\n");
45596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        sbuf.append(linkProperties.toString());
45696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        sbuf.append("\n");
457128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sbuf.toString();
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Construct a WifiConfiguration from a scanned network
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scannedAP the scan result used to construct the config entry
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: figure out whether this is a useful way to construct a new entry.
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiConfiguration(ScanResult scannedAP) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        networkId = -1;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SSID = scannedAP.SSID;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BSSID = scannedAP.BSSID;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
473b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** {@hide} */
474b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public String getPrintableSsid() {
475b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (SSID == null) return "";
476b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        final int length = SSID.length();
477b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (length > 2 && (SSID.charAt(0) == '"') && SSID.charAt(length - 1) == '"') {
478b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return SSID.substring(1, length - 1);
479b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
480b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
481b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        /** The ascii-encoded string format is P"<ascii-encoded-string>"
482b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         * The decoding is implemented in the supplicant for a newly configured
483b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         * network.
484b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         */
485b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (length > 3 && (SSID.charAt(0) == 'P') && (SSID.charAt(1) == '"') &&
486b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                (SSID.charAt(length-1) == '"')) {
487b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded(
488b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    SSID.substring(2, length - 1));
489b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return wifiSsid.toString();
490b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
491b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return SSID;
492b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
493b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
49426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    /**
49526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * Get an identifier for associating credentials with this config
49626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @param current configuration contains values for additional fields
49726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     *                that are not part of this configuration. Used
49826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     *                when a config with some fields is passed by an application.
49926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @throws IllegalStateException if config is invalid for key id generation
50026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @hide
50126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     */
50226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    String getKeyIdForCredentials(WifiConfiguration current) {
50326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        String keyMgmt = null;
50426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
50526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        try {
50626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            // Get current config details for fields that are not initialized
50726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (TextUtils.isEmpty(SSID)) SSID = current.SSID;
50826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.cardinality() == 0) {
50926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                allowedKeyManagement = current.allowedKeyManagement;
51026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
51126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
51226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                keyMgmt = KeyMgmt.strings[KeyMgmt.WPA_EAP];
51326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
51426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
51526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                keyMgmt += KeyMgmt.strings[KeyMgmt.IEEE8021X];
51626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
51726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
51826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (TextUtils.isEmpty(keyMgmt)) {
51926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                throw new IllegalStateException("Not an EAP network");
52026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
52126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
52226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            return trimStringForKeyId(SSID) + "_" + keyMgmt + "_" +
52326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                    trimStringForKeyId(enterpriseConfig.getKeyId(current != null ?
52426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                            current.enterpriseConfig : null));
52526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        } catch (NullPointerException e) {
52626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            throw new IllegalStateException("Invalid config details");
52726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        }
52826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    }
52926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
53026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    private String trimStringForKeyId(String string) {
53126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        // Remove quotes and spaces
53226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        return string.replace("\"", "").replace(" ", "");
53326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    }
53426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static BitSet readBitSet(Parcel src) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cardinality = src.readInt();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BitSet set = new BitSet();
5399b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (int i = 0; i < cardinality; i++) {
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            set.set(src.readInt());
5419b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return set;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void writeBitSet(Parcel dest, BitSet set) {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nextSetBit = -1;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(set.cardinality());
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(nextSetBit);
5539b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
556ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    /** @hide */
557ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    public int getAuthType() {
5580fd3b1be14ec6b6ba33140efa321b27dc3bf2862Vinit Deshapnde        if (isValid() == false) {
5590fd3b1be14ec6b6ba33140efa321b27dc3bf2862Vinit Deshapnde            throw new IllegalStateException("Invalid configuration");
56026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        }
561ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
562ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA_PSK;
563ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.WPA2_PSK)) {
564ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA2_PSK;
565ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
566ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA_EAP;
567ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
568ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.IEEE8021X;
569ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        }
570ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        return KeyMgmt.NONE;
571ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    }
572ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
578128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    /** copy constructor {@hide} */
579128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    public WifiConfiguration(WifiConfiguration source) {
580128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        if (source != null) {
581128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            networkId = source.networkId;
582128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            status = source.status;
5838136de08ff4b5c4cca11220143f5905dca38cc26Isaac Levy            disableReason = source.disableReason;
584128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            SSID = source.SSID;
585128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            BSSID = source.BSSID;
586128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            preSharedKey = source.preSharedKey;
587128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
588128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            wepKeys = new String[4];
5899b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            for (int i = 0; i < wepKeys.length; i++) {
590128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff                wepKeys[i] = source.wepKeys[i];
5919b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            }
592128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
593128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            wepTxKeyIndex = source.wepTxKeyIndex;
594128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            priority = source.priority;
595128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            hiddenSSID = source.hiddenSSID;
596128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedKeyManagement   = (BitSet) source.allowedKeyManagement.clone();
597128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedProtocols       = (BitSet) source.allowedProtocols.clone();
598128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedAuthAlgorithms  = (BitSet) source.allowedAuthAlgorithms.clone();
599128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedPairwiseCiphers = (BitSet) source.allowedPairwiseCiphers.clone();
600128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedGroupCiphers    = (BitSet) source.allowedGroupCiphers.clone();
601128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
6029b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            enterpriseConfig = new WifiEnterpriseConfig(source.enterpriseConfig);
6039b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff
604128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            ipAssignment = source.ipAssignment;
605128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            proxySettings = source.proxySettings;
60696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff            linkProperties = new LinkProperties(source.linkProperties);
6079e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff        }
6089e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff    }
6099e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int flags) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(networkId);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(status);
6148dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy        dest.writeInt(disableReason);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(SSID);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(BSSID);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(preSharedKey);
6189b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (String wepKey : wepKeys) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeString(wepKey);
6209b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(wepTxKeyIndex);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(priority);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(hiddenSSID ? 1 : 0);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedKeyManagement);
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedProtocols);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedAuthAlgorithms);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedPairwiseCiphers);
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedGroupCiphers);
6304337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
6319b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        dest.writeParcelable(enterpriseConfig, flags);
6329b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff
63331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff        dest.writeString(ipAssignment.name());
634128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        dest.writeString(proxySettings.name());
63596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff        dest.writeParcelable(linkProperties, flags);
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<WifiConfiguration> CREATOR =
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Creator<WifiConfiguration>() {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiConfiguration createFromParcel(Parcel in) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WifiConfiguration config = new WifiConfiguration();
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.networkId = in.readInt();
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.status = in.readInt();
6458dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy                config.disableReason = in.readInt();
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.SSID = in.readString();
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.BSSID = in.readString();
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.preSharedKey = in.readString();
6499b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                for (int i = 0; i < config.wepKeys.length; i++) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    config.wepKeys[i] = in.readString();
6519b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.wepTxKeyIndex = in.readInt();
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.priority = in.readInt();
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.hiddenSSID = in.readInt() != 0;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedKeyManagement   = readBitSet(in);
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedProtocols       = readBitSet(in);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedAuthAlgorithms  = readBitSet(in);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedPairwiseCiphers = readBitSet(in);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedGroupCiphers    = readBitSet(in);
6604337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
6619b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                config.enterpriseConfig = in.readParcelable(null);
66231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff
66331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff                config.ipAssignment = IpAssignment.valueOf(in.readString());
664128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff                config.proxySettings = ProxySettings.valueOf(in.readString());
66596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff                config.linkProperties = in.readParcelable(null);
6669b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return config;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiConfiguration[] newArray(int size) {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new WifiConfiguration[size];
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
675