WifiConfiguration.java revision 2e93c38fa6fad224e56a45ff4244bdd538aec846
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
19adae06be9bfd8cb756e1793b52e682eb87258968Chelsea Derrickimport android.annotation.SystemApi;
206346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration;
216346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration.ProxySettings;
226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration.IpAssignment;
236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.ProxyInfo;
240a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colittiimport android.net.StaticIpConfiguration;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.os.Parcelable;
2726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriffimport android.text.TextUtils;
28154b2cf6bbb99ee258b289846183172139a87dbavandwalleimport android.annotation.SystemApi;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
307c3606c103e95d3991267cca2592402a68779cafvandwalleimport java.util.HashMap;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.BitSet;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class representing a configured Wi-Fi network, including the
359b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff * security configuration.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
37678979748585c5903125a404e448ad6c111dedadJaewan Kimpublic class WifiConfiguration implements Parcelable {
389b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    private static final String TAG = "WifiConfiguration";
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String ssidVarName = "ssid";
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String bssidVarName = "bssid";
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String pskVarName = "psk";
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String[] wepKeyVarNames = { "wep_key0", "wep_key1", "wep_key2", "wep_key3" };
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String wepTxKeyIdxVarName = "wep_tx_keyidx";
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String priorityVarName = "priority";
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String hiddenSSIDVarName = "scan_ssid";
535ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    /** {@hide} */
545f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public static final String pmfVarName = "ieee80211w";
555f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /** {@hide} */
565f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public static final String updateIdentiferVarName = "update_identifier";
575f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /** {@hide} */
585ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    public static final int INVALID_NETWORK_ID = -1;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized key management schemes.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class KeyMgmt {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private KeyMgmt() { }
645069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA is not used; plaintext or static WEP could be used. */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int NONE = 0;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA pre-shared key (requires {@code preSharedKey} to be specified). */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA_PSK = 1;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA using EAP authentication. Generally used with an external authentication server. */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA_EAP = 2;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** IEEE 802.1X using EAP authentication and (optionally) dynamically
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * generated WEP keys. */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int IEEE8021X = 3;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        /** WPA2 pre-shared key for use with soft access point
76ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          * (requires {@code preSharedKey} to be specified).
77ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          * @hide
78ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          */
79ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        public static final int WPA2_PSK = 4;
80ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "key_mgmt";
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP", "IEEE8021X",
84ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff                "WPA2_PSK" };
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
865069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized security protocols.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Protocol {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Protocol() { }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA/IEEE 802.11i/D3.0 */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA = 0;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA2/IEEE 802.11i */
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RSN = 1;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "proto";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "WPA", "RSN" };
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized IEEE 802.11 authentication algorithms.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class AuthAlgorithm {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private AuthAlgorithm() { }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Open System authentication (required for WPA/WPA2) */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int OPEN = 0;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Shared Key authentication (requires static WEP keys) */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int SHARED = 1;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** LEAP/Network EAP (only used with LEAP) */
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int LEAP = 2;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "auth_alg";
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "OPEN", "SHARED", "LEAP" };
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized pairwise ciphers for WPA.
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class PairwiseCipher {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private PairwiseCipher() { }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Use only Group keys (deprecated) */
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int NONE = 0;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TKIP = 1;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CCMP = 2;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "pairwise";
1355069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "NONE", "TKIP", "CCMP" };
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized group ciphers.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <pre>
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11)
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </pre>
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class GroupCipher {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private GroupCipher() { }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11) */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WEP40 = 0;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key */
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WEP104 = 1;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TKIP = 2;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CCMP = 3;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "group";
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "WEP40", "WEP104", "TKIP", "CCMP" };
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Possible status of a network configuration. */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Status {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Status() { }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** this is the network we are currently connected to */
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CURRENT = 0;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** supplicant will not attempt to use this network */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DISABLED = 1;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** supplicant will consider this network available for association */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ENABLED = 2;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "current", "disabled", "enabled" };
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1798dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1808dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public static final int DISABLED_UNKNOWN_REASON                         = 0;
1818dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1828dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public static final int DISABLED_DNS_FAILURE                            = 1;
1838dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1848dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public static final int DISABLED_DHCP_FAILURE                           = 2;
1858dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1868dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public static final int DISABLED_AUTH_FAILURE                           = 3;
187c1b631e757999232674e53e9a1bc21abed6b1862Deepthi Gowri    /** @hide */
188c1b631e757999232674e53e9a1bc21abed6b1862Deepthi Gowri    public static final int DISABLED_ASSOCIATION_REJECT                     = 4;
18994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    /** @hide */
19094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    public static final int DISABLED_BY_WIFI_MANAGER                        = 5;
1918dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The ID number that the supplicant uses to identify this
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * network configuration entry. This must be passed as an argument
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to most calls into the supplicant.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int networkId;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The current status of this network configuration entry.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Status
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int status;
2048dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy
2058dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /**
2068dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy     * The code referring to a reason for disabling the network
2078dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy     * Valid when {@link #status} == Status.DISABLED
2088dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy     * @hide
2098dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy     */
2108dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    public int disableReason;
2118dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The network's SSID. Can either be an ASCII string,
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which must be enclosed in double quotation marks
2154e8620f868e2490782ebb960404140ea9482c91dBen Dodson     * (e.g., {@code "MyNetwork"}, or a string of
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * hex digits,which are not enclosed in quotes
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (e.g., {@code 01a243f405}).
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String SSID;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When set, this network configuration entry should only be used when
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associating with the AP having the specified BSSID. The value is
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a string in the format of an Ethernet MAC address, e.g.,
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>XX:XX:XX:XX:XX:XX</code> where each <code>X</code> is a hex digit.
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String BSSID;
2278a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng    /**
228c8505931420dd9a76acf940a56b31354cd0105b0Vinit Deshpande     * Fully qualified domain name (FQDN) of AAA server or RADIUS server
2298a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng     * e.g. {@code "mail.example.com"}.
2308a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng     */
2318a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng    public String FQDN;
2328a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng    /**
2338a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng     * Network access identifier (NAI) realm, for Passpoint credential.
2348a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng     * e.g. {@code "myhost.example.com"}.
2358a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng     * @hide
2368a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng     */
2378a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng    public String naiRealm;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pre-shared key for use with WPA-PSK.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the value of this key is read, the actual key is
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not returned, just a "*" if the key has a value, or the null
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * string otherwise.
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String preSharedKey;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Up to four WEP keys. Either an ASCII string enclosed in double
2494e8620f868e2490782ebb960404140ea9482c91dBen Dodson     * quotation marks (e.g., {@code "abcdef"} or a string
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of hex digits (e.g., {@code 0102030405}).
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the value of one of these keys is read, the actual key is
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not returned, just a "*" if the key has a value, or the null
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * string otherwise.
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] wepKeys;
2575069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Default WEP key index, ranging from 0 to 3. */
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int wepTxKeyIndex;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Priority determines the preference given to a network by {@code wpa_supplicant}
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when choosing an access point with which to associate.
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int priority;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a network that does not broadcast its SSID, so an
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SSID-specific probe request must be used for scans.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hiddenSSID;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2745f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * This is a network that requries Protected Management Frames (PMF).
2755f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * @hide
2765f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     */
2775f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public boolean requirePMF;
2785f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
2795f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /**
2805f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * Update identifier, for Passpoint network.
2815f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * @hide
2825f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     */
2835f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public String updateIdentifier;
2845f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
2855f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /**
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of key management protocols supported by this configuration.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link KeyMgmt} for descriptions of the values.
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to WPA-PSK WPA-EAP.
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedKeyManagement;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of security protocols supported by this configuration.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link Protocol} for descriptions of the values.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to WPA RSN.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedProtocols;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of authentication protocols supported by this configuration.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link AuthAlgorithm} for descriptions of the values.
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to automatic selection.
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedAuthAlgorithms;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of pairwise ciphers for WPA supported by this configuration.
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link PairwiseCipher} for descriptions of the values.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to CCMP TKIP.
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedPairwiseCiphers;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of group ciphers supported by this configuration.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link GroupCipher} for descriptions of the values.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to CCMP TKIP WEP104 WEP40.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedGroupCiphers;
3159b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    /**
31626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * The enterprise configuration details specifying the EAP method,
31726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * certificates and other settings associated with the EAP.
3189b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff     */
3199b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    public WifiEnterpriseConfig enterpriseConfig;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
321678979748585c5903125a404e448ad6c111dedadJaewan Kim    /**
322678979748585c5903125a404e448ad6c111dedadJaewan Kim     * @hide
323678979748585c5903125a404e448ad6c111dedadJaewan Kim     */
3246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    private IpConfiguration mIpConfiguration;
325678979748585c5903125a404e448ad6c111dedadJaewan Kim
326678979748585c5903125a404e448ad6c111dedadJaewan Kim    /**
327678979748585c5903125a404e448ad6c111dedadJaewan Kim     * @hide
3287c3606c103e95d3991267cca2592402a68779cafvandwalle     * dhcp server MAC address if known
3297c3606c103e95d3991267cca2592402a68779cafvandwalle     */
3307c3606c103e95d3991267cca2592402a68779cafvandwalle    public String dhcpServer;
3317c3606c103e95d3991267cca2592402a68779cafvandwalle
3327c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
3337c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
3347c3606c103e95d3991267cca2592402a68779cafvandwalle     * default Gateway MAC address if known
3357c3606c103e95d3991267cca2592402a68779cafvandwalle     */
3367c3606c103e95d3991267cca2592402a68779cafvandwalle    public String defaultGwMacAddress;
3377c3606c103e95d3991267cca2592402a68779cafvandwalle
3387c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
3397c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
3403a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle     * last failure
3413a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle     */
3423a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle    public String lastFailure;
3433a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle
3443a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle    /**
3453a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle     * @hide
346448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * last time we connected, this configuration had no internet access
347448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
348448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public boolean noInternetAccess;
349448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
350448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
351448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
3528f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of app creating the configuration
3538f13548615f647a1208ace5369b504cb41149965vandwalle     */
354adae06be9bfd8cb756e1793b52e682eb87258968Chelsea Derrick    @SystemApi
3558f13548615f647a1208ace5369b504cb41149965vandwalle    public int creatorUid;
3568f13548615f647a1208ace5369b504cb41149965vandwalle
3578f13548615f647a1208ace5369b504cb41149965vandwalle    /**
3588f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
3598f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of last app issuing a connection related command
3608f13548615f647a1208ace5369b504cb41149965vandwalle     */
3618f13548615f647a1208ace5369b504cb41149965vandwalle    public int lastConnectUid;
3628f13548615f647a1208ace5369b504cb41149965vandwalle
3638f13548615f647a1208ace5369b504cb41149965vandwalle    /**
3648f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
3658f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of last app modifying the configuration
3668f13548615f647a1208ace5369b504cb41149965vandwalle     */
367eb8f329a5e8d4df80447ab9676761f9743d20cd4Chelsea Derrick    @SystemApi
3688f13548615f647a1208ace5369b504cb41149965vandwalle    public int lastUpdateUid;
3698f13548615f647a1208ace5369b504cb41149965vandwalle
3708f13548615f647a1208ace5369b504cb41149965vandwalle    /**
3718f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
372e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle     * Uid used by autoJoin
37372d87d99b02c6523a4a3cb83e0d5cf6c8e01075fvandwalle     */
374e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle    public String autoJoinBSSID;
37572d87d99b02c6523a4a3cb83e0d5cf6c8e01075fvandwalle
37672d87d99b02c6523a4a3cb83e0d5cf6c8e01075fvandwalle    /**
37772d87d99b02c6523a4a3cb83e0d5cf6c8e01075fvandwalle     * @hide
3787c3606c103e95d3991267cca2592402a68779cafvandwalle     * BSSID list on which this configuration was seen.
3797c3606c103e95d3991267cca2592402a68779cafvandwalle     * TODO: prevent this list to grow infinitely, age-out the results
3807c3606c103e95d3991267cca2592402a68779cafvandwalle     */
3817c3606c103e95d3991267cca2592402a68779cafvandwalle    public HashMap<String, ScanResult> scanResultCache;
3827c3606c103e95d3991267cca2592402a68779cafvandwalle
3832ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** The Below RSSI thresholds are used to configure AutoJoin
3842ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     *  - GOOD/LOW/BAD thresholds are used so as to calculate link score
3852e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - UNWANTED_SOFT are used by the blacklisting logic so as to handle
3862e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the unwanted network message coming from CS
3872e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - UNBLACKLIST thresholds are used so as to tweak the speed at which
3882e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the network is unblacklisted (i.e. if
3892ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     *          it is seen with good RSSI, it is blacklisted faster)
3902e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - INITIAL_AUTOJOIN_ATTEMPT, used to determine how close from
3912e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the network we need to be before autojoin kicks in
3922ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
3937c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide **/
3947c3606c103e95d3991267cca2592402a68779cafvandwalle    public static int INVALID_RSSI = -127;
3957c3606c103e95d3991267cca2592402a68779cafvandwalle
3962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
3972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int UNWANTED_BLACKLIST_SOFT_RSSI_24 = -80;
3982ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
3992ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4002ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int UNWANTED_BLACKLIST_SOFT_RSSI_5 = -70;
4012ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4022ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4032ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int GOOD_RSSI_24 = -65;
4042ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4052ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4067610fa66cd0980703986cf5be95a307397040bf1vandwalle    public static int LOW_RSSI_24 = -77;
4072ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4082ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
409d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    public static int BAD_RSSI_24 = -87;
4102ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4112ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4127610fa66cd0980703986cf5be95a307397040bf1vandwalle    public static int GOOD_RSSI_5 = -60;
4132ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4142ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4157610fa66cd0980703986cf5be95a307397040bf1vandwalle    public static int LOW_RSSI_5 = -72;
4162ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4172ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4187610fa66cd0980703986cf5be95a307397040bf1vandwalle    public static int BAD_RSSI_5 = -82;
4192ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4202ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4212ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int UNWANTED_BLACKLIST_SOFT_BUMP = 4;
4222ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4232ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4242ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int UNWANTED_BLACKLIST_HARD_BUMP = 8;
4252ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4262ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
427d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    public static int UNBLACKLIST_THRESHOLD_24_SOFT = -77;
4282ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4292ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4302ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int UNBLACKLIST_THRESHOLD_24_HARD = -68;
4312ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4322ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4332ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int UNBLACKLIST_THRESHOLD_5_SOFT = -63;
4342ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4352ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4362ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int UNBLACKLIST_THRESHOLD_5_HARD = -56;
4372ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4382ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4392ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int INITIAL_AUTO_JOIN_ATTEMPT_MIN_24 = -80;
4402ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
4412ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
4422ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static int INITIAL_AUTO_JOIN_ATTEMPT_MIN_5 = -70;
4432ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
444111fa0274d1d6620f9634783585387f3b773949evandwalle    /** @hide
445154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * 5GHz band is prefered low over 2.4 if the 5GHz RSSI is higher than this threshold */
44694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    public static int A_BAND_PREFERENCE_RSSI_THRESHOLD = -65;
447111fa0274d1d6620f9634783585387f3b773949evandwalle
448d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    /** @hide
449d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * 5GHz band is penalized if the 5GHz RSSI is lower than this threshold **/
450d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    public static int G_BAND_PREFERENCE_RSSI_THRESHOLD = -75;
451d524c78d9358e2fa1e67124468cffa5284870c62vandwalle
4527610fa66cd0980703986cf5be95a307397040bf1vandwalle    /** @hide
4537610fa66cd0980703986cf5be95a307397040bf1vandwalle     * Boost given to RSSI on a home network for the purpose of calculating the score
4547610fa66cd0980703986cf5be95a307397040bf1vandwalle     * This adds stickiness to home networks, as defined by:
4557610fa66cd0980703986cf5be95a307397040bf1vandwalle     * - less than 4 known BSSIDs
4567610fa66cd0980703986cf5be95a307397040bf1vandwalle     * - PSK only
4577610fa66cd0980703986cf5be95a307397040bf1vandwalle     * - TODO: add a test to verify that all BSSIDs are behind same gateway
4587610fa66cd0980703986cf5be95a307397040bf1vandwalle     ***/
4597610fa66cd0980703986cf5be95a307397040bf1vandwalle    public static int HOME_NETWORK_RSSI_BOOST = 5;
4607610fa66cd0980703986cf5be95a307397040bf1vandwalle
46194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    /** @hide
46294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     * RSSI boost for configuration which use autoJoinUseAggressiveJoinAttemptThreshold
46394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     * To be more aggressive when initially attempting to auto join
46494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     */
46594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    public static int MAX_INITIAL_AUTO_JOIN_RSSI_BOOST = 8;
46694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle
4677c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
4687c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
4697c3606c103e95d3991267cca2592402a68779cafvandwalle     * A summary of the RSSI and Band status for that configuration
4707c3606c103e95d3991267cca2592402a68779cafvandwalle     * This is used as a temporary value by the auto-join controller
4717c3606c103e95d3991267cca2592402a68779cafvandwalle     */
4725fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    public final class Visibility {
4737c3606c103e95d3991267cca2592402a68779cafvandwalle        public int rssi5;   // strongest 5GHz RSSI
4747c3606c103e95d3991267cca2592402a68779cafvandwalle        public int rssi24;  // strongest 2.4GHz RSSI
4757c3606c103e95d3991267cca2592402a68779cafvandwalle        public int num5;    // number of BSSIDs on 5GHz
4767c3606c103e95d3991267cca2592402a68779cafvandwalle        public int num24;   // number of BSSIDs on 2.4GHz
477e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public long age5;   // timestamp of the strongest 5GHz BSSID (last time it was seen)
478e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public long age24;  // timestamp of the strongest 2.4GHz BSSID (last time it was seen)
479e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public String BSSID24;
480e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public String BSSID5;
4815fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
4825fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public Visibility() {
4837c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi5 = INVALID_RSSI;
4847c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi24 = INVALID_RSSI;
4857c3606c103e95d3991267cca2592402a68779cafvandwalle        }
4865fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
4875fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public Visibility(Visibility source) {
4887c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi5 = source.rssi5;
4897c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi24 = source.rssi24;
4907c3606c103e95d3991267cca2592402a68779cafvandwalle            age24 = source.age24;
4917c3606c103e95d3991267cca2592402a68779cafvandwalle            age5 = source.age5;
4927c3606c103e95d3991267cca2592402a68779cafvandwalle            num24 = source.num24;
4937c3606c103e95d3991267cca2592402a68779cafvandwalle            num5 = source.num5;
494e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle            BSSID5 = source.BSSID5;
495e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle            BSSID24 = source.BSSID24;
4967c3606c103e95d3991267cca2592402a68779cafvandwalle        }
4975fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
4985fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        @Override
4995fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public String toString() {
5005fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            StringBuilder sbuf = new StringBuilder();
5015fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            sbuf.append("[");
5025fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            if (rssi24 > INVALID_RSSI) {
5035fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(rssi24));
5045fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(",");
5055fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(num24));
506e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                if (BSSID24 != null) sbuf.append(",").append(BSSID24);
5075fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            } else {
5085fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append("*");
5095fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            }
5105fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            sbuf.append(" - ");
5115fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            if (rssi5 > INVALID_RSSI) {
5125fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(rssi5));
5135fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(",");
5145fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(num5));
515e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                if (BSSID5 != null) sbuf.append(",").append(BSSID5);
5165fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            }
5175fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            sbuf.append("]");
5185fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            return sbuf.toString();
5195fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        }
5207c3606c103e95d3991267cca2592402a68779cafvandwalle    }
5217c3606c103e95d3991267cca2592402a68779cafvandwalle
5227c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
5237c3606c103e95d3991267cca2592402a68779cafvandwalle     * Cache the visibility status of this configuration.
5247c3606c103e95d3991267cca2592402a68779cafvandwalle     * Visibility can change at any time depending on scan results availability.
5257c3606c103e95d3991267cca2592402a68779cafvandwalle     * Owner of the WifiConfiguration is responsible to set this field based on
5267c3606c103e95d3991267cca2592402a68779cafvandwalle     * recent scan results.
5277c3606c103e95d3991267cca2592402a68779cafvandwalle     ***/
5287c3606c103e95d3991267cca2592402a68779cafvandwalle    public Visibility visibility;
5297c3606c103e95d3991267cca2592402a68779cafvandwalle
5307c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
5317c3606c103e95d3991267cca2592402a68779cafvandwalle     * calculate and set Visibility for that configuration.
5327c3606c103e95d3991267cca2592402a68779cafvandwalle     *
5337c3606c103e95d3991267cca2592402a68779cafvandwalle     * age in milliseconds: we will consider only ScanResults that are more recent,
5347c3606c103e95d3991267cca2592402a68779cafvandwalle     * i.e. younger.
5357c3606c103e95d3991267cca2592402a68779cafvandwalle     ***/
5367c3606c103e95d3991267cca2592402a68779cafvandwalle    public Visibility setVisibility(long age) {
5377c3606c103e95d3991267cca2592402a68779cafvandwalle        if (scanResultCache == null) {
5387c3606c103e95d3991267cca2592402a68779cafvandwalle            visibility = null;
5397c3606c103e95d3991267cca2592402a68779cafvandwalle            return null;
5407c3606c103e95d3991267cca2592402a68779cafvandwalle        }
5417c3606c103e95d3991267cca2592402a68779cafvandwalle
5427c3606c103e95d3991267cca2592402a68779cafvandwalle        Visibility status = new Visibility();
5437c3606c103e95d3991267cca2592402a68779cafvandwalle
5447c3606c103e95d3991267cca2592402a68779cafvandwalle        long now_ms = System.currentTimeMillis();
5457c3606c103e95d3991267cca2592402a68779cafvandwalle        for(ScanResult result : scanResultCache.values()) {
5467c3606c103e95d3991267cca2592402a68779cafvandwalle            if (result.seen == 0)
5477c3606c103e95d3991267cca2592402a68779cafvandwalle                continue;
5487c3606c103e95d3991267cca2592402a68779cafvandwalle
549111fa0274d1d6620f9634783585387f3b773949evandwalle            if (result.is5GHz()) {
5507c3606c103e95d3991267cca2592402a68779cafvandwalle                //strictly speaking: [4915, 5825]
5517c3606c103e95d3991267cca2592402a68779cafvandwalle                //number of known BSSID on 5GHz band
5527c3606c103e95d3991267cca2592402a68779cafvandwalle                status.num5 = status.num5 + 1;
553111fa0274d1d6620f9634783585387f3b773949evandwalle            } else if (result.is24GHz()) {
5547c3606c103e95d3991267cca2592402a68779cafvandwalle                //strictly speaking: [2412, 2482]
5557c3606c103e95d3991267cca2592402a68779cafvandwalle                //number of known BSSID on 2.4Ghz band
5567c3606c103e95d3991267cca2592402a68779cafvandwalle                status.num24 = status.num24 + 1;
5577c3606c103e95d3991267cca2592402a68779cafvandwalle            }
5587c3606c103e95d3991267cca2592402a68779cafvandwalle
5597c3606c103e95d3991267cca2592402a68779cafvandwalle            if ((now_ms - result.seen) > age) continue;
5607c3606c103e95d3991267cca2592402a68779cafvandwalle
561111fa0274d1d6620f9634783585387f3b773949evandwalle            if (result.is5GHz()) {
5627c3606c103e95d3991267cca2592402a68779cafvandwalle                if (result.level > status.rssi5) {
5637c3606c103e95d3991267cca2592402a68779cafvandwalle                    status.rssi5 = result.level;
5647c3606c103e95d3991267cca2592402a68779cafvandwalle                    status.age5 = result.seen;
565e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                    status.BSSID5 = result.BSSID;
5667c3606c103e95d3991267cca2592402a68779cafvandwalle                }
567111fa0274d1d6620f9634783585387f3b773949evandwalle            } else if (result.is24GHz()) {
5687c3606c103e95d3991267cca2592402a68779cafvandwalle                if (result.level > status.rssi24) {
5697c3606c103e95d3991267cca2592402a68779cafvandwalle                    status.rssi24 = result.level;
5707c3606c103e95d3991267cca2592402a68779cafvandwalle                    status.age24 = result.seen;
571e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                    status.BSSID24 = result.BSSID;
5727c3606c103e95d3991267cca2592402a68779cafvandwalle                }
5737c3606c103e95d3991267cca2592402a68779cafvandwalle            }
5747c3606c103e95d3991267cca2592402a68779cafvandwalle        }
5757c3606c103e95d3991267cca2592402a68779cafvandwalle        visibility = status;
5767c3606c103e95d3991267cca2592402a68779cafvandwalle        return status;
5777c3606c103e95d3991267cca2592402a68779cafvandwalle    }
5787c3606c103e95d3991267cca2592402a68779cafvandwalle
5797c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide */
5807c3606c103e95d3991267cca2592402a68779cafvandwalle    public static final int AUTO_JOIN_ENABLED                   = 0;
5812ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
582d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle     * if this is set, the WifiConfiguration cannot use linkages so as to bump
583d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle     * it's relative priority.
5848f13548615f647a1208ace5369b504cb41149965vandwalle     * - status between and 128 indicate various level of blacklisting depending
5858f13548615f647a1208ace5369b504cb41149965vandwalle     * on the severity or frequency of the connection error
5868f13548615f647a1208ace5369b504cb41149965vandwalle     * - deleted status indicates that the user is deleting the configuration, and so
5878f13548615f647a1208ace5369b504cb41149965vandwalle     * although it may have been self added we will not re-self-add it, ignore it,
5888f13548615f647a1208ace5369b504cb41149965vandwalle     * not return it to applications, and not connect to it
589d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle     * */
5902ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
5912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide
5922ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * network was temporary disabled due to bad connection, most likely due
5932ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * to weak RSSI */
594d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle    public static final int AUTO_JOIN_TEMPORARY_DISABLED  = 1;
5952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide
5962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * network was temporary disabled due to bad connection, which cant be attributed
5972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * to weak RSSI */
5982ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static final int AUTO_JOIN_TEMPORARY_DISABLED_LINK_ERRORS  = 32;
5992ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide */
6002ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static final int AUTO_JOIN_TEMPORARY_DISABLED_AT_SUPPLICANT  = 64;
6017c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide */
6028f13548615f647a1208ace5369b504cb41149965vandwalle    public static final int AUTO_JOIN_DISABLED_ON_AUTH_FAILURE  = 128;
6038f13548615f647a1208ace5369b504cb41149965vandwalle    /** @hide */
60494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    public static final int AUTO_JOIN_DISABLED_NO_CREDENTIALS = 160;
60594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    /** @hide */
60694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    public static final int AUTO_JOIN_DISABLED_USER_ACTION = 161;
60794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle
60894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    /** @hide */
6098f13548615f647a1208ace5369b504cb41149965vandwalle    public static final int AUTO_JOIN_DELETED  = 200;
610d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle
6117c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
6127c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
6137c3606c103e95d3991267cca2592402a68779cafvandwalle     */
6147c3606c103e95d3991267cca2592402a68779cafvandwalle    public int autoJoinStatus;
6157c3606c103e95d3991267cca2592402a68779cafvandwalle
616154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
617154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
618154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Number of connection failures
619154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
620154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public int numConnectionFailures;
6212ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
6222ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /**
6232ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * @hide
624154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time we blacklisted the configuration
6252ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
6262ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public long blackListTimestamp;
6272ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
628111fa0274d1d6620f9634783585387f3b773949evandwalle    /**
629111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
630154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system was connected to this configuration.
631111fa0274d1d6620f9634783585387f3b773949evandwalle     */
632111fa0274d1d6620f9634783585387f3b773949evandwalle    public long lastConnected;
633111fa0274d1d6620f9634783585387f3b773949evandwalle
634111fa0274d1d6620f9634783585387f3b773949evandwalle    /**
635111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
636154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system tried to connect and failed.
637154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
638154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public long lastConnectionFailure;
639154b2cf6bbb99ee258b289846183172139a87dbavandwalle
640154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
641154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
642154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system was disconnected to this configuration.
643111fa0274d1d6620f9634783585387f3b773949evandwalle     */
644111fa0274d1d6620f9634783585387f3b773949evandwalle    public long lastDisconnected;
6452ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
6467c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
647e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     * Set if the configuration was self added by the framework
6488f13548615f647a1208ace5369b504cb41149965vandwalle     * This boolean is cleared if we get a connect/save/ update or
6498f13548615f647a1208ace5369b504cb41149965vandwalle     * any wifiManager command that indicate the user interacted with the configuration
6508f13548615f647a1208ace5369b504cb41149965vandwalle     * since we will now consider that the configuration belong to him.
651e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     * @hide
652e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     */
653e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle    public boolean selfAdded;
654e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle
655e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle    /**
6568f13548615f647a1208ace5369b504cb41149965vandwalle     * Set if the configuration was self added by the framework
6578f13548615f647a1208ace5369b504cb41149965vandwalle     * This boolean is set once and never cleared. It is used
6588f13548615f647a1208ace5369b504cb41149965vandwalle     * so as we never loose track of who created the
6598f13548615f647a1208ace5369b504cb41149965vandwalle     * configuration in the first place.
6608f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
6618f13548615f647a1208ace5369b504cb41149965vandwalle     */
6628f13548615f647a1208ace5369b504cb41149965vandwalle    public boolean didSelfAdd;
6638f13548615f647a1208ace5369b504cb41149965vandwalle
6648f13548615f647a1208ace5369b504cb41149965vandwalle    /**
665154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Peer WifiConfiguration this WifiConfiguration was added for
6662d0f71eea20470985abde98d759910a1ac40b257vandwalle     * @hide
6672d0f71eea20470985abde98d759910a1ac40b257vandwalle     */
6682d0f71eea20470985abde98d759910a1ac40b257vandwalle    public String peerWifiConfiguration;
6692d0f71eea20470985abde98d759910a1ac40b257vandwalle
6702d0f71eea20470985abde98d759910a1ac40b257vandwalle    /**
6717c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
6727c3606c103e95d3991267cca2592402a68779cafvandwalle     * Indicate that a WifiConfiguration is temporary and should not be saved
6737c3606c103e95d3991267cca2592402a68779cafvandwalle     * nor considered by AutoJoin.
6747c3606c103e95d3991267cca2592402a68779cafvandwalle     */
6757c3606c103e95d3991267cca2592402a68779cafvandwalle    public boolean ephemeral;
6767c3606c103e95d3991267cca2592402a68779cafvandwalle
6777c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
6787c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
67994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     * Indicate that we didn't auto-join because rssi was too low
68094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     */
68194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    public boolean autoJoinBailedDueToLowRssi;
68294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle
68394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    /**
68494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     * @hide
68594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     * AutoJoin even though RSSI is 10dB below threshold
68694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     */
68794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    public int autoJoinUseAggressiveJoinAttemptThreshold;
68894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle
68994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle    /**
69094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle     * @hide
691154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Number of time the scorer overrode a the priority based choice, when comparing two
692154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * WifiConfigurations, note that since comparing WifiConfiguration happens very often
693154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * potentially at every scan, this number might become very large, even on an idle
694154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * system.
695154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
696154b2cf6bbb99ee258b289846183172139a87dbavandwalle    @SystemApi
697154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public int numScorerOverride;
698154b2cf6bbb99ee258b289846183172139a87dbavandwalle
699154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
700154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
701154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Number of time the scorer overrode a the priority based choice, and the comparison
702154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * triggered a network switch
703154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
704154b2cf6bbb99ee258b289846183172139a87dbavandwalle    @SystemApi
705154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public int numScorerOverrideAndSwitchedNetwork;
706154b2cf6bbb99ee258b289846183172139a87dbavandwalle
707154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
708154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
7094eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * Number of time we associated to this configuration.
7104eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
7114eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    @SystemApi
7124eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public int numAssociation;
7134eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
714448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
715448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
716448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of time user disabled WiFi while associated to this configuration with Low RSSI.
717448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
718448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numUserTriggeredWifiDisableLowRSSI;
719448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
720448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
721448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
722448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of time user disabled WiFi while associated to this configuration with Bad RSSI.
723448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
724448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numUserTriggeredWifiDisableBadRSSI;
725448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
726448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
727448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
728448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of time user disabled WiFi while associated to this configuration
729448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * and RSSI was not HIGH.
730448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
731448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numUserTriggeredWifiDisableNotHighRSSI;
732448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
733448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
734448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
735448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of ticks associated to this configuration with Low RSSI.
736448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
737448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numTicksAtLowRSSI;
738448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
739448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
740448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
741448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of ticks associated to this configuration with Bad RSSI.
742448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
743448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numTicksAtBadRSSI;
744448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
745448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
746448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
747448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of ticks associated to this configuration
748448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * and RSSI was not HIGH.
749448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
750448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numTicksAtNotHighRSSI;
751448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
752448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
753448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of time user (WifiManager) triggered association to this configuration.
754448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * TODO: count this only for Wifi Settings uuid, so as to not count 3rd party apps
755448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
756448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numUserTriggeredJoinAttempts;
7574eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
7584eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /**
7594eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * @hide
7607c3606c103e95d3991267cca2592402a68779cafvandwalle     * Connect choices
7617c3606c103e95d3991267cca2592402a68779cafvandwalle     *
7627c3606c103e95d3991267cca2592402a68779cafvandwalle     * remember the keys identifying the known WifiConfiguration over which this configuration
7637c3606c103e95d3991267cca2592402a68779cafvandwalle     * was preferred by user or a "WiFi Network Management app", that is,
7647c3606c103e95d3991267cca2592402a68779cafvandwalle     * a WifiManager.CONNECT_NETWORK or SELECT_NETWORK was received while this configuration
7657c3606c103e95d3991267cca2592402a68779cafvandwalle     * was visible to the user:
7667c3606c103e95d3991267cca2592402a68779cafvandwalle     * configKey is : "SSID"-WEP-WPA_PSK-WPA_EAP
7677c3606c103e95d3991267cca2592402a68779cafvandwalle     *
7687c3606c103e95d3991267cca2592402a68779cafvandwalle     * The integer represents the configuration's RSSI at that time (useful?)
7697c3606c103e95d3991267cca2592402a68779cafvandwalle     *
7707c3606c103e95d3991267cca2592402a68779cafvandwalle     * The overall auto-join algorithm make use of past connect choice so as to sort configuration,
7717c3606c103e95d3991267cca2592402a68779cafvandwalle     * the exact algorithm still fluctuating as of 5/7/2014
7727c3606c103e95d3991267cca2592402a68779cafvandwalle     *
7737c3606c103e95d3991267cca2592402a68779cafvandwalle     */
7747c3606c103e95d3991267cca2592402a68779cafvandwalle    public HashMap<String, Integer> connectChoices;
7757c3606c103e95d3991267cca2592402a68779cafvandwalle
7767c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
7777c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
7787c3606c103e95d3991267cca2592402a68779cafvandwalle     * Linked Configurations: represent the set of Wificonfigurations that are equivalent
7797c3606c103e95d3991267cca2592402a68779cafvandwalle     * regarding roaming and auto-joining.
7807c3606c103e95d3991267cca2592402a68779cafvandwalle     * The linked configuration may or may not have same SSID, and may or may not have same
7817c3606c103e95d3991267cca2592402a68779cafvandwalle     * credentials.
7827c3606c103e95d3991267cca2592402a68779cafvandwalle     * For instance, linked configurations will have same defaultGwMacAddress or same dhcp server.
7837c3606c103e95d3991267cca2592402a68779cafvandwalle     */
7847c3606c103e95d3991267cca2592402a68779cafvandwalle    public HashMap<String, Integer>  linkedConfigurations;
7857c3606c103e95d3991267cca2592402a68779cafvandwalle
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiConfiguration() {
7875ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff        networkId = INVALID_NETWORK_ID;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SSID = null;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BSSID = null;
7908a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng        FQDN = null;
7918a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng        naiRealm = null;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        priority = 0;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hiddenSSID = false;
7948dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy        disableReason = DISABLED_UNKNOWN_REASON;
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedKeyManagement = new BitSet();
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedProtocols = new BitSet();
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedAuthAlgorithms = new BitSet();
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedPairwiseCiphers = new BitSet();
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedGroupCiphers = new BitSet();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wepKeys = new String[4];
8019b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (int i = 0; i < wepKeys.length; i++) {
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wepKeys[i] = null;
8034337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang        }
8049b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        enterpriseConfig = new WifiEnterpriseConfig();
8057c3606c103e95d3991267cca2592402a68779cafvandwalle        autoJoinStatus = AUTO_JOIN_ENABLED;
806e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        selfAdded = false;
8078f13548615f647a1208ace5369b504cb41149965vandwalle        didSelfAdd = false;
808e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        ephemeral = false;
809448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        noInternetAccess = false;
8106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration = new IpConfiguration();
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    /**
81410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     * indicates whether the configuration is valid
81510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     * @return true if valid, false otherwise
81610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     * @hide
81710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     */
81810652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    public boolean isValid() {
81960a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle
82060a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle        if (allowedKeyManagement == null)
82160a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle            return false;
82260a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle
82310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde        if (allowedKeyManagement.cardinality() > 1) {
8243b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            if (allowedKeyManagement.cardinality() != 2) {
8253b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde                return false;
8263b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            }
8273b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            if (allowedKeyManagement.get(KeyMgmt.WPA_EAP) == false) {
8283b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde                return false;
8293b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            }
8302871588101c9bf1e6c9573599dee9be106466175Vinit Deshapnde            if ((allowedKeyManagement.get(KeyMgmt.IEEE8021X) == false)
8312871588101c9bf1e6c9573599dee9be106466175Vinit Deshapnde                    && (allowedKeyManagement.get(KeyMgmt.WPA_PSK) == false)) {
8323b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde                return false;
8333b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde            }
83410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde        }
83510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde
83610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde        // TODO: Add more checks
83710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde        return true;
838111fa0274d1d6620f9634783585387f3b773949evandwalle    }
8397c3606c103e95d3991267cca2592402a68779cafvandwalle
840111fa0274d1d6620f9634783585387f3b773949evandwalle    /**
841111fa0274d1d6620f9634783585387f3b773949evandwalle     * Helper function, identify if a configuration is linked
842111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
843111fa0274d1d6620f9634783585387f3b773949evandwalle     */
844111fa0274d1d6620f9634783585387f3b773949evandwalle    public boolean isLinked(WifiConfiguration config) {
845111fa0274d1d6620f9634783585387f3b773949evandwalle        if (config.linkedConfigurations != null && linkedConfigurations != null) {
846111fa0274d1d6620f9634783585387f3b773949evandwalle            if (config.linkedConfigurations.get(configKey()) != null
847111fa0274d1d6620f9634783585387f3b773949evandwalle                    && linkedConfigurations.get(config.configKey()) != null) {
848111fa0274d1d6620f9634783585387f3b773949evandwalle                return true;
849111fa0274d1d6620f9634783585387f3b773949evandwalle            }
850111fa0274d1d6620f9634783585387f3b773949evandwalle        }
851111fa0274d1d6620f9634783585387f3b773949evandwalle        return  false;
8527c3606c103e95d3991267cca2592402a68779cafvandwalle    }
8537c3606c103e95d3991267cca2592402a68779cafvandwalle
8547c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
8557c3606c103e95d3991267cca2592402a68779cafvandwalle     * most recent time we have seen this configuration
8567c3606c103e95d3991267cca2592402a68779cafvandwalle     * @return most recent scanResult
8577c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
8587c3606c103e95d3991267cca2592402a68779cafvandwalle     */
8597c3606c103e95d3991267cca2592402a68779cafvandwalle    public ScanResult lastSeen() {
8607c3606c103e95d3991267cca2592402a68779cafvandwalle        ScanResult mostRecent = null;
8617c3606c103e95d3991267cca2592402a68779cafvandwalle
8627c3606c103e95d3991267cca2592402a68779cafvandwalle        if (scanResultCache == null) {
8637c3606c103e95d3991267cca2592402a68779cafvandwalle            return null;
8647c3606c103e95d3991267cca2592402a68779cafvandwalle        }
8657c3606c103e95d3991267cca2592402a68779cafvandwalle
8667c3606c103e95d3991267cca2592402a68779cafvandwalle        for (ScanResult result : scanResultCache.values()) {
8677c3606c103e95d3991267cca2592402a68779cafvandwalle            if (mostRecent == null) {
8687c3606c103e95d3991267cca2592402a68779cafvandwalle                if (result.seen != 0)
8697c3606c103e95d3991267cca2592402a68779cafvandwalle                   mostRecent = result;
8707c3606c103e95d3991267cca2592402a68779cafvandwalle            } else {
8717c3606c103e95d3991267cca2592402a68779cafvandwalle                if (result.seen > mostRecent.seen) {
8727c3606c103e95d3991267cca2592402a68779cafvandwalle                   mostRecent = result;
8737c3606c103e95d3991267cca2592402a68779cafvandwalle                }
8747c3606c103e95d3991267cca2592402a68779cafvandwalle            }
8757c3606c103e95d3991267cca2592402a68779cafvandwalle        }
8767c3606c103e95d3991267cca2592402a68779cafvandwalle        return mostRecent;
87710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    }
87810652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde
8792ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** @hide **/
8802ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public void setAutoJoinStatus(int status) {
881111fa0274d1d6620f9634783585387f3b773949evandwalle        if (status < 0) status = 0;
8822ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        if (status == 0) {
8832ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            blackListTimestamp = 0;
8842ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        }  else if (status > autoJoinStatus) {
8852ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            blackListTimestamp = System.currentTimeMillis();
8862ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        }
8872ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        autoJoinStatus = status;
8882ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    }
8892ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
8908dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    @Override
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
8928dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy        StringBuilder sbuf = new StringBuilder();
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.status == WifiConfiguration.Status.CURRENT) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sbuf.append("* ");
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (this.status == WifiConfiguration.Status.DISABLED) {
8968dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy            sbuf.append("- DSBLE: ").append(this.disableReason).append(" ");
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append("ID: ").append(this.networkId).append(" SSID: ").append(this.SSID).
8998a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng                append(" BSSID: ").append(this.BSSID).append(" FQDN: ").append(this.FQDN).
9008a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng                append(" REALM: ").append(this.naiRealm).append(" PRIO: ").append(this.priority).
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                append('\n');
90216a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        if (this.numConnectionFailures > 0) {
90316a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle            sbuf.append(" numConnectFailures ").append(this.numConnectionFailures).append("\n");
90416a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        }
90516a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        if (this.autoJoinStatus > 0) {
90616a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle            sbuf.append(" autoJoinStatus ").append(this.numConnectionFailures).append("\n");
90716a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        }
90894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.didSelfAdd) sbuf.append(" didSelfAdd");
90994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.selfAdded) sbuf.append(" selfAdded");
91094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.noInternetAccess) sbuf.append(" noInternetAccess");
91194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.didSelfAdd || this.selfAdded || this.noInternetAccess) {
91216a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle            sbuf.append("\n");
91316a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        }
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" KeyMgmt:");
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int k = 0; k < this.allowedKeyManagement.size(); k++) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedKeyManagement.get(k)) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (k < KeyMgmt.strings.length) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(KeyMgmt.strings[k]);
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" Protocols:");
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int p = 0; p < this.allowedProtocols.size(); p++) {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedProtocols.get(p)) {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p < Protocol.strings.length) {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(Protocol.strings[p]);
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" AuthAlgorithms:");
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int a = 0; a < this.allowedAuthAlgorithms.size(); a++) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedAuthAlgorithms.get(a)) {
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a < AuthAlgorithm.strings.length) {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(AuthAlgorithm.strings[a]);
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" PairwiseCiphers:");
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int pc = 0; pc < this.allowedPairwiseCiphers.size(); pc++) {
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedPairwiseCiphers.get(pc)) {
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pc < PairwiseCipher.strings.length) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(PairwiseCipher.strings[pc]);
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" GroupCiphers:");
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int gc = 0; gc < this.allowedGroupCiphers.size(); gc++) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedGroupCiphers.get(gc)) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (gc < GroupCipher.strings.length) {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(GroupCipher.strings[gc]);
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9725069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        sbuf.append('\n').append(" PSK: ");
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.preSharedKey != null) {
9745069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang            sbuf.append('*');
9755069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        }
97694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("\nEnterprise config:\n");
9779b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        sbuf.append(enterpriseConfig);
9789b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff
97994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("IP config:\n");
9806346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        sbuf.append(mIpConfiguration.toString());
981128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
98294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.creatorUid != 0)  sbuf.append(" uid=" + Integer.toString(creatorUid));
98394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.autoJoinBSSID != null) sbuf.append(" autoJoinBSSID=" + autoJoinBSSID);
98494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        long now_ms = System.currentTimeMillis();
985448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        if (this.blackListTimestamp != 0) {
98694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
987448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            long diff = now_ms - this.blackListTimestamp;
9882ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            if (diff <= 0) {
98994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append(" blackListed since <incorrect>");
9902ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            } else {
99194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append(" blackListed: ").append(Long.toString(diff/1000)).append( "sec");
99294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            }
99394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        }
99494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.lastConnected != 0) {
99594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
99694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            long diff = now_ms - this.lastConnected;
99794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            if (diff <= 0) {
99894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append("lastConnected since <incorrect>");
99994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            } else {
100094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append("lastConnected: ").append(Long.toString(diff/1000)).append( "sec");
100194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            }
100294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        }
100394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.lastConnectionFailure != 0) {
100494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
100594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            long diff = now_ms - this.lastConnectionFailure;
100694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            if (diff <= 0) {
100794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append("lastConnectionFailure since <incorrect>");
100894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            } else {
100994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append("lastConnectionFailure: ").append(Long.toString(diff/1000));
101094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append( "sec");
10112ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            }
10122ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        }
1013448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        sbuf.append('\n');
1014448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        if (this.linkedConfigurations != null) {
1015448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            for(String key : this.linkedConfigurations.keySet()) {
1016448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                sbuf.append(" linked: ").append(key);
1017448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                sbuf.append('\n');
1018448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            }
1019448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        }
1020448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        if (this.connectChoices != null) {
1021448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            for(String key : this.connectChoices.keySet()) {
1022448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                Integer choice = this.connectChoices.get(key);
1023448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                if (choice != null) {
1024448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                    sbuf.append(" choice: ").append(key);
1025448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                    sbuf.append(" = ").append(choice);
1026448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                    sbuf.append('\n');
1027448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                }
1028448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            }
1029448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        }
103094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.scanResultCache != null) {
103194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append("scan cache:  ");
103294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            for(ScanResult result : this.scanResultCache.values()) {
103394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append("{").append(result.BSSID).append(",").append(result.frequency);
103494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append(",").append(result.level).append(",st=");
103594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append(result.autoJoinStatus).append("} ");
103694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            }
103794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
103894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        }
103994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("triggeredLow: ").append(this.numUserTriggeredWifiDisableLowRSSI);
104094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(" triggeredBad: ").append(this.numUserTriggeredWifiDisableBadRSSI);
104194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(" triggeredNotHigh: ").append(this.numUserTriggeredWifiDisableNotHighRSSI);
104294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append('\n');
104394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("ticksLow: ").append(this.numTicksAtLowRSSI);
104494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(" ticksBad: ").append(this.numTicksAtBadRSSI);
104594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(" ticksNotHigh: ").append(this.numTicksAtNotHighRSSI);
1046448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        sbuf.append('\n');
104794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("triggeredJoin: ").append(this.numUserTriggeredJoinAttempts);
1048448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        sbuf.append('\n');
104994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("autoJoinBailedDueToLowRssi: ").append(this.autoJoinBailedDueToLowRssi);
105094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append('\n');
105194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("autoJoinUseAggressiveJoinAttemptThreshold: ");
105294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(this.autoJoinUseAggressiveJoinAttemptThreshold);
1053448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        sbuf.append('\n');
10548f13548615f647a1208ace5369b504cb41149965vandwalle
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sbuf.toString();
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Construct a WifiConfiguration from a scanned network
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scannedAP the scan result used to construct the config entry
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: figure out whether this is a useful way to construct a new entry.
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiConfiguration(ScanResult scannedAP) {
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        networkId = -1;
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SSID = scannedAP.SSID;
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BSSID = scannedAP.BSSID;
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1070b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** {@hide} */
1071b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public String getPrintableSsid() {
1072b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (SSID == null) return "";
1073b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        final int length = SSID.length();
1074b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (length > 2 && (SSID.charAt(0) == '"') && SSID.charAt(length - 1) == '"') {
1075b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return SSID.substring(1, length - 1);
1076b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
1077b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
1078b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        /** The ascii-encoded string format is P"<ascii-encoded-string>"
1079b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         * The decoding is implemented in the supplicant for a newly configured
1080b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         * network.
1081b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         */
1082b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (length > 3 && (SSID.charAt(0) == 'P') && (SSID.charAt(1) == '"') &&
1083b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                (SSID.charAt(length-1) == '"')) {
1084b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded(
1085b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    SSID.substring(2, length - 1));
1086b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return wifiSsid.toString();
1087b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
1088b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return SSID;
1089b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
1090b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
109126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    /**
109226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * Get an identifier for associating credentials with this config
109326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @param current configuration contains values for additional fields
109426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     *                that are not part of this configuration. Used
109526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     *                when a config with some fields is passed by an application.
109626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @throws IllegalStateException if config is invalid for key id generation
109726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @hide
109826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     */
1099ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public String getKeyIdForCredentials(WifiConfiguration current) {
110026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        String keyMgmt = null;
110126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
110226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        try {
110326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            // Get current config details for fields that are not initialized
110426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (TextUtils.isEmpty(SSID)) SSID = current.SSID;
110526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.cardinality() == 0) {
110626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                allowedKeyManagement = current.allowedKeyManagement;
110726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
110826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
110926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                keyMgmt = KeyMgmt.strings[KeyMgmt.WPA_EAP];
111026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
111126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
111226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                keyMgmt += KeyMgmt.strings[KeyMgmt.IEEE8021X];
111326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
111426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
111526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (TextUtils.isEmpty(keyMgmt)) {
111626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                throw new IllegalStateException("Not an EAP network");
111726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
111826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
111926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            return trimStringForKeyId(SSID) + "_" + keyMgmt + "_" +
112026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                    trimStringForKeyId(enterpriseConfig.getKeyId(current != null ?
112126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                            current.enterpriseConfig : null));
112226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        } catch (NullPointerException e) {
112326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            throw new IllegalStateException("Invalid config details");
112426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        }
112526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    }
112626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
112726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    private String trimStringForKeyId(String string) {
112826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        // Remove quotes and spaces
112926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        return string.replace("\"", "").replace(" ", "");
113026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    }
113126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static BitSet readBitSet(Parcel src) {
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cardinality = src.readInt();
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BitSet set = new BitSet();
11369b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (int i = 0; i < cardinality; i++) {
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            set.set(src.readInt());
11389b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return set;
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void writeBitSet(Parcel dest, BitSet set) {
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nextSetBit = -1;
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(set.cardinality());
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11489b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) {
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(nextSetBit);
11509b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1153ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    /** @hide */
1154ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    public int getAuthType() {
11550fd3b1be14ec6b6ba33140efa321b27dc3bf2862Vinit Deshapnde        if (isValid() == false) {
11560fd3b1be14ec6b6ba33140efa321b27dc3bf2862Vinit Deshapnde            throw new IllegalStateException("Invalid configuration");
115726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        }
1158ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
1159ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA_PSK;
1160ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.WPA2_PSK)) {
1161ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA2_PSK;
1162ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
1163ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA_EAP;
1164ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
1165ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.IEEE8021X;
1166ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        }
1167ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        return KeyMgmt.NONE;
1168ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    }
1169ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff
11707c3606c103e95d3991267cca2592402a68779cafvandwalle    /* @hide
11717c3606c103e95d3991267cca2592402a68779cafvandwalle     * Cache the config key, this seems useful as a speed up since a lot of
11727c3606c103e95d3991267cca2592402a68779cafvandwalle     * lookups in the config store are done and based on this key.
11737c3606c103e95d3991267cca2592402a68779cafvandwalle     */
11747c3606c103e95d3991267cca2592402a68779cafvandwalle    String mCachedConfigKey;
11757c3606c103e95d3991267cca2592402a68779cafvandwalle
11767c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
11777c3606c103e95d3991267cca2592402a68779cafvandwalle     *  return the string used to calculate the hash in WifiConfigStore
11787c3606c103e95d3991267cca2592402a68779cafvandwalle     *  and uniquely identify this WifiConfiguration
11797c3606c103e95d3991267cca2592402a68779cafvandwalle     */
11807c3606c103e95d3991267cca2592402a68779cafvandwalle    public String configKey(boolean allowCached) {
11817c3606c103e95d3991267cca2592402a68779cafvandwalle        String key;
11827c3606c103e95d3991267cca2592402a68779cafvandwalle        if (allowCached && mCachedConfigKey != null) {
11837c3606c103e95d3991267cca2592402a68779cafvandwalle            key = mCachedConfigKey;
11847c3606c103e95d3991267cca2592402a68779cafvandwalle        } else {
11857c3606c103e95d3991267cca2592402a68779cafvandwalle            key = this.SSID;
11867c3606c103e95d3991267cca2592402a68779cafvandwalle            if (key == null)
11877c3606c103e95d3991267cca2592402a68779cafvandwalle                key = "";
11887c3606c103e95d3991267cca2592402a68779cafvandwalle            if (this.wepKeys[0] != null) {
11897c3606c103e95d3991267cca2592402a68779cafvandwalle                key = key + "-WEP";
11907c3606c103e95d3991267cca2592402a68779cafvandwalle            }
11917c3606c103e95d3991267cca2592402a68779cafvandwalle            if (this.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
11927c3606c103e95d3991267cca2592402a68779cafvandwalle                key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_PSK];
11937c3606c103e95d3991267cca2592402a68779cafvandwalle            }
11947c3606c103e95d3991267cca2592402a68779cafvandwalle            if (this.allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
11957c3606c103e95d3991267cca2592402a68779cafvandwalle                    this.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
11967c3606c103e95d3991267cca2592402a68779cafvandwalle                key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_EAP];
11977c3606c103e95d3991267cca2592402a68779cafvandwalle            }
11987c3606c103e95d3991267cca2592402a68779cafvandwalle            mCachedConfigKey = key;
11997c3606c103e95d3991267cca2592402a68779cafvandwalle        }
12007c3606c103e95d3991267cca2592402a68779cafvandwalle        return key;
12017c3606c103e95d3991267cca2592402a68779cafvandwalle    }
12027c3606c103e95d3991267cca2592402a68779cafvandwalle
12037c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
12047c3606c103e95d3991267cca2592402a68779cafvandwalle     * get configKey, force calculating the config string
12057c3606c103e95d3991267cca2592402a68779cafvandwalle     */
12067c3606c103e95d3991267cca2592402a68779cafvandwalle    public String configKey() {
12077c3606c103e95d3991267cca2592402a68779cafvandwalle        return configKey(false);
12087c3606c103e95d3991267cca2592402a68779cafvandwalle    }
12097c3606c103e95d3991267cca2592402a68779cafvandwalle
121013f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle    /** @hide
121113f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle     * return the config key string based on a scan result
121213f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle     */
121313f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle    static public String configKey(ScanResult result) {
121413f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle        String key = "\"" + result.SSID + "\"";
121513f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle
121613f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle        if (result.capabilities.contains("WEP")) {
121713f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle            key = key + "-WEP";
121813f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle        }
121913f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle
122013f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle        if (result.capabilities.contains("PSK")) {
122113f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle            key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_PSK];
122213f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle        }
122313f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle
122413f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle        if (result.capabilities.contains("EAP")) {
122513f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle            key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_EAP];
122613f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle        }
122713f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle
122813f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle        return key;
122913f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle    }
12307c3606c103e95d3991267cca2592402a68779cafvandwalle
12316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration getIpConfiguration() {
12336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration;
12346346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12356346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
12366346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12376346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setIpConfiguration(IpConfiguration ipConfiguration) {
12386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration = ipConfiguration;
12396346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12406346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
12416346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12420a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public StaticIpConfiguration getStaticIpConfiguration() {
12430a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return mIpConfiguration.getStaticIpConfiguration();
12446346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
12466346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12470a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setStaticIpConfiguration(StaticIpConfiguration staticIpConfiguration) {
12480a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        mIpConfiguration.setStaticIpConfiguration(staticIpConfiguration);
12496346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12506346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
12516346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12526346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration.IpAssignment getIpAssignment() {
12536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration.ipAssignment;
12546346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12556346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
12566346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12576346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setIpAssignment(IpConfiguration.IpAssignment ipAssignment) {
12586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.ipAssignment = ipAssignment;
12596346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12606346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
12616346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12626346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration.ProxySettings getProxySettings() {
12636346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration.proxySettings;
12646346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12656346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
12666346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12676346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setProxySettings(IpConfiguration.ProxySettings proxySettings) {
12686346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.proxySettings = proxySettings;
12696346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12706346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
12716346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
12720a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public ProxyInfo getHttpProxy() {
12730a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return mIpConfiguration.httpProxy;
12740a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
12750a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
12760a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    /** @hide */
12770a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setHttpProxy(ProxyInfo httpProxy) {
12780a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        mIpConfiguration.httpProxy = httpProxy;
12790a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
12800a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
12810a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    /** @hide */
12826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setProxy(ProxySettings settings, ProxyInfo proxy) {
12836346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.proxySettings = settings;
12840a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        mIpConfiguration.httpProxy = proxy;
12856346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
12866346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
128713f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle    /** Implement the Parcelable interface {@hide} */
1288678979748585c5903125a404e448ad6c111dedadJaewan Kim    public int describeContents() {
1289678979748585c5903125a404e448ad6c111dedadJaewan Kim        return 0;
1290678979748585c5903125a404e448ad6c111dedadJaewan Kim    }
1291678979748585c5903125a404e448ad6c111dedadJaewan Kim
1292128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    /** copy constructor {@hide} */
1293128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    public WifiConfiguration(WifiConfiguration source) {
1294128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        if (source != null) {
1295128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            networkId = source.networkId;
1296128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            status = source.status;
12978136de08ff4b5c4cca11220143f5905dca38cc26Isaac Levy            disableReason = source.disableReason;
12988f13548615f647a1208ace5369b504cb41149965vandwalle            disableReason = source.disableReason;
1299128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            SSID = source.SSID;
1300128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            BSSID = source.BSSID;
13018a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng            FQDN = source.FQDN;
13028a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng            naiRealm = source.naiRealm;
1303128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            preSharedKey = source.preSharedKey;
1304128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
1305128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            wepKeys = new String[4];
13069b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            for (int i = 0; i < wepKeys.length; i++) {
1307128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff                wepKeys[i] = source.wepKeys[i];
13089b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            }
1309128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
1310128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            wepTxKeyIndex = source.wepTxKeyIndex;
1311128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            priority = source.priority;
1312128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            hiddenSSID = source.hiddenSSID;
1313128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedKeyManagement   = (BitSet) source.allowedKeyManagement.clone();
1314128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedProtocols       = (BitSet) source.allowedProtocols.clone();
1315128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedAuthAlgorithms  = (BitSet) source.allowedAuthAlgorithms.clone();
1316128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedPairwiseCiphers = (BitSet) source.allowedPairwiseCiphers.clone();
1317128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedGroupCiphers    = (BitSet) source.allowedGroupCiphers.clone();
1318128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
13199b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            enterpriseConfig = new WifiEnterpriseConfig(source.enterpriseConfig);
1320678979748585c5903125a404e448ad6c111dedadJaewan Kim
13217c3606c103e95d3991267cca2592402a68779cafvandwalle            defaultGwMacAddress = source.defaultGwMacAddress;
13227c3606c103e95d3991267cca2592402a68779cafvandwalle
13236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            mIpConfiguration = new IpConfiguration(source.mIpConfiguration);
13246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
13257c3606c103e95d3991267cca2592402a68779cafvandwalle            if ((source.scanResultCache != null) && (source.scanResultCache.size() > 0)) {
13267c3606c103e95d3991267cca2592402a68779cafvandwalle                scanResultCache = new HashMap<String, ScanResult>();
13277c3606c103e95d3991267cca2592402a68779cafvandwalle                scanResultCache.putAll(source.scanResultCache);
13287c3606c103e95d3991267cca2592402a68779cafvandwalle            }
13297c3606c103e95d3991267cca2592402a68779cafvandwalle
13307c3606c103e95d3991267cca2592402a68779cafvandwalle            if ((source.connectChoices != null) && (source.connectChoices.size() > 0)) {
13317c3606c103e95d3991267cca2592402a68779cafvandwalle                connectChoices = new HashMap<String, Integer>();
13327c3606c103e95d3991267cca2592402a68779cafvandwalle                connectChoices.putAll(source.connectChoices);
13337c3606c103e95d3991267cca2592402a68779cafvandwalle            }
13347c3606c103e95d3991267cca2592402a68779cafvandwalle
13357c3606c103e95d3991267cca2592402a68779cafvandwalle            if ((source.linkedConfigurations != null)
13367c3606c103e95d3991267cca2592402a68779cafvandwalle                    && (source.linkedConfigurations.size() > 0)) {
13377c3606c103e95d3991267cca2592402a68779cafvandwalle                linkedConfigurations = new HashMap<String, Integer>();
13387c3606c103e95d3991267cca2592402a68779cafvandwalle                linkedConfigurations.putAll(source.linkedConfigurations);
13397c3606c103e95d3991267cca2592402a68779cafvandwalle            }
13407c3606c103e95d3991267cca2592402a68779cafvandwalle            mCachedConfigKey = null; //force null configKey
13417c3606c103e95d3991267cca2592402a68779cafvandwalle            autoJoinStatus = source.autoJoinStatus;
1342e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle            selfAdded = source.selfAdded;
1343448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            noInternetAccess = source.noInternetAccess;
13447c3606c103e95d3991267cca2592402a68779cafvandwalle            if (source.visibility != null) {
13457c3606c103e95d3991267cca2592402a68779cafvandwalle                visibility = new Visibility(source.visibility);
13467c3606c103e95d3991267cca2592402a68779cafvandwalle            }
13473a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle
13483a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle            lastFailure = source.lastFailure;
13498f13548615f647a1208ace5369b504cb41149965vandwalle            didSelfAdd = source.didSelfAdd;
13508f13548615f647a1208ace5369b504cb41149965vandwalle            lastConnectUid = source.lastConnectUid;
13518f13548615f647a1208ace5369b504cb41149965vandwalle            lastUpdateUid = source.lastUpdateUid;
13528f13548615f647a1208ace5369b504cb41149965vandwalle            creatorUid = source.creatorUid;
13532d0f71eea20470985abde98d759910a1ac40b257vandwalle            peerWifiConfiguration = source.peerWifiConfiguration;
13542ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            blackListTimestamp = source.blackListTimestamp;
1355111fa0274d1d6620f9634783585387f3b773949evandwalle            lastConnected = source.lastConnected;
1356111fa0274d1d6620f9634783585387f3b773949evandwalle            lastDisconnected = source.lastDisconnected;
1357154b2cf6bbb99ee258b289846183172139a87dbavandwalle            lastConnectionFailure = source.lastConnectionFailure;
1358154b2cf6bbb99ee258b289846183172139a87dbavandwalle            numConnectionFailures = source.numConnectionFailures;
1359154b2cf6bbb99ee258b289846183172139a87dbavandwalle            numScorerOverride = source.numScorerOverride;
1360154b2cf6bbb99ee258b289846183172139a87dbavandwalle            numScorerOverrideAndSwitchedNetwork = source.numScorerOverrideAndSwitchedNetwork;
13614eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            numAssociation = source.numAssociation;
1362448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numUserTriggeredWifiDisableLowRSSI = source.numUserTriggeredWifiDisableLowRSSI;
1363448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numUserTriggeredWifiDisableBadRSSI = source.numUserTriggeredWifiDisableBadRSSI;
1364448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numUserTriggeredWifiDisableNotHighRSSI = source.numUserTriggeredWifiDisableNotHighRSSI;
1365448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numTicksAtLowRSSI = source.numTicksAtLowRSSI;
1366448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numTicksAtBadRSSI = source.numTicksAtBadRSSI;
1367448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numTicksAtNotHighRSSI = source.numTicksAtNotHighRSSI;
1368448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numUserTriggeredJoinAttempts = source.numUserTriggeredJoinAttempts;
1369e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle            autoJoinBSSID = source.autoJoinBSSID;
137094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            autoJoinUseAggressiveJoinAttemptThreshold
137194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                    = source.autoJoinUseAggressiveJoinAttemptThreshold;
137294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            autoJoinBailedDueToLowRssi = source.autoJoinBailedDueToLowRssi;
13736346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        }
13749e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff    }
13759e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff
13765fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    /** {@hide} */
13775fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    //public static final int NOTHING_TAG = 0;
13785fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    /** {@hide} */
13795fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    //public static final int SCAN_CACHE_TAG = 1;
13805fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
13826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    @Override
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int flags) {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(networkId);
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(status);
13868dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy        dest.writeInt(disableReason);
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(SSID);
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(BSSID);
1389e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        dest.writeString(autoJoinBSSID);
13908a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng        dest.writeString(FQDN);
13918a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng        dest.writeString(naiRealm);
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(preSharedKey);
13939b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (String wepKey : wepKeys) {
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeString(wepKey);
13959b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(wepTxKeyIndex);
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(priority);
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(hiddenSSID ? 1 : 0);
13995f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng        dest.writeInt(requirePMF ? 1 : 0);
14005f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng        dest.writeString(updateIdentifier);
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedKeyManagement);
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedProtocols);
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedAuthAlgorithms);
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedPairwiseCiphers);
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedGroupCiphers);
14074337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
14089b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        dest.writeParcelable(enterpriseConfig, flags);
1409678979748585c5903125a404e448ad6c111dedadJaewan Kim
14106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        dest.writeParcelable(mIpConfiguration, flags);
14117c3606c103e95d3991267cca2592402a68779cafvandwalle        dest.writeString(dhcpServer);
14127c3606c103e95d3991267cca2592402a68779cafvandwalle        dest.writeString(defaultGwMacAddress);
14137c3606c103e95d3991267cca2592402a68779cafvandwalle        dest.writeInt(autoJoinStatus);
1414e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        dest.writeInt(selfAdded ? 1 : 0);
14158f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(didSelfAdd ? 1 : 0);
1416448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(noInternetAccess ? 1 : 0);
14178f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(creatorUid);
14188f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(lastConnectUid);
14198f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(lastUpdateUid);
14202ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        dest.writeLong(blackListTimestamp);
1421154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeLong(lastConnectionFailure);
1422154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeInt(numConnectionFailures);
1423154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeInt(numScorerOverride);
1424154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeInt(numScorerOverrideAndSwitchedNetwork);
14254eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        dest.writeInt(numAssociation);
1426448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numUserTriggeredWifiDisableLowRSSI);
1427448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numUserTriggeredWifiDisableBadRSSI);
1428448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numUserTriggeredWifiDisableNotHighRSSI);
1429448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numTicksAtLowRSSI);
1430448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numTicksAtBadRSSI);
1431448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numTicksAtNotHighRSSI);
1432448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numUserTriggeredJoinAttempts);
143394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        dest.writeInt(autoJoinUseAggressiveJoinAttemptThreshold);
143494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        dest.writeInt(autoJoinBailedDueToLowRssi ? 1 : 0);
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<WifiConfiguration> CREATOR =
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Creator<WifiConfiguration>() {
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiConfiguration createFromParcel(Parcel in) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WifiConfiguration config = new WifiConfiguration();
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.networkId = in.readInt();
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.status = in.readInt();
14448dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy                config.disableReason = in.readInt();
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.SSID = in.readString();
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.BSSID = in.readString();
1447e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                config.autoJoinBSSID = in.readString();
14488a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng                config.FQDN = in.readString();
14498a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng                config.naiRealm = in.readString();
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.preSharedKey = in.readString();
14519b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                for (int i = 0; i < config.wepKeys.length; i++) {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    config.wepKeys[i] = in.readString();
14539b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.wepTxKeyIndex = in.readInt();
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.priority = in.readInt();
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.hiddenSSID = in.readInt() != 0;
14575f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng                config.requirePMF = in.readInt() != 0;
14585f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng                config.updateIdentifier = in.readString();
14595f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedKeyManagement   = readBitSet(in);
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedProtocols       = readBitSet(in);
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedAuthAlgorithms  = readBitSet(in);
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedPairwiseCiphers = readBitSet(in);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedGroupCiphers    = readBitSet(in);
14654337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
14669b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                config.enterpriseConfig = in.readParcelable(null);
146731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff
14686346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                config.mIpConfiguration = in.readParcelable(null);
14697c3606c103e95d3991267cca2592402a68779cafvandwalle                config.dhcpServer = in.readString();
14707c3606c103e95d3991267cca2592402a68779cafvandwalle                config.defaultGwMacAddress = in.readString();
14717c3606c103e95d3991267cca2592402a68779cafvandwalle                config.autoJoinStatus = in.readInt();
1472e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle                config.selfAdded = in.readInt() != 0;
14738f13548615f647a1208ace5369b504cb41149965vandwalle                config.didSelfAdd = in.readInt() != 0;
1474448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.noInternetAccess = in.readInt() != 0;
14758f13548615f647a1208ace5369b504cb41149965vandwalle                config.creatorUid = in.readInt();
14768f13548615f647a1208ace5369b504cb41149965vandwalle                config.lastConnectUid = in.readInt();
14778f13548615f647a1208ace5369b504cb41149965vandwalle                config.lastUpdateUid = in.readInt();
14782ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle                config.blackListTimestamp = in.readLong();
1479154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.lastConnectionFailure = in.readLong();
1480154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.numConnectionFailures = in.readInt();
1481154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.numScorerOverride = in.readInt();
1482154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.numScorerOverrideAndSwitchedNetwork = in.readInt();
14834eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle                config.numAssociation = in.readInt();
1484448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numUserTriggeredWifiDisableLowRSSI = in.readInt();
1485448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numUserTriggeredWifiDisableBadRSSI = in.readInt();
1486448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numUserTriggeredWifiDisableNotHighRSSI = in.readInt();
1487448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numTicksAtLowRSSI = in.readInt();
1488448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numTicksAtBadRSSI = in.readInt();
1489448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numTicksAtNotHighRSSI = in.readInt();
1490448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numUserTriggeredJoinAttempts = in.readInt();
149194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                config.autoJoinUseAggressiveJoinAttemptThreshold = in.readInt();
149294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                config.autoJoinBailedDueToLowRssi = in.readInt() != 0;
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return config;
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiConfiguration[] newArray(int size) {
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new WifiConfiguration[size];
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1501