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;
203e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faberimport android.content.pm.PackageManager;
216346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration;
226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration.ProxySettings;
236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.ProxyInfo;
240a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colittiimport android.net.StaticIpConfiguration;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.os.Parcelable;
276fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowskiimport android.os.UserHandle;
2826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriffimport android.text.TextUtils;
29aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport android.util.BackupUtils;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport java.io.ByteArrayOutputStream;
32aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport java.io.DataInputStream;
33aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport java.io.DataOutputStream;
34aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport java.io.IOException;
358d106780b6a638552749e54e169fc72537d4bcccxinheimport java.util.Arrays;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.BitSet;
378d106780b6a638552749e54e169fc72537d4bcccxinheimport java.util.HashMap;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class representing a configured Wi-Fi network, including the
419b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff * security configuration.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
43678979748585c5903125a404e448ad6c111dedadJaewan Kimpublic class WifiConfiguration implements Parcelable {
449b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    private static final String TAG = "WifiConfiguration";
45aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    /**
46aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * Current Version of the Backup Serializer.
47aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    */
48aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    private static final int BACKUP_VERSION = 2;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String ssidVarName = "ssid";
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String bssidVarName = "bssid";
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String pskVarName = "psk";
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String[] wepKeyVarNames = { "wep_key0", "wep_key1", "wep_key2", "wep_key3" };
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String wepTxKeyIdxVarName = "wep_tx_keyidx";
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String priorityVarName = "priority";
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String hiddenSSIDVarName = "scan_ssid";
635ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    /** {@hide} */
645f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public static final String pmfVarName = "ieee80211w";
655f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /** {@hide} */
665f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public static final String updateIdentiferVarName = "update_identifier";
675f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /** {@hide} */
685ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    public static final int INVALID_NETWORK_ID = -1;
69a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
70a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /** {@hide} */
71a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    private String mPasspointManagementObjectTree;
72a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized key management schemes.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class KeyMgmt {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private KeyMgmt() { }
785069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA is not used; plaintext or static WEP could be used. */
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int NONE = 0;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA pre-shared key (requires {@code preSharedKey} to be specified). */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA_PSK = 1;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA using EAP authentication. Generally used with an external authentication server. */
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA_EAP = 2;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** IEEE 802.1X using EAP authentication and (optionally) dynamically
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * generated WEP keys. */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int IEEE8021X = 3;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        /** WPA2 pre-shared key for use with soft access point
90ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          * (requires {@code preSharedKey} to be specified).
91ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          * @hide
92ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          */
93b625377b1a9b324254fcde9928eade4473712486Jeremy Klein        @SystemApi
94ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        public static final int WPA2_PSK = 4;
95a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        /**
96a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         * Hotspot 2.0 r2 OSEN:
97a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         * @hide
98a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         */
99a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final int OSEN = 5;
100ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff
1013ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart        /**
1023ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart         * IEEE 802.11r Fast BSS Transition with PSK authentication.
1033ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart         * @hide
1043ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart         */
1053ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart        public static final int FT_PSK = 6;
1063ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart
1073ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart        /**
1083ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart         * IEEE 802.11r Fast BSS Transition with EAP authentication.
1093ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart         * @hide
1103ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart         */
1113ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart        public static final int FT_EAP = 7;
1123ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "key_mgmt";
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
115ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP", "IEEE8021X",
1163ed7caa0f99c3c178fcf4376bad04b53cc90eb5bPaul Stewart                "WPA2_PSK", "OSEN", "FT_PSK", "FT_EAP" };
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1185069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized security protocols.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Protocol {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Protocol() { }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA/IEEE 802.11i/D3.0 */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA = 0;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA2/IEEE 802.11i */
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RSN = 1;
129a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        /** HS2.0 r2 OSEN
130a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         * @hide
131a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         */
132a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final int OSEN = 2;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "proto";
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
136a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final String[] strings = { "WPA", "RSN", "OSEN" };
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized IEEE 802.11 authentication algorithms.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class AuthAlgorithm {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private AuthAlgorithm() { }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Open System authentication (required for WPA/WPA2) */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int OPEN = 0;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Shared Key authentication (requires static WEP keys) */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int SHARED = 1;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** LEAP/Network EAP (only used with LEAP) */
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int LEAP = 2;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "auth_alg";
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "OPEN", "SHARED", "LEAP" };
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized pairwise ciphers for WPA.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class PairwiseCipher {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private PairwiseCipher() { }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Use only Group keys (deprecated) */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int NONE = 0;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TKIP = 1;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CCMP = 2;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "pairwise";
1715069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "NONE", "TKIP", "CCMP" };
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized group ciphers.
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <pre>
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11)
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </pre>
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class GroupCipher {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private GroupCipher() { }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11) */
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WEP40 = 0;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key */
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WEP104 = 1;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TKIP = 2;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CCMP = 3;
195a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        /** Hotspot 2.0 r2 OSEN
196a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         * @hide
197a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         */
198a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final int GTK_NOT_USED = 4;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "group";
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
202a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final String[] strings =
203a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande                { "WEP40", "WEP104", "TKIP", "CCMP", "GTK_NOT_USED" };
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Possible status of a network configuration. */
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Status {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Status() { }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** this is the network we are currently connected to */
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CURRENT = 0;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** supplicant will not attempt to use this network */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DISABLED = 1;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** supplicant will consider this network available for association */
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ENABLED = 2;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "current", "disabled", "enabled" };
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2208dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
2211ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti    public static final int UNKNOWN_UID = -1;
2221ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The ID number that the supplicant uses to identify this
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * network configuration entry. This must be passed as an argument
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to most calls into the supplicant.
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int networkId;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The current status of this network configuration entry.
2328d106780b6a638552749e54e169fc72537d4bcccxinhe     * Fixme We need remove this field to use only Quality network selection status only
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Status
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int status;
2368dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy
2378dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /**
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The network's SSID. Can either be an ASCII string,
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which must be enclosed in double quotation marks
2404e8620f868e2490782ebb960404140ea9482c91dBen Dodson     * (e.g., {@code "MyNetwork"}, or a string of
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * hex digits,which are not enclosed in quotes
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (e.g., {@code 01a243f405}).
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String SSID;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When set, this network configuration entry should only be used when
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associating with the AP having the specified BSSID. The value is
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a string in the format of an Ethernet MAC address, e.g.,
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>XX:XX:XX:XX:XX:XX</code> where each <code>X</code> is a hex digit.
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String BSSID;
252a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
253a0be0fb2709124a567f89114b1d8e80f74452edcxinhe    /**
254d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     * 2GHz band.
255d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     * @hide
256d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     */
257d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    public static final int AP_BAND_2GHZ = 0;
258d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu
259d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    /**
260d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     * 5GHz band.
261d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     * @hide
262d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     */
263d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    public static final int AP_BAND_5GHZ = 1;
264d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu
265d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    /**
266a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * The band which AP resides on
267a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * 0-2G  1-5G
268a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * By default, 2G is chosen
2697e5e791d22e76eb576fd5cf6dd5437b8050b0438xinhe     * @hide
270a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     */
271d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    public int apBand = AP_BAND_2GHZ;
272a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
273a0be0fb2709124a567f89114b1d8e80f74452edcxinhe    /**
274a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * The channel which AP resides on,currently, US only
275a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * 2G  1-11
276a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * 5G  36,40,44,48,149,153,157,161,165
277a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * 0 - find a random available channel according to the apBand
2787e5e791d22e76eb576fd5cf6dd5437b8050b0438xinhe     * @hide
279a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     */
280a0be0fb2709124a567f89114b1d8e80f74452edcxinhe    public int apChannel = 0;
281a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
2828a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng    /**
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pre-shared key for use with WPA-PSK.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the value of this key is read, the actual key is
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not returned, just a "*" if the key has a value, or the null
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * string otherwise.
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String preSharedKey;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Up to four WEP keys. Either an ASCII string enclosed in double
2924e8620f868e2490782ebb960404140ea9482c91dBen Dodson     * quotation marks (e.g., {@code "abcdef"} or a string
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of hex digits (e.g., {@code 0102030405}).
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the value of one of these keys is read, the actual key is
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not returned, just a "*" if the key has a value, or the null
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * string otherwise.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] wepKeys;
3005069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Default WEP key index, ranging from 0 to 3. */
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int wepTxKeyIndex;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Priority determines the preference given to a network by {@code wpa_supplicant}
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when choosing an access point with which to associate.
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int priority;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a network that does not broadcast its SSID, so an
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SSID-specific probe request must be used for scans.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hiddenSSID;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3175f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * This is a network that requries Protected Management Frames (PMF).
3185f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * @hide
3195f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     */
3205f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public boolean requirePMF;
3215f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
3225f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /**
3235f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * Update identifier, for Passpoint network.
3245f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * @hide
3255f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     */
3265f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public String updateIdentifier;
3275f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
3285f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /**
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of key management protocols supported by this configuration.
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link KeyMgmt} for descriptions of the values.
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to WPA-PSK WPA-EAP.
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedKeyManagement;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of security protocols supported by this configuration.
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link Protocol} for descriptions of the values.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to WPA RSN.
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedProtocols;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of authentication protocols supported by this configuration.
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link AuthAlgorithm} for descriptions of the values.
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to automatic selection.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedAuthAlgorithms;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of pairwise ciphers for WPA supported by this configuration.
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link PairwiseCipher} for descriptions of the values.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to CCMP TKIP.
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedPairwiseCiphers;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of group ciphers supported by this configuration.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link GroupCipher} for descriptions of the values.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to CCMP TKIP WEP104 WEP40.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedGroupCiphers;
3589b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    /**
35926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * The enterprise configuration details specifying the EAP method,
36026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * certificates and other settings associated with the EAP.
3619b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff     */
3629b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    public WifiEnterpriseConfig enterpriseConfig;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
364678979748585c5903125a404e448ad6c111dedadJaewan Kim    /**
365b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande     * Fully qualified domain name of a passpoint configuration
366b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande     */
367b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    public String FQDN;
368b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande
369b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    /**
370a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande     * Name of passpoint credential provider
371b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande     */
372b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    public String providerFriendlyName;
373b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande
374b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    /**
375a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande     * Roaming Consortium Id list for passpoint credential; identifies a set of networks where
376a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande     * passpoint credential will be considered valid
377b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande     */
3787226c8f95b5971af2710c8d2f8a8b6f2210e2420Vinit Deshpande    public long[] roamingConsortiumIds;
379b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande
380b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    /**
381678979748585c5903125a404e448ad6c111dedadJaewan Kim     * @hide
3826fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski     * This network configuration is visible to and usable by other users on the
3836fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski     * same device.
3846fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski     */
3856fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski    public boolean shared;
3866fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski
3876fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski    /**
3886fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski     * @hide
389678979748585c5903125a404e448ad6c111dedadJaewan Kim     */
3906346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    private IpConfiguration mIpConfiguration;
391678979748585c5903125a404e448ad6c111dedadJaewan Kim
392678979748585c5903125a404e448ad6c111dedadJaewan Kim    /**
393678979748585c5903125a404e448ad6c111dedadJaewan Kim     * @hide
3947c3606c103e95d3991267cca2592402a68779cafvandwalle     * dhcp server MAC address if known
3957c3606c103e95d3991267cca2592402a68779cafvandwalle     */
3967c3606c103e95d3991267cca2592402a68779cafvandwalle    public String dhcpServer;
3977c3606c103e95d3991267cca2592402a68779cafvandwalle
3987c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
3997c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
4007c3606c103e95d3991267cca2592402a68779cafvandwalle     * default Gateway MAC address if known
4017c3606c103e95d3991267cca2592402a68779cafvandwalle     */
4027c3606c103e95d3991267cca2592402a68779cafvandwalle    public String defaultGwMacAddress;
4037c3606c103e95d3991267cca2592402a68779cafvandwalle
4047c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
4057c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
4063a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle     * last failure
4073a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle     */
4083a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle    public String lastFailure;
4093a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle
4103a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle    /**
4113a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle     * @hide
412ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * last time we connected, this configuration had validated internet access
413448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
414ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    public boolean validatedInternetAccess;
415448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
416448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
417448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
418b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * The number of beacon intervals between Delivery Traffic Indication Maps (DTIM)
419b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * This value is populated from scan results that contain Beacon Frames, which are infrequent.
420b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * The value is not guaranteed to be set or current (Although it SHOULDNT change once set)
421b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * Valid values are from 1 - 255. Initialized here as 0, use this to check if set.
422b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     */
423b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne    public int dtimInterval = 0;
424b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne
425b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne    /**
426b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * @hide
4278f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of app creating the configuration
4288f13548615f647a1208ace5369b504cb41149965vandwalle     */
429adae06be9bfd8cb756e1793b52e682eb87258968Chelsea Derrick    @SystemApi
4308f13548615f647a1208ace5369b504cb41149965vandwalle    public int creatorUid;
4318f13548615f647a1208ace5369b504cb41149965vandwalle
4328f13548615f647a1208ace5369b504cb41149965vandwalle    /**
4338f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
4348f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of last app issuing a connection related command
4358f13548615f647a1208ace5369b504cb41149965vandwalle     */
4368f13548615f647a1208ace5369b504cb41149965vandwalle    public int lastConnectUid;
4378f13548615f647a1208ace5369b504cb41149965vandwalle
4388f13548615f647a1208ace5369b504cb41149965vandwalle    /**
4398f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
4408f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of last app modifying the configuration
4418f13548615f647a1208ace5369b504cb41149965vandwalle     */
442eb8f329a5e8d4df80447ab9676761f9743d20cd4Chelsea Derrick    @SystemApi
4438f13548615f647a1208ace5369b504cb41149965vandwalle    public int lastUpdateUid;
4448f13548615f647a1208ace5369b504cb41149965vandwalle
4458f13548615f647a1208ace5369b504cb41149965vandwalle    /**
4468f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
4473e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * Universal name for app creating the configuration
4483e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     *    see {#link {@link PackageManager#getNameForUid(int)}
4493e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
4503e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    @SystemApi
4513e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public String creatorName;
4523e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
4533e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
4543e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
4553e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * Universal name for app updating the configuration
4563e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     *    see {#link {@link PackageManager#getNameForUid(int)}
4573e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
4583e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    @SystemApi
4593e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public String lastUpdateName;
4603e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
4613e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
4623e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
4633e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * Status of user approval for connection
4643e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
4653e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public int userApproved = USER_UNSPECIFIED;
4663e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
4672ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** The Below RSSI thresholds are used to configure AutoJoin
4682ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     *  - GOOD/LOW/BAD thresholds are used so as to calculate link score
4692e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - UNWANTED_SOFT are used by the blacklisting logic so as to handle
4702e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the unwanted network message coming from CS
4712e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - UNBLACKLIST thresholds are used so as to tweak the speed at which
4722e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the network is unblacklisted (i.e. if
4732ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     *          it is seen with good RSSI, it is blacklisted faster)
4742e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - INITIAL_AUTOJOIN_ATTEMPT, used to determine how close from
4752e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the network we need to be before autojoin kicks in
4762ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
4777c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide **/
4787c3606c103e95d3991267cca2592402a68779cafvandwalle    public static int INVALID_RSSI = -127;
4797c3606c103e95d3991267cca2592402a68779cafvandwalle
4807c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
4817c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
482e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar     * Set to true if this is a Carrier Network, else set to false.
483e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar     */
484e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar    public boolean isCarrierNetwork = false;
485e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar
486e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar    /**
487e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar     * @hide
4887c3606c103e95d3991267cca2592402a68779cafvandwalle     * A summary of the RSSI and Band status for that configuration
4897c3606c103e95d3991267cca2592402a68779cafvandwalle     * This is used as a temporary value by the auto-join controller
4907c3606c103e95d3991267cca2592402a68779cafvandwalle     */
4916f6c781cca66cabc1f06be368a6dfedceb88ed0eVinit Deshpande    public static final class Visibility {
4927c3606c103e95d3991267cca2592402a68779cafvandwalle        public int rssi5;   // strongest 5GHz RSSI
4937c3606c103e95d3991267cca2592402a68779cafvandwalle        public int rssi24;  // strongest 2.4GHz RSSI
4947c3606c103e95d3991267cca2592402a68779cafvandwalle        public int num5;    // number of BSSIDs on 5GHz
4957c3606c103e95d3991267cca2592402a68779cafvandwalle        public int num24;   // number of BSSIDs on 2.4GHz
496e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public long age5;   // timestamp of the strongest 5GHz BSSID (last time it was seen)
497e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public long age24;  // timestamp of the strongest 2.4GHz BSSID (last time it was seen)
498e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public String BSSID24;
499e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public String BSSID5;
50072e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public int score; // Debug only, indicate last score used for autojoin/cell-handover
50172e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public int currentNetworkBoost; // Debug only, indicate boost applied to RSSI if current
50272e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public int bandPreferenceBoost; // Debug only, indicate boost applied to RSSI if current
50372e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public int lastChoiceBoost; // Debug only, indicate last choice applied to this configuration
50472e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public String lastChoiceConfig; // Debug only, indicate last choice applied to this configuration
5055fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
5065fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public Visibility() {
5077c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi5 = INVALID_RSSI;
5087c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi24 = INVALID_RSSI;
5097c3606c103e95d3991267cca2592402a68779cafvandwalle        }
5105fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
5115fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public Visibility(Visibility source) {
5127c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi5 = source.rssi5;
5137c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi24 = source.rssi24;
5147c3606c103e95d3991267cca2592402a68779cafvandwalle            age24 = source.age24;
5157c3606c103e95d3991267cca2592402a68779cafvandwalle            age5 = source.age5;
5167c3606c103e95d3991267cca2592402a68779cafvandwalle            num24 = source.num24;
5177c3606c103e95d3991267cca2592402a68779cafvandwalle            num5 = source.num5;
518e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle            BSSID5 = source.BSSID5;
519e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle            BSSID24 = source.BSSID24;
5207c3606c103e95d3991267cca2592402a68779cafvandwalle        }
5215fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
5225fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        @Override
5235fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public String toString() {
5245fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            StringBuilder sbuf = new StringBuilder();
5255fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            sbuf.append("[");
5265fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            if (rssi24 > INVALID_RSSI) {
5275fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(rssi24));
5285fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(",");
5295fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(num24));
530e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                if (BSSID24 != null) sbuf.append(",").append(BSSID24);
5315fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            }
53272e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle            sbuf.append("; ");
5335fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            if (rssi5 > INVALID_RSSI) {
5345fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(rssi5));
5355fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(",");
5365fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(num5));
537e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                if (BSSID5 != null) sbuf.append(",").append(BSSID5);
5385fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            }
53972e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle            if (score != 0) {
54072e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                sbuf.append("; ").append(score);
54172e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                sbuf.append(", ").append(currentNetworkBoost);
54272e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                sbuf.append(", ").append(bandPreferenceBoost);
54372e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                if (lastChoiceConfig != null) {
54472e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                    sbuf.append(", ").append(lastChoiceBoost);
54572e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                    sbuf.append(", ").append(lastChoiceConfig);
54672e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                }
54772e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle            }
5485fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            sbuf.append("]");
5495fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            return sbuf.toString();
5505fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        }
5517c3606c103e95d3991267cca2592402a68779cafvandwalle    }
5527c3606c103e95d3991267cca2592402a68779cafvandwalle
5537c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
5547c3606c103e95d3991267cca2592402a68779cafvandwalle     * Cache the visibility status of this configuration.
5557c3606c103e95d3991267cca2592402a68779cafvandwalle     * Visibility can change at any time depending on scan results availability.
5567c3606c103e95d3991267cca2592402a68779cafvandwalle     * Owner of the WifiConfiguration is responsible to set this field based on
5577c3606c103e95d3991267cca2592402a68779cafvandwalle     * recent scan results.
5587c3606c103e95d3991267cca2592402a68779cafvandwalle     ***/
5597c3606c103e95d3991267cca2592402a68779cafvandwalle    public Visibility visibility;
5607c3606c103e95d3991267cca2592402a68779cafvandwalle
5617c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
5627c3606c103e95d3991267cca2592402a68779cafvandwalle     * calculate and set Visibility for that configuration.
5637c3606c103e95d3991267cca2592402a68779cafvandwalle     *
5647c3606c103e95d3991267cca2592402a68779cafvandwalle     * age in milliseconds: we will consider only ScanResults that are more recent,
5657c3606c103e95d3991267cca2592402a68779cafvandwalle     * i.e. younger.
5667c3606c103e95d3991267cca2592402a68779cafvandwalle     ***/
5676f6c781cca66cabc1f06be368a6dfedceb88ed0eVinit Deshpande    public void setVisibility(Visibility status) {
5687c3606c103e95d3991267cca2592402a68779cafvandwalle        visibility = status;
5697c3606c103e95d3991267cca2592402a68779cafvandwalle    }
5707c3606c103e95d3991267cca2592402a68779cafvandwalle
5713e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    // States for the userApproved field
5723e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
5733e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
5743e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * User hasn't specified if connection is okay
5753e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
5763e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static final int USER_UNSPECIFIED = 0;
5773e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
5783e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
5793e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * User has approved this for connection
5803e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
5813e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static final int USER_APPROVED = 1;
5823e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
5833e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
5843e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * User has banned this from connection
5853e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
5863e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static final int USER_BANNED = 2;
5873e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
5883e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
5893e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * Waiting for user input
5903e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
5913e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static final int USER_PENDING = 3;
5923e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
5937c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
5947c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
595ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * Number of reports indicating no Internet Access
596ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     */
597ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    public int numNoInternetAccessReports;
598ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle
599ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    /**
600ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * @hide
601ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     * For debug: date at which the config was last updated
602ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     */
603ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle    public String updateTime;
604ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle
605ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle    /**
606ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     * @hide
607ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     * For debug: date at which the config was last updated
608ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     */
609ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle    public String creationTime;
610ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle
611ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle    /**
612ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     * @hide
613ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * The WiFi configuration is considered to have no internet access for purpose of autojoining
614ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * if there has been a report of it having no internet access, and, it never have had
615ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * internet access in the past.
616ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     */
617ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    public boolean hasNoInternetAccess() {
618ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        return numNoInternetAccessReports > 0 && !validatedInternetAccess;
619ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    }
620ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle
621ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    /**
6221248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     * The WiFi configuration is expected not to have Internet access (e.g., a wireless printer, a
6231248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     * Chromecast hotspot, etc.). This will be set if the user explicitly confirms a connection to
6241248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     * this configuration and selects "don't ask again".
6251248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     * @hide
6261248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     */
6271248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti    public boolean noInternetAccessExpected;
6281248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti
6291248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti    /**
630ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * @hide
631154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system was connected to this configuration.
632111fa0274d1d6620f9634783585387f3b773949evandwalle     */
633111fa0274d1d6620f9634783585387f3b773949evandwalle    public long lastConnected;
634111fa0274d1d6620f9634783585387f3b773949evandwalle
635111fa0274d1d6620f9634783585387f3b773949evandwalle    /**
636111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
637154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system tried to connect and failed.
638154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
639154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public long lastConnectionFailure;
640154b2cf6bbb99ee258b289846183172139a87dbavandwalle
641154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
642154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
6438650c035609507340e3a66459cea16ef08cd03a6vandwalle     * Last time the system tried to roam and failed because of authentication failure or DHCP
6448650c035609507340e3a66459cea16ef08cd03a6vandwalle     * RENEW failure.
6458650c035609507340e3a66459cea16ef08cd03a6vandwalle     */
6468650c035609507340e3a66459cea16ef08cd03a6vandwalle    public long lastRoamingFailure;
6478650c035609507340e3a66459cea16ef08cd03a6vandwalle
6488650c035609507340e3a66459cea16ef08cd03a6vandwalle    /** @hide */
6498650c035609507340e3a66459cea16ef08cd03a6vandwalle    public static int ROAMING_FAILURE_IP_CONFIG = 1;
6508650c035609507340e3a66459cea16ef08cd03a6vandwalle    /** @hide */
6518650c035609507340e3a66459cea16ef08cd03a6vandwalle    public static int ROAMING_FAILURE_AUTH_FAILURE = 2;
6528650c035609507340e3a66459cea16ef08cd03a6vandwalle
6538650c035609507340e3a66459cea16ef08cd03a6vandwalle    /**
6548650c035609507340e3a66459cea16ef08cd03a6vandwalle     * @hide
6558650c035609507340e3a66459cea16ef08cd03a6vandwalle     * Initial amount of time this Wifi configuration gets blacklisted for network switching
6568650c035609507340e3a66459cea16ef08cd03a6vandwalle     * because of roaming failure
6578650c035609507340e3a66459cea16ef08cd03a6vandwalle     */
6588650c035609507340e3a66459cea16ef08cd03a6vandwalle    public long roamingFailureBlackListTimeMilli = 1000;
6598650c035609507340e3a66459cea16ef08cd03a6vandwalle
6608650c035609507340e3a66459cea16ef08cd03a6vandwalle    /**
6618650c035609507340e3a66459cea16ef08cd03a6vandwalle     * @hide
6628650c035609507340e3a66459cea16ef08cd03a6vandwalle     * Last roaming failure reason code
6638650c035609507340e3a66459cea16ef08cd03a6vandwalle     */
6648650c035609507340e3a66459cea16ef08cd03a6vandwalle    public int lastRoamingFailureReason;
6658650c035609507340e3a66459cea16ef08cd03a6vandwalle
6668650c035609507340e3a66459cea16ef08cd03a6vandwalle    /**
6678650c035609507340e3a66459cea16ef08cd03a6vandwalle     * @hide
668154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system was disconnected to this configuration.
669111fa0274d1d6620f9634783585387f3b773949evandwalle     */
670111fa0274d1d6620f9634783585387f3b773949evandwalle    public long lastDisconnected;
6712ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
6727c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
673e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     * Set if the configuration was self added by the framework
6748f13548615f647a1208ace5369b504cb41149965vandwalle     * This boolean is cleared if we get a connect/save/ update or
6758f13548615f647a1208ace5369b504cb41149965vandwalle     * any wifiManager command that indicate the user interacted with the configuration
6768f13548615f647a1208ace5369b504cb41149965vandwalle     * since we will now consider that the configuration belong to him.
677e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     * @hide
678e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     */
679e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle    public boolean selfAdded;
680e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle
681e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle    /**
6828f13548615f647a1208ace5369b504cb41149965vandwalle     * Set if the configuration was self added by the framework
6838f13548615f647a1208ace5369b504cb41149965vandwalle     * This boolean is set once and never cleared. It is used
6848f13548615f647a1208ace5369b504cb41149965vandwalle     * so as we never loose track of who created the
6858f13548615f647a1208ace5369b504cb41149965vandwalle     * configuration in the first place.
6868f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
6878f13548615f647a1208ace5369b504cb41149965vandwalle     */
6888f13548615f647a1208ace5369b504cb41149965vandwalle    public boolean didSelfAdd;
6898f13548615f647a1208ace5369b504cb41149965vandwalle
6908f13548615f647a1208ace5369b504cb41149965vandwalle    /**
691154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Peer WifiConfiguration this WifiConfiguration was added for
6922d0f71eea20470985abde98d759910a1ac40b257vandwalle     * @hide
6932d0f71eea20470985abde98d759910a1ac40b257vandwalle     */
6942d0f71eea20470985abde98d759910a1ac40b257vandwalle    public String peerWifiConfiguration;
6952d0f71eea20470985abde98d759910a1ac40b257vandwalle
6962d0f71eea20470985abde98d759910a1ac40b257vandwalle    /**
6977c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
6987c3606c103e95d3991267cca2592402a68779cafvandwalle     * Indicate that a WifiConfiguration is temporary and should not be saved
6997c3606c103e95d3991267cca2592402a68779cafvandwalle     * nor considered by AutoJoin.
7007c3606c103e95d3991267cca2592402a68779cafvandwalle     */
7017c3606c103e95d3991267cca2592402a68779cafvandwalle    public boolean ephemeral;
7027c3606c103e95d3991267cca2592402a68779cafvandwalle
7037c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
7047c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
705f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin     * A hint about whether or not the network represented by this WifiConfiguration
706f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin     * is metered.
707f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin     */
708f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin    public boolean meteredHint;
709f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin
710f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin    /**
711f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin     * @hide
712fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * Setting this value will force scan results associated with this configuration to
713fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * be included in the bucket of networks that are externally scored.
714fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * If not set, associated scan results will be treated as legacy saved networks and
715fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * will take precedence over networks in the scored category.
716fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     */
717fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin    @SystemApi
718fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin    public boolean useExternalScores;
719fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin
720fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin    /**
721fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * @hide
722154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Number of time the scorer overrode a the priority based choice, when comparing two
723154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * WifiConfigurations, note that since comparing WifiConfiguration happens very often
724154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * potentially at every scan, this number might become very large, even on an idle
725154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * system.
726154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
727154b2cf6bbb99ee258b289846183172139a87dbavandwalle    @SystemApi
728154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public int numScorerOverride;
729154b2cf6bbb99ee258b289846183172139a87dbavandwalle
730154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
731154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
732154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Number of time the scorer overrode a the priority based choice, and the comparison
733154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * triggered a network switch
734154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
735154b2cf6bbb99ee258b289846183172139a87dbavandwalle    @SystemApi
736154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public int numScorerOverrideAndSwitchedNetwork;
737154b2cf6bbb99ee258b289846183172139a87dbavandwalle
738154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
739154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
7404eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * Number of time we associated to this configuration.
7414eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
7424eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    @SystemApi
7434eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public int numAssociation;
7444eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
745448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
746448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
747448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of time user disabled WiFi while associated to this configuration with Low RSSI.
748448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
749448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numUserTriggeredWifiDisableLowRSSI;
750448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
751448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
752448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
753448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of time user disabled WiFi while associated to this configuration with Bad RSSI.
754448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
755448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numUserTriggeredWifiDisableBadRSSI;
756448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
757448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
758448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
759448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of time user disabled WiFi while associated to this configuration
760448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * and RSSI was not HIGH.
761448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
762448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numUserTriggeredWifiDisableNotHighRSSI;
763448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
764448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
765448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
766448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of ticks associated to this configuration with Low RSSI.
767448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
768448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numTicksAtLowRSSI;
769448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
770448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
771448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
772448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of ticks associated to this configuration with Bad RSSI.
773448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
774448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numTicksAtBadRSSI;
775448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
776448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
777448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
778448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of ticks associated to this configuration
779448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * and RSSI was not HIGH.
780448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
781448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numTicksAtNotHighRSSI;
782448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
783448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
784448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * Number of time user (WifiManager) triggered association to this configuration.
785448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * TODO: count this only for Wifi Settings uuid, so as to not count 3rd party apps
786448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
787448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    public int numUserTriggeredJoinAttempts;
7884eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
7898d106780b6a638552749e54e169fc72537d4bcccxinhe    /** @hide
7908d106780b6a638552749e54e169fc72537d4bcccxinhe     * Boost given to RSSI on a home network for the purpose of calculating the score
7918d106780b6a638552749e54e169fc72537d4bcccxinhe     * This adds stickiness to home networks, as defined by:
7928d106780b6a638552749e54e169fc72537d4bcccxinhe     * - less than 4 known BSSIDs
7938d106780b6a638552749e54e169fc72537d4bcccxinhe     * - PSK only
7948d106780b6a638552749e54e169fc72537d4bcccxinhe     * - TODO: add a test to verify that all BSSIDs are behind same gateway
7958d106780b6a638552749e54e169fc72537d4bcccxinhe     ***/
7968d106780b6a638552749e54e169fc72537d4bcccxinhe    public static final int HOME_NETWORK_RSSI_BOOST = 5;
7978d106780b6a638552749e54e169fc72537d4bcccxinhe
7988d106780b6a638552749e54e169fc72537d4bcccxinhe    /**
7998d106780b6a638552749e54e169fc72537d4bcccxinhe     * @hide
8008d106780b6a638552749e54e169fc72537d4bcccxinhe     * This class is used to contain all the information and API used for quality network selection
8018d106780b6a638552749e54e169fc72537d4bcccxinhe     */
8028d106780b6a638552749e54e169fc72537d4bcccxinhe    public static class NetworkSelectionStatus {
8038d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8048d106780b6a638552749e54e169fc72537d4bcccxinhe         * Quality Network Selection Status enable, temporary disabled, permanently disabled
8058d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8068d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8078d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is allowed to join Quality Network Selection
8088d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8098d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_ENABLED = 0;
8108d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8118d106780b6a638552749e54e169fc72537d4bcccxinhe         * network was temporary disabled. Can be re-enabled after a time period expire
8128d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8138d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_TEMPORARY_DISABLED  = 1;
8148d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8158d106780b6a638552749e54e169fc72537d4bcccxinhe         * network was permanently disabled.
8168d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8178d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_PERMANENTLY_DISABLED  = 2;
8188d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8198d106780b6a638552749e54e169fc72537d4bcccxinhe         * Maximum Network selection status
8208d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8218d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_STATUS_MAX = 3;
8228d106780b6a638552749e54e169fc72537d4bcccxinhe
8238d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8248d106780b6a638552749e54e169fc72537d4bcccxinhe         * Quality network selection status String (for debug purpose). Use Quality network
8258d106780b6a638552749e54e169fc72537d4bcccxinhe         * selection status value as index to extec the corresponding debug string
8268d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8278d106780b6a638552749e54e169fc72537d4bcccxinhe        private static final String[] QUALITY_NETWORK_SELECTION_STATUS = {
82890a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_ENABLED",
82990a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_TEMPORARY_DISABLED",
8308d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_PERMANENTLY_DISABLED"};
8318d106780b6a638552749e54e169fc72537d4bcccxinhe
8328d106780b6a638552749e54e169fc72537d4bcccxinhe        //Quality Network disabled reasons
8338d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8348d106780b6a638552749e54e169fc72537d4bcccxinhe         * Default value. Means not disabled
8358d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8368d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_ENABLE = 0;
8378d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8383396b385145ad5af32c70dd2f9e582dd3800be1cRandy Pan         * @deprecated it is not used any more.
8398d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because higher layer (>2) network is bad
8408d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8418d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_BAD_LINK = 1;
8428d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8438d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because multiple association rejects
8448d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8458d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_ASSOCIATION_REJECTION = 2;
8468d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8478d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because multiple authentication failure
8488d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8498d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_AUTHENTICATION_FAILURE = 3;
8508d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8518d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because multiple DHCP failure
8528d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8538d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_DHCP_FAILURE = 4;
8548d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8558d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because of security network but no credentials
8568d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8578d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_DNS_FAILURE = 5;
8588d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8598d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because EAP-TLS failure
8608d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8618d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_TLS_VERSION_MISMATCH = 6;
8628d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8638d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled due to WifiManager disable it explicitly
8648d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8658d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_AUTHENTICATION_NO_CREDENTIALS = 7;
8668d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8678d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because no Internet connected and user do not want
8688d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8698d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_NO_INTERNET = 8;
8708d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8718d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled due to WifiManager disable it explicitly
8728d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8738d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_BY_WIFI_MANAGER = 9;
8748d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8758d106780b6a638552749e54e169fc72537d4bcccxinhe         * This Maximum disable reason value
8768d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8778d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_DISABLED_MAX = 10;
8788d106780b6a638552749e54e169fc72537d4bcccxinhe
8798d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8808d106780b6a638552749e54e169fc72537d4bcccxinhe         * Quality network selection disable reason String (for debug purpose)
8818d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8828d106780b6a638552749e54e169fc72537d4bcccxinhe        private static final String[] QUALITY_NETWORK_SELECTION_DISABLE_REASON = {
88390a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_ENABLE",
8843396b385145ad5af32c70dd2f9e582dd3800be1cRandy Pan                "NETWORK_SELECTION_DISABLED_BAD_LINK", // deprecated
8858d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_ASSOCIATION_REJECTION ",
8868d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_AUTHENTICATION_FAILURE",
8878d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_DHCP_FAILURE",
88890a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_DISABLED_DNS_FAILURE",
88990a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_DISABLED_TLS_VERSION",
8908d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_AUTHENTICATION_NO_CREDENTIALS",
89190a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_DISABLED_NO_INTERNET",
8928d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_BY_WIFI_MANAGER"};
8938d106780b6a638552749e54e169fc72537d4bcccxinhe
8948d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8958d106780b6a638552749e54e169fc72537d4bcccxinhe         * Invalid time stamp for network selection disable
8968d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8978d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final long INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP = -1L;
8988d106780b6a638552749e54e169fc72537d4bcccxinhe
899584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
900584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *  This constant indicates the current configuration has connect choice set
901584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
902584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private static final int CONNECT_CHOICE_EXISTS = 1;
903584dc6b8b9628d930de4ea3ad94894886294b855xinhe
904584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
905584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *  This constant indicates the current configuration does not have connect choice set
906584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
907584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private static final int CONNECT_CHOICE_NOT_EXISTS = -1;
908584dc6b8b9628d930de4ea3ad94894886294b855xinhe
9098d106780b6a638552749e54e169fc72537d4bcccxinhe        // fields for QualityNetwork Selection
9108d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9118d106780b6a638552749e54e169fc72537d4bcccxinhe         * Network selection status, should be in one of three status: enable, temporaily disabled
9128d106780b6a638552749e54e169fc72537d4bcccxinhe         * or permanently disabled
9138d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9148d106780b6a638552749e54e169fc72537d4bcccxinhe        private int mStatus;
9158d106780b6a638552749e54e169fc72537d4bcccxinhe
9168d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9178d106780b6a638552749e54e169fc72537d4bcccxinhe         * Reason for disable this network
9188d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9198d106780b6a638552749e54e169fc72537d4bcccxinhe        private int mNetworkSelectionDisableReason;
9208d106780b6a638552749e54e169fc72537d4bcccxinhe
9218d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9228d106780b6a638552749e54e169fc72537d4bcccxinhe         * Last time we temporarily disabled the configuration
9238d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9248d106780b6a638552749e54e169fc72537d4bcccxinhe        private long mTemporarilyDisabledTimestamp = INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP;
9258d106780b6a638552749e54e169fc72537d4bcccxinhe
9268d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9278d106780b6a638552749e54e169fc72537d4bcccxinhe         * counter for each Network selection disable reason
9288d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9298d106780b6a638552749e54e169fc72537d4bcccxinhe        private int[] mNetworkSeclectionDisableCounter = new int[NETWORK_SELECTION_DISABLED_MAX];
9308d106780b6a638552749e54e169fc72537d4bcccxinhe
9318d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
932584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Connect Choice over this configuration
933584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *
934584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * When current wifi configuration is visible to the user but user explicitly choose to
935584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * connect to another network X, the another networks X's configure key will be stored here.
936584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * We will consider user has a preference of X over this network. And in the future,
937584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * network selection will always give X a higher preference over this configuration.
938584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * configKey is : "SSID"-WEP-WPA_PSK-WPA_EAP
939584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
940584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private String mConnectChoice;
941584dc6b8b9628d930de4ea3ad94894886294b855xinhe
942584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
943584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * The system timestamp when we records the connectChoice. This value is obtained from
944584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * System.currentTimeMillis
945584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
946584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private long mConnectChoiceTimestamp = INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP;
947584dc6b8b9628d930de4ea3ad94894886294b855xinhe
948584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
949584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Used to cache the temporary candidate during the network selection procedure. It will be
950584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * kept updating once a new scan result has a higher score than current one
951584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
952584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private ScanResult mCandidate;
953584dc6b8b9628d930de4ea3ad94894886294b855xinhe
954584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
955584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Used to cache the score of the current temporary candidate during the network
956584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * selection procedure.
957584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
958584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private int mCandidateScore;
959584dc6b8b9628d930de4ea3ad94894886294b855xinhe
960584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
961584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Indicate whether this network is visible in latest Qualified Network Selection. This
962584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * means there is scan result found related to this Configuration and meet the minimum
963584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * requirement. The saved network need not join latest Qualified Network Selection. For
964584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * example, it is disabled. True means network is visible in latest Qualified Network
965584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Selection and false means network is invisible
966584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
967584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private boolean mSeenInLastQualifiedNetworkSelection;
968584dc6b8b9628d930de4ea3ad94894886294b855xinhe
969584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
970cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         * Boolean indicating if we have ever successfully connected to this network.
971cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         *
972cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         * This value will be set to true upon a successful connection.
973cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         * This value will be set to false if a previous value was not stored in the config or if
974cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         * the credentials are updated (ex. a password change).
975cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         */
976cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        private boolean mHasEverConnected;
977cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein
978cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        /**
979584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set whether this network is visible in latest Qualified Network Selection
980584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param seen value set to candidate
981584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
982584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setSeenInLastQualifiedNetworkSelection(boolean seen) {
983584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mSeenInLastQualifiedNetworkSelection =  seen;
984584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
985584dc6b8b9628d930de4ea3ad94894886294b855xinhe
986584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
987584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get whether this network is visible in latest Qualified Network Selection
988584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns true -- network is visible in latest Qualified Network Selection
989584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *         false -- network is invisible in latest Qualified Network Selection
990584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
991584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public boolean getSeenInLastQualifiedNetworkSelection() {
992584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mSeenInLastQualifiedNetworkSelection;
993584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
994584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
995584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set the temporary candidate of current network selection procedure
996584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param scanCandidate {@link ScanResult} the candidate set to mCandidate
997584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
998584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setCandidate(ScanResult scanCandidate) {
999584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mCandidate = scanCandidate;
1000584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1001584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1002584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1003584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get the temporary candidate of current network selection procedure
1004584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return  returns {@link ScanResult} temporary candidate of current network selection
1005584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * procedure
1006584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1007584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public ScanResult getCandidate() {
1008584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mCandidate;
1009584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1010584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1011584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1012584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set the score of the temporary candidate of current network selection procedure
1013584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param score value set to mCandidateScore
1014584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1015584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setCandidateScore(int score) {
1016584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mCandidateScore = score;
1017584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1018584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1019584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1020584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get the score of the temporary candidate of current network selection procedure
1021584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns score of the temporary candidate of current network selection procedure
1022584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1023584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public int getCandidateScore() {
1024584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mCandidateScore;
1025584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1026584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1027584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1028584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get user preferred choice over this configuration
1029584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *@return returns configKey of user preferred choice over this configuration
1030584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1031584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public String getConnectChoice() {
1032584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mConnectChoice;
1033584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1034584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1035584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1036584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set user preferred choice over this configuration
1037584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param newConnectChoice, the configKey of user preferred choice over this configuration
1038584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1039584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setConnectChoice(String newConnectChoice) {
1040584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mConnectChoice = newConnectChoice;
1041584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1042584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1043584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1044584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get the timeStamp when user select a choice over this configuration
1045584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns when current connectChoice is set (time from System.currentTimeMillis)
1046584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1047584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public long getConnectChoiceTimestamp() {
1048584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mConnectChoiceTimestamp;
1049584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1050584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1051584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1052584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set the timeStamp when user select a choice over this configuration
1053584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param timeStamp, the timestamp set to connectChoiceTimestamp, expected timestamp should
1054584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *        be obtained from System.currentTimeMillis
1055584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1056584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setConnectChoiceTimestamp(long timeStamp) {
1057584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mConnectChoiceTimestamp = timeStamp;
1058584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1059584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1060584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1061584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get current Quality network selection status
1062584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns current Quality network selection status in String (for debug purpose)
10638d106780b6a638552749e54e169fc72537d4bcccxinhe         */
10648d106780b6a638552749e54e169fc72537d4bcccxinhe        public String getNetworkStatusString() {
10658d106780b6a638552749e54e169fc72537d4bcccxinhe            return QUALITY_NETWORK_SELECTION_STATUS[mStatus];
10668d106780b6a638552749e54e169fc72537d4bcccxinhe        }
10678d106780b6a638552749e54e169fc72537d4bcccxinhe
1068cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        public void setHasEverConnected(boolean value) {
1069cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            mHasEverConnected = value;
1070cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        }
1071cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein
1072cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        public boolean getHasEverConnected() {
1073cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            return mHasEverConnected;
1074cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        }
1075cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein
1076cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        private NetworkSelectionStatus() {
1077cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            // previously stored configs will not have this parameter, so we default to false.
1078cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            mHasEverConnected = false;
1079cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        };
10808d106780b6a638552749e54e169fc72537d4bcccxinhe
10818d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
10828d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param reason specific error reason
10838d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return  corresponding network disable reason String (for debug purpose)
10848d106780b6a638552749e54e169fc72537d4bcccxinhe         */
10858d106780b6a638552749e54e169fc72537d4bcccxinhe        public static String getNetworkDisableReasonString(int reason) {
10868d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE && reason < NETWORK_SELECTION_DISABLED_MAX) {
10878d106780b6a638552749e54e169fc72537d4bcccxinhe                return QUALITY_NETWORK_SELECTION_DISABLE_REASON[reason];
10888d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
10898d106780b6a638552749e54e169fc72537d4bcccxinhe                return null;
10908d106780b6a638552749e54e169fc72537d4bcccxinhe            }
10918d106780b6a638552749e54e169fc72537d4bcccxinhe        }
10928d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1093584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get current network disable reason
10948d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return current network disable reason in String (for debug purpose)
10958d106780b6a638552749e54e169fc72537d4bcccxinhe         */
10968d106780b6a638552749e54e169fc72537d4bcccxinhe        public String getNetworkDisableReasonString() {
10978d106780b6a638552749e54e169fc72537d4bcccxinhe            return QUALITY_NETWORK_SELECTION_DISABLE_REASON[mNetworkSelectionDisableReason];
10988d106780b6a638552749e54e169fc72537d4bcccxinhe        }
10998d106780b6a638552749e54e169fc72537d4bcccxinhe
11008d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
11018d106780b6a638552749e54e169fc72537d4bcccxinhe         * get current network network selection status
1102584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return return current network network selection status
11038d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11048d106780b6a638552749e54e169fc72537d4bcccxinhe        public int getNetworkSelectionStatus() {
11058d106780b6a638552749e54e169fc72537d4bcccxinhe            return mStatus;
11068d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11078d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
11088d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return whether current network is enabled to join network selection
11098d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11108d106780b6a638552749e54e169fc72537d4bcccxinhe        public boolean isNetworkEnabled() {
11118d106780b6a638552749e54e169fc72537d4bcccxinhe            return mStatus == NETWORK_SELECTION_ENABLED;
11128d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11138d106780b6a638552749e54e169fc72537d4bcccxinhe
11148d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
11158d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return whether current network is temporary disabled
11168d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11178d106780b6a638552749e54e169fc72537d4bcccxinhe        public boolean isNetworkTemporaryDisabled() {
11188d106780b6a638552749e54e169fc72537d4bcccxinhe            return mStatus == NETWORK_SELECTION_TEMPORARY_DISABLED;
11198d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11208d106780b6a638552749e54e169fc72537d4bcccxinhe
11218d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1122584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns whether current network is permanently disabled
11238d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11248d106780b6a638552749e54e169fc72537d4bcccxinhe        public boolean isNetworkPermanentlyDisabled() {
11258d106780b6a638552749e54e169fc72537d4bcccxinhe            return mStatus == NETWORK_SELECTION_PERMANENTLY_DISABLED;
11268d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1127584dc6b8b9628d930de4ea3ad94894886294b855xinhe
11288d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1129584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set current networ work selection status
11308d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param status network selection status to set
11318d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11328d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setNetworkSelectionStatus(int status) {
11338d106780b6a638552749e54e169fc72537d4bcccxinhe            if (status >= 0 && status < NETWORK_SELECTION_STATUS_MAX) {
11348d106780b6a638552749e54e169fc72537d4bcccxinhe                mStatus = status;
11358d106780b6a638552749e54e169fc72537d4bcccxinhe            }
11368d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1137584dc6b8b9628d930de4ea3ad94894886294b855xinhe
11388d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1139584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns current network's disable reason
11408d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11418d106780b6a638552749e54e169fc72537d4bcccxinhe        public int getNetworkSelectionDisableReason() {
11428d106780b6a638552749e54e169fc72537d4bcccxinhe            return mNetworkSelectionDisableReason;
11438d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11448d106780b6a638552749e54e169fc72537d4bcccxinhe
11458d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1146584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set Network disable reason
11478d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param  reason Network disable reason
11488d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11498d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setNetworkSelectionDisableReason(int reason) {
11508d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= 0 && reason < NETWORK_SELECTION_DISABLED_MAX) {
11518d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSelectionDisableReason = reason;
11528d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
11538d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
11548d106780b6a638552749e54e169fc72537d4bcccxinhe            }
11558d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1156584dc6b8b9628d930de4ea3ad94894886294b855xinhe
11578d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1158584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * check whether network is disabled by this reason
1159584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param reason a specific disable reason
1160584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return true -- network is disabled for this reason
1161584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *         false -- network is not disabled for this reason
11628d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11638d106780b6a638552749e54e169fc72537d4bcccxinhe        public boolean isDisabledByReason(int reason) {
11648d106780b6a638552749e54e169fc72537d4bcccxinhe            return mNetworkSelectionDisableReason == reason;
11658d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1166584dc6b8b9628d930de4ea3ad94894886294b855xinhe
11678d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
11688d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param timeStamp Set when current network is disabled in millisecond since January 1,
11698d106780b6a638552749e54e169fc72537d4bcccxinhe         * 1970 00:00:00.0 UTC
11708d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11718d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setDisableTime(long timeStamp) {
11728d106780b6a638552749e54e169fc72537d4bcccxinhe            mTemporarilyDisabledTimestamp = timeStamp;
11738d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11748d106780b6a638552749e54e169fc72537d4bcccxinhe
11758d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1176584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns when current network is disabled in millisecond since January 1,
11778d106780b6a638552749e54e169fc72537d4bcccxinhe         * 1970 00:00:00.0 UTC
11788d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11798d106780b6a638552749e54e169fc72537d4bcccxinhe        public long getDisableTime() {
11808d106780b6a638552749e54e169fc72537d4bcccxinhe            return mTemporarilyDisabledTimestamp;
11818d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11828d106780b6a638552749e54e169fc72537d4bcccxinhe
11838d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1184584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get the disable counter of a specific reason
11858d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param  reason specific failure reason
11868d106780b6a638552749e54e169fc72537d4bcccxinhe         * @exception throw IllegalArgumentException for illegal input
11878d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return counter number for specific error reason.
11888d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11898d106780b6a638552749e54e169fc72537d4bcccxinhe        public int getDisableReasonCounter(int reason) {
11908d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE && reason < NETWORK_SELECTION_DISABLED_MAX) {
11918d106780b6a638552749e54e169fc72537d4bcccxinhe                return mNetworkSeclectionDisableCounter[reason];
11928d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
11938d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
11948d106780b6a638552749e54e169fc72537d4bcccxinhe            }
11958d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11968d106780b6a638552749e54e169fc72537d4bcccxinhe
11978d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
11988d106780b6a638552749e54e169fc72537d4bcccxinhe         * set the counter of a specific failure reason
11998d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param reason reason for disable error
12008d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param value the counter value for this specific reason
12018d106780b6a638552749e54e169fc72537d4bcccxinhe         * @exception throw IllegalArgumentException for illegal input
12028d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12038d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setDisableReasonCounter(int reason, int value) {
12048d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE && reason < NETWORK_SELECTION_DISABLED_MAX) {
12058d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSeclectionDisableCounter[reason] = value;
12068d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
12078d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
12088d106780b6a638552749e54e169fc72537d4bcccxinhe            }
12098d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12108d106780b6a638552749e54e169fc72537d4bcccxinhe
12118d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12128d106780b6a638552749e54e169fc72537d4bcccxinhe         * increment the counter of a specific failure reason
12138d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param reason a specific failure reason
12148d106780b6a638552749e54e169fc72537d4bcccxinhe         * @exception throw IllegalArgumentException for illegal input
12158d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12168d106780b6a638552749e54e169fc72537d4bcccxinhe        public void incrementDisableReasonCounter(int reason) {
12178d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE  && reason < NETWORK_SELECTION_DISABLED_MAX) {
12188d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSeclectionDisableCounter[reason]++;
12198d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
12208d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
12218d106780b6a638552749e54e169fc72537d4bcccxinhe            }
12228d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1223584dc6b8b9628d930de4ea3ad94894886294b855xinhe
12248d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12258d106780b6a638552749e54e169fc72537d4bcccxinhe         * clear the counter of a specific failure reason
12268d106780b6a638552749e54e169fc72537d4bcccxinhe         * @hide
12278d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param reason a specific failure reason
12288d106780b6a638552749e54e169fc72537d4bcccxinhe         * @exception throw IllegalArgumentException for illegal input
12298d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12308d106780b6a638552749e54e169fc72537d4bcccxinhe        public void clearDisableReasonCounter(int reason) {
12318d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE && reason < NETWORK_SELECTION_DISABLED_MAX) {
12328d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSeclectionDisableCounter[reason] = NETWORK_SELECTION_ENABLE;
12338d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
12348d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
12358d106780b6a638552749e54e169fc72537d4bcccxinhe            }
12368d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1237584dc6b8b9628d930de4ea3ad94894886294b855xinhe
12388d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12398d106780b6a638552749e54e169fc72537d4bcccxinhe         * clear all the failure reason counters
12408d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12418d106780b6a638552749e54e169fc72537d4bcccxinhe        public void clearDisableReasonCounter() {
12428d106780b6a638552749e54e169fc72537d4bcccxinhe            Arrays.fill(mNetworkSeclectionDisableCounter, NETWORK_SELECTION_ENABLE);
12438d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12448d106780b6a638552749e54e169fc72537d4bcccxinhe
12458d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12468d106780b6a638552749e54e169fc72537d4bcccxinhe         * BSSID for connection to this network (through network selection procedure)
12478d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12488d106780b6a638552749e54e169fc72537d4bcccxinhe        private String mNetworkSelectionBSSID;
12498d106780b6a638552749e54e169fc72537d4bcccxinhe
12508d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12518d106780b6a638552749e54e169fc72537d4bcccxinhe         * get current network Selection BSSID
12528d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return current network Selection BSSID
12538d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12548d106780b6a638552749e54e169fc72537d4bcccxinhe        public String getNetworkSelectionBSSID() {
12558d106780b6a638552749e54e169fc72537d4bcccxinhe            return mNetworkSelectionBSSID;
12568d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12578d106780b6a638552749e54e169fc72537d4bcccxinhe
12588d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12598d106780b6a638552749e54e169fc72537d4bcccxinhe         * set network Selection BSSID
12608d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param bssid The target BSSID for assocaition
12618d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12628d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setNetworkSelectionBSSID(String bssid) {
12638d106780b6a638552749e54e169fc72537d4bcccxinhe            mNetworkSelectionBSSID = bssid;
12648d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12658d106780b6a638552749e54e169fc72537d4bcccxinhe
12668d106780b6a638552749e54e169fc72537d4bcccxinhe        public void copy(NetworkSelectionStatus source) {
12678d106780b6a638552749e54e169fc72537d4bcccxinhe            mStatus = source.mStatus;
12688d106780b6a638552749e54e169fc72537d4bcccxinhe            mNetworkSelectionDisableReason = source.mNetworkSelectionDisableReason;
12698d106780b6a638552749e54e169fc72537d4bcccxinhe            for (int index = NETWORK_SELECTION_ENABLE; index < NETWORK_SELECTION_DISABLED_MAX;
12708d106780b6a638552749e54e169fc72537d4bcccxinhe                    index++) {
12718d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSeclectionDisableCounter[index] =
12728d106780b6a638552749e54e169fc72537d4bcccxinhe                        source.mNetworkSeclectionDisableCounter[index];
12738d106780b6a638552749e54e169fc72537d4bcccxinhe            }
12748d106780b6a638552749e54e169fc72537d4bcccxinhe            mTemporarilyDisabledTimestamp = source.mTemporarilyDisabledTimestamp;
12758d106780b6a638552749e54e169fc72537d4bcccxinhe            mNetworkSelectionBSSID = source.mNetworkSelectionBSSID;
1276584dc6b8b9628d930de4ea3ad94894886294b855xinhe            setConnectChoice(source.getConnectChoice());
1277584dc6b8b9628d930de4ea3ad94894886294b855xinhe            setConnectChoiceTimestamp(source.getConnectChoiceTimestamp());
1278cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            setHasEverConnected(source.getHasEverConnected());
12798d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12808d106780b6a638552749e54e169fc72537d4bcccxinhe
12818d106780b6a638552749e54e169fc72537d4bcccxinhe        public void writeToParcel(Parcel dest) {
12828d106780b6a638552749e54e169fc72537d4bcccxinhe            dest.writeInt(getNetworkSelectionStatus());
12838d106780b6a638552749e54e169fc72537d4bcccxinhe            dest.writeInt(getNetworkSelectionDisableReason());
12848d106780b6a638552749e54e169fc72537d4bcccxinhe            for (int index = NETWORK_SELECTION_ENABLE; index < NETWORK_SELECTION_DISABLED_MAX;
12858d106780b6a638552749e54e169fc72537d4bcccxinhe                    index++) {
12868d106780b6a638552749e54e169fc72537d4bcccxinhe                dest.writeInt(getDisableReasonCounter(index));
12878d106780b6a638552749e54e169fc72537d4bcccxinhe            }
12888d106780b6a638552749e54e169fc72537d4bcccxinhe            dest.writeLong(getDisableTime());
12898d106780b6a638552749e54e169fc72537d4bcccxinhe            dest.writeString(getNetworkSelectionBSSID());
1290584dc6b8b9628d930de4ea3ad94894886294b855xinhe            if (getConnectChoice() != null) {
1291584dc6b8b9628d930de4ea3ad94894886294b855xinhe                dest.writeInt(CONNECT_CHOICE_EXISTS);
1292584dc6b8b9628d930de4ea3ad94894886294b855xinhe                dest.writeString(getConnectChoice());
1293584dc6b8b9628d930de4ea3ad94894886294b855xinhe                dest.writeLong(getConnectChoiceTimestamp());
1294584dc6b8b9628d930de4ea3ad94894886294b855xinhe            } else {
1295584dc6b8b9628d930de4ea3ad94894886294b855xinhe                dest.writeInt(CONNECT_CHOICE_NOT_EXISTS);
1296584dc6b8b9628d930de4ea3ad94894886294b855xinhe            }
1297cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            dest.writeInt(getHasEverConnected() ? 1 : 0);
12988d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12998d106780b6a638552749e54e169fc72537d4bcccxinhe
13008d106780b6a638552749e54e169fc72537d4bcccxinhe        public void readFromParcel(Parcel in) {
13018d106780b6a638552749e54e169fc72537d4bcccxinhe            setNetworkSelectionStatus(in.readInt());
13028d106780b6a638552749e54e169fc72537d4bcccxinhe            setNetworkSelectionDisableReason(in.readInt());
13038d106780b6a638552749e54e169fc72537d4bcccxinhe            for (int index = NETWORK_SELECTION_ENABLE; index < NETWORK_SELECTION_DISABLED_MAX;
13048d106780b6a638552749e54e169fc72537d4bcccxinhe                    index++) {
13058d106780b6a638552749e54e169fc72537d4bcccxinhe                setDisableReasonCounter(index, in.readInt());
13068d106780b6a638552749e54e169fc72537d4bcccxinhe            }
13078d106780b6a638552749e54e169fc72537d4bcccxinhe            setDisableTime(in.readLong());
13088d106780b6a638552749e54e169fc72537d4bcccxinhe            setNetworkSelectionBSSID(in.readString());
1309584dc6b8b9628d930de4ea3ad94894886294b855xinhe            if (in.readInt() == CONNECT_CHOICE_EXISTS) {
1310584dc6b8b9628d930de4ea3ad94894886294b855xinhe                setConnectChoice(in.readString());
1311584dc6b8b9628d930de4ea3ad94894886294b855xinhe                setConnectChoiceTimestamp(in.readLong());
1312584dc6b8b9628d930de4ea3ad94894886294b855xinhe            } else {
1313584dc6b8b9628d930de4ea3ad94894886294b855xinhe                setConnectChoice(null);
1314584dc6b8b9628d930de4ea3ad94894886294b855xinhe                setConnectChoiceTimestamp(INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP);
1315584dc6b8b9628d930de4ea3ad94894886294b855xinhe            }
1316cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            setHasEverConnected(in.readInt() != 0);
13178d106780b6a638552749e54e169fc72537d4bcccxinhe        }
13188d106780b6a638552749e54e169fc72537d4bcccxinhe    }
13198d106780b6a638552749e54e169fc72537d4bcccxinhe
13208d106780b6a638552749e54e169fc72537d4bcccxinhe    /**
13218d106780b6a638552749e54e169fc72537d4bcccxinhe     * @hide
13228d106780b6a638552749e54e169fc72537d4bcccxinhe     * network selection related member
13238d106780b6a638552749e54e169fc72537d4bcccxinhe     */
13248d106780b6a638552749e54e169fc72537d4bcccxinhe    private final NetworkSelectionStatus mNetworkSelectionStatus = new NetworkSelectionStatus();
13258d106780b6a638552749e54e169fc72537d4bcccxinhe
13268d106780b6a638552749e54e169fc72537d4bcccxinhe    /**
13278d106780b6a638552749e54e169fc72537d4bcccxinhe     * @hide
13288d106780b6a638552749e54e169fc72537d4bcccxinhe     * @return network selection status
13298d106780b6a638552749e54e169fc72537d4bcccxinhe     */
13308d106780b6a638552749e54e169fc72537d4bcccxinhe    public NetworkSelectionStatus getNetworkSelectionStatus() {
13318d106780b6a638552749e54e169fc72537d4bcccxinhe        return mNetworkSelectionStatus;
13328d106780b6a638552749e54e169fc72537d4bcccxinhe    }
13337c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
13347c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
13357c3606c103e95d3991267cca2592402a68779cafvandwalle     * Linked Configurations: represent the set of Wificonfigurations that are equivalent
13367c3606c103e95d3991267cca2592402a68779cafvandwalle     * regarding roaming and auto-joining.
13377c3606c103e95d3991267cca2592402a68779cafvandwalle     * The linked configuration may or may not have same SSID, and may or may not have same
13387c3606c103e95d3991267cca2592402a68779cafvandwalle     * credentials.
13397c3606c103e95d3991267cca2592402a68779cafvandwalle     * For instance, linked configurations will have same defaultGwMacAddress or same dhcp server.
13407c3606c103e95d3991267cca2592402a68779cafvandwalle     */
13417c3606c103e95d3991267cca2592402a68779cafvandwalle    public HashMap<String, Integer>  linkedConfigurations;
13427c3606c103e95d3991267cca2592402a68779cafvandwalle
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiConfiguration() {
13445ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff        networkId = INVALID_NETWORK_ID;
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SSID = null;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BSSID = null;
13478a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng        FQDN = null;
13487226c8f95b5971af2710c8d2f8a8b6f2210e2420Vinit Deshpande        roamingConsortiumIds = new long[0];
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        priority = 0;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hiddenSSID = false;
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedKeyManagement = new BitSet();
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedProtocols = new BitSet();
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedAuthAlgorithms = new BitSet();
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedPairwiseCiphers = new BitSet();
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedGroupCiphers = new BitSet();
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wepKeys = new String[4];
13579b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (int i = 0; i < wepKeys.length; i++) {
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wepKeys[i] = null;
13594337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang        }
13609b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        enterpriseConfig = new WifiEnterpriseConfig();
1361e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        selfAdded = false;
13628f13548615f647a1208ace5369b504cb41149965vandwalle        didSelfAdd = false;
1363e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        ephemeral = false;
1364f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin        meteredHint = false;
1365fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin        useExternalScores = false;
1366ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        validatedInternetAccess = false;
13676346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration = new IpConfiguration();
13683e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        lastUpdateUid = -1;
13693e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        creatorUid = -1;
13706fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski        shared = true;
1371b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne        dtimInterval = 0;
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
137410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    /**
13752522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande     * Identify if this configuration represents a passpoint network
13762522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande     */
13772522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande    public boolean isPasspoint() {
1378ad25bb89251c0552cfbc6c254853c79b7d9c121aVinit Deshpande        return !TextUtils.isEmpty(FQDN)
13792522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande                && !TextUtils.isEmpty(providerFriendlyName)
13802522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande                && enterpriseConfig != null
13812522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande                && enterpriseConfig.getEapMethod() != WifiEnterpriseConfig.Eap.NONE;
13822522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande    }
13832522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande
13842522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande    /**
1385111fa0274d1d6620f9634783585387f3b773949evandwalle     * Helper function, identify if a configuration is linked
1386111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
1387111fa0274d1d6620f9634783585387f3b773949evandwalle     */
1388111fa0274d1d6620f9634783585387f3b773949evandwalle    public boolean isLinked(WifiConfiguration config) {
13898d106780b6a638552749e54e169fc72537d4bcccxinhe        if (config != null) {
13908d106780b6a638552749e54e169fc72537d4bcccxinhe            if (config.linkedConfigurations != null && linkedConfigurations != null) {
13918d106780b6a638552749e54e169fc72537d4bcccxinhe                if (config.linkedConfigurations.get(configKey()) != null
13928d106780b6a638552749e54e169fc72537d4bcccxinhe                        && linkedConfigurations.get(config.configKey()) != null) {
13938d106780b6a638552749e54e169fc72537d4bcccxinhe                    return true;
13948d106780b6a638552749e54e169fc72537d4bcccxinhe                }
1395111fa0274d1d6620f9634783585387f3b773949evandwalle            }
1396111fa0274d1d6620f9634783585387f3b773949evandwalle        }
1397111fa0274d1d6620f9634783585387f3b773949evandwalle        return  false;
13987c3606c103e95d3991267cca2592402a68779cafvandwalle    }
13997c3606c103e95d3991267cca2592402a68779cafvandwalle
14007c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
1401c55cd103708493f9d45122236affbf08b49456f0Sky Faber     * Helper function, idenfity if a configuration should be treated as an enterprise network
1402c55cd103708493f9d45122236affbf08b49456f0Sky Faber     * @hide
1403c55cd103708493f9d45122236affbf08b49456f0Sky Faber     */
1404c55cd103708493f9d45122236affbf08b49456f0Sky Faber    public boolean isEnterprise() {
1405c55cd103708493f9d45122236affbf08b49456f0Sky Faber        return allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
1406c55cd103708493f9d45122236affbf08b49456f0Sky Faber            allowedKeyManagement.get(KeyMgmt.IEEE8021X);
1407c55cd103708493f9d45122236affbf08b49456f0Sky Faber    }
1408c55cd103708493f9d45122236affbf08b49456f0Sky Faber
14098dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    @Override
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
14118dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy        StringBuilder sbuf = new StringBuilder();
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.status == WifiConfiguration.Status.CURRENT) {
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sbuf.append("* ");
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (this.status == WifiConfiguration.Status.DISABLED) {
141563edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle            sbuf.append("- DSBLE ");
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append("ID: ").append(this.networkId).append(" SSID: ").append(this.SSID).
1418b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                append(" PROVIDER-NAME: ").append(this.providerFriendlyName).
14198d106780b6a638552749e54e169fc72537d4bcccxinhe                append(" BSSID: ").append(this.BSSID).append(" FQDN: ").append(this.FQDN)
14208d106780b6a638552749e54e169fc72537d4bcccxinhe                .append(" PRIO: ").append(this.priority)
1421e23993848c65c7fb2c91bb89989117d35dabe5c3mukesh agrawal                .append(" HIDDEN: ").append(this.hiddenSSID)
14228d106780b6a638552749e54e169fc72537d4bcccxinhe                .append('\n');
14238d106780b6a638552749e54e169fc72537d4bcccxinhe
14248d106780b6a638552749e54e169fc72537d4bcccxinhe
14258d106780b6a638552749e54e169fc72537d4bcccxinhe        sbuf.append(" NetworkSelectionStatus ")
14268d106780b6a638552749e54e169fc72537d4bcccxinhe                .append(mNetworkSelectionStatus.getNetworkStatusString() + "\n");
14278d106780b6a638552749e54e169fc72537d4bcccxinhe        if (mNetworkSelectionStatus.getNetworkSelectionDisableReason() > 0) {
14288d106780b6a638552749e54e169fc72537d4bcccxinhe            sbuf.append(" mNetworkSelectionDisableReason ")
14298d106780b6a638552749e54e169fc72537d4bcccxinhe                    .append(mNetworkSelectionStatus.getNetworkDisableReasonString() + "\n");
14308d106780b6a638552749e54e169fc72537d4bcccxinhe
14318d106780b6a638552749e54e169fc72537d4bcccxinhe            for (int index = mNetworkSelectionStatus.NETWORK_SELECTION_ENABLE;
14328d106780b6a638552749e54e169fc72537d4bcccxinhe                    index < mNetworkSelectionStatus.NETWORK_SELECTION_DISABLED_MAX; index++) {
14338d106780b6a638552749e54e169fc72537d4bcccxinhe                if (mNetworkSelectionStatus.getDisableReasonCounter(index) != 0) {
14348d106780b6a638552749e54e169fc72537d4bcccxinhe                    sbuf.append(NetworkSelectionStatus.getNetworkDisableReasonString(index)
14358d106780b6a638552749e54e169fc72537d4bcccxinhe                            + " counter:" + mNetworkSelectionStatus.getDisableReasonCounter(index)
14368d106780b6a638552749e54e169fc72537d4bcccxinhe                            + "\n");
14378d106780b6a638552749e54e169fc72537d4bcccxinhe                }
14388d106780b6a638552749e54e169fc72537d4bcccxinhe            }
14390561030490e418fcead83606249d8cfdc344a163Mike Lockwood        }
1440584dc6b8b9628d930de4ea3ad94894886294b855xinhe        if (mNetworkSelectionStatus.getConnectChoice() != null) {
1441584dc6b8b9628d930de4ea3ad94894886294b855xinhe            sbuf.append(" connect choice: ").append(mNetworkSelectionStatus.getConnectChoice());
1442584dc6b8b9628d930de4ea3ad94894886294b855xinhe            sbuf.append(" connect choice set time: ").append(mNetworkSelectionStatus
1443584dc6b8b9628d930de4ea3ad94894886294b855xinhe                    .getConnectChoiceTimestamp());
1444584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1445cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        sbuf.append(" hasEverConnected: ")
1446cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein                .append(mNetworkSelectionStatus.getHasEverConnected()).append("\n");
14478d106780b6a638552749e54e169fc72537d4bcccxinhe
14480561030490e418fcead83606249d8cfdc344a163Mike Lockwood        if (this.numAssociation > 0) {
14490561030490e418fcead83606249d8cfdc344a163Mike Lockwood            sbuf.append(" numAssociation ").append(this.numAssociation).append("\n");
145016a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        }
1451ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        if (this.numNoInternetAccessReports > 0) {
1452ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle            sbuf.append(" numNoInternetAccessReports ");
1453ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle            sbuf.append(this.numNoInternetAccessReports).append("\n");
1454ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        }
1455ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle        if (this.updateTime != null) {
1456edbedd28b6aa10c266e627a9609b1c538479f03bPierre Vandwalle            sbuf.append("update ").append(this.updateTime).append("\n");
1457ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle        }
1458ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle        if (this.creationTime != null) {
1459edbedd28b6aa10c266e627a9609b1c538479f03bPierre Vandwalle            sbuf.append("creation").append(this.creationTime).append("\n");
1460ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle        }
146194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.didSelfAdd) sbuf.append(" didSelfAdd");
146294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.selfAdded) sbuf.append(" selfAdded");
1463ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        if (this.validatedInternetAccess) sbuf.append(" validatedInternetAccess");
14648faf2a2a15853368a14babf935c156664b5f0b6cJeff Davidson        if (this.ephemeral) sbuf.append(" ephemeral");
1465f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin        if (this.meteredHint) sbuf.append(" meteredHint");
1466fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin        if (this.useExternalScores) sbuf.append(" useExternalScores");
1467f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin        if (this.didSelfAdd || this.selfAdded || this.validatedInternetAccess
1468fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin            || this.ephemeral || this.meteredHint || this.useExternalScores) {
146916a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle            sbuf.append("\n");
147016a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        }
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" KeyMgmt:");
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int k = 0; k < this.allowedKeyManagement.size(); k++) {
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedKeyManagement.get(k)) {
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (k < KeyMgmt.strings.length) {
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(KeyMgmt.strings[k]);
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" Protocols:");
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int p = 0; p < this.allowedProtocols.size(); p++) {
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedProtocols.get(p)) {
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p < Protocol.strings.length) {
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(Protocol.strings[p]);
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" AuthAlgorithms:");
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int a = 0; a < this.allowedAuthAlgorithms.size(); a++) {
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedAuthAlgorithms.get(a)) {
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a < AuthAlgorithm.strings.length) {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(AuthAlgorithm.strings[a]);
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" PairwiseCiphers:");
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int pc = 0; pc < this.allowedPairwiseCiphers.size(); pc++) {
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedPairwiseCiphers.get(pc)) {
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pc < PairwiseCipher.strings.length) {
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(PairwiseCipher.strings[pc]);
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" GroupCiphers:");
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int gc = 0; gc < this.allowedGroupCiphers.size(); gc++) {
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedGroupCiphers.get(gc)) {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (gc < GroupCipher.strings.length) {
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(GroupCipher.strings[gc]);
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15295069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        sbuf.append('\n').append(" PSK: ");
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.preSharedKey != null) {
15315069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang            sbuf.append('*');
15325069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        }
153394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("\nEnterprise config:\n");
15349b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        sbuf.append(enterpriseConfig);
15359b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff
153694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("IP config:\n");
15376346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        sbuf.append(mIpConfiguration.toString());
1538128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
15398d106780b6a638552749e54e169fc72537d4bcccxinhe        if (mNetworkSelectionStatus.getNetworkSelectionBSSID() != null) {
15408d106780b6a638552749e54e169fc72537d4bcccxinhe            sbuf.append(" networkSelectionBSSID="
15418d106780b6a638552749e54e169fc72537d4bcccxinhe                    + mNetworkSelectionStatus.getNetworkSelectionBSSID());
15428d106780b6a638552749e54e169fc72537d4bcccxinhe        }
154394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        long now_ms = System.currentTimeMillis();
15448d106780b6a638552749e54e169fc72537d4bcccxinhe        if (mNetworkSelectionStatus.getDisableTime() != NetworkSelectionStatus
15458d106780b6a638552749e54e169fc72537d4bcccxinhe                .INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP) {
154694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
15478d106780b6a638552749e54e169fc72537d4bcccxinhe            long diff = now_ms - mNetworkSelectionStatus.getDisableTime();
15482ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            if (diff <= 0) {
154994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append(" blackListed since <incorrect>");
15502ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            } else {
1551aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append(" blackListed: ").append(Long.toString(diff / 1000)).append("sec ");
155294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            }
155394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        }
1554aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        if (creatorUid != 0) sbuf.append(" cuid=" + creatorUid);
15553e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        if (creatorName != null) sbuf.append(" cname=" + creatorName);
15563e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        if (lastUpdateUid != 0) sbuf.append(" luid=" + lastUpdateUid);
15573e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        if (lastUpdateName != null) sbuf.append(" lname=" + lastUpdateName);
15581ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti        sbuf.append(" lcuid=" + lastConnectUid);
15591ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti        sbuf.append(" userApproved=" + userApprovedAsString(userApproved));
15601ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti        sbuf.append(" noInternetAccessExpected=" + noInternetAccessExpected);
1561e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar        sbuf.append(" isCarrierNetwork=" + isCarrierNetwork);
15621248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti        sbuf.append(" ");
15633e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
156494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.lastConnected != 0) {
156594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
156694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            long diff = now_ms - this.lastConnected;
156794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            if (diff <= 0) {
156894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append("lastConnected since <incorrect>");
156994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            } else {
1570aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("lastConnected: ").append(Long.toString(diff / 1000)).append("sec ");
157194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            }
157294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        }
157394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.lastConnectionFailure != 0) {
157494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
157594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            long diff = now_ms - this.lastConnectionFailure;
157694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            if (diff <= 0) {
15775ddc65b9860b7ef39a0921bcbca3cbc50abe3a2cPierre Vandwalle                sbuf.append("lastConnectionFailure since <incorrect> ");
157894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            } else {
1579aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("lastConnectionFailure: ").append(Long.toString(diff / 1000));
1580aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("sec ");
15812ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            }
15822ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        }
15838650c035609507340e3a66459cea16ef08cd03a6vandwalle        if (this.lastRoamingFailure != 0) {
15848650c035609507340e3a66459cea16ef08cd03a6vandwalle            sbuf.append('\n');
15858650c035609507340e3a66459cea16ef08cd03a6vandwalle            long diff = now_ms - this.lastRoamingFailure;
15868650c035609507340e3a66459cea16ef08cd03a6vandwalle            if (diff <= 0) {
15875ddc65b9860b7ef39a0921bcbca3cbc50abe3a2cPierre Vandwalle                sbuf.append("lastRoamingFailure since <incorrect> ");
15888650c035609507340e3a66459cea16ef08cd03a6vandwalle            } else {
1589aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("lastRoamingFailure: ").append(Long.toString(diff / 1000));
1590aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("sec ");
15918650c035609507340e3a66459cea16ef08cd03a6vandwalle            }
15928650c035609507340e3a66459cea16ef08cd03a6vandwalle        }
15938650c035609507340e3a66459cea16ef08cd03a6vandwalle        sbuf.append("roamingFailureBlackListTimeMilli: ").
15948650c035609507340e3a66459cea16ef08cd03a6vandwalle                append(Long.toString(this.roamingFailureBlackListTimeMilli));
1595448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        sbuf.append('\n');
1596448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        if (this.linkedConfigurations != null) {
1597aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy            for (String key : this.linkedConfigurations.keySet()) {
1598448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                sbuf.append(" linked: ").append(key);
1599448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                sbuf.append('\n');
1600448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            }
1601448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        }
160294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("triggeredLow: ").append(this.numUserTriggeredWifiDisableLowRSSI);
160394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(" triggeredBad: ").append(this.numUserTriggeredWifiDisableBadRSSI);
160494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(" triggeredNotHigh: ").append(this.numUserTriggeredWifiDisableNotHighRSSI);
160594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append('\n');
160694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("ticksLow: ").append(this.numTicksAtLowRSSI);
160794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(" ticksBad: ").append(this.numTicksAtBadRSSI);
160894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append(" ticksNotHigh: ").append(this.numTicksAtNotHighRSSI);
1609448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        sbuf.append('\n');
161094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("triggeredJoin: ").append(this.numUserTriggeredJoinAttempts);
1611448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        sbuf.append('\n');
16128f13548615f647a1208ace5369b504cb41149965vandwalle
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sbuf.toString();
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1616b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** {@hide} */
1617b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public String getPrintableSsid() {
1618b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (SSID == null) return "";
1619b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        final int length = SSID.length();
1620b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (length > 2 && (SSID.charAt(0) == '"') && SSID.charAt(length - 1) == '"') {
1621b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return SSID.substring(1, length - 1);
1622b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
1623b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
1624b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        /** The ascii-encoded string format is P"<ascii-encoded-string>"
1625b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         * The decoding is implemented in the supplicant for a newly configured
1626b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         * network.
1627b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         */
1628b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (length > 3 && (SSID.charAt(0) == 'P') && (SSID.charAt(1) == '"') &&
1629b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                (SSID.charAt(length-1) == '"')) {
1630b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded(
1631b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    SSID.substring(2, length - 1));
1632b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return wifiSsid.toString();
1633b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
1634b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return SSID;
1635b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
1636b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
16373e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /** @hide **/
16383e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static String userApprovedAsString(int userApproved) {
16393e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        switch (userApproved) {
16403e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            case USER_APPROVED:
16413e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                return "USER_APPROVED";
16423e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            case USER_BANNED:
16433e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                return "USER_BANNED";
16443e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            case USER_UNSPECIFIED:
16453e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                return "USER_UNSPECIFIED";
16463e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            default:
16473e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                return "INVALID";
16483e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        }
16493e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    }
16503e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
165126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    /**
165226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * Get an identifier for associating credentials with this config
165326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @param current configuration contains values for additional fields
165426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     *                that are not part of this configuration. Used
165526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     *                when a config with some fields is passed by an application.
165626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @throws IllegalStateException if config is invalid for key id generation
165726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @hide
165826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     */
1659ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public String getKeyIdForCredentials(WifiConfiguration current) {
166026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        String keyMgmt = null;
166126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
166226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        try {
166326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            // Get current config details for fields that are not initialized
166426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (TextUtils.isEmpty(SSID)) SSID = current.SSID;
166526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.cardinality() == 0) {
166626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                allowedKeyManagement = current.allowedKeyManagement;
166726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
166826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
166926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                keyMgmt = KeyMgmt.strings[KeyMgmt.WPA_EAP];
167026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
167161b5a7689320274ce5fff9a9eae1866d8d696b9bJan Nordqvist            if (allowedKeyManagement.get(KeyMgmt.OSEN)) {
167261b5a7689320274ce5fff9a9eae1866d8d696b9bJan Nordqvist                keyMgmt = KeyMgmt.strings[KeyMgmt.OSEN];
167361b5a7689320274ce5fff9a9eae1866d8d696b9bJan Nordqvist            }
167426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
167526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                keyMgmt += KeyMgmt.strings[KeyMgmt.IEEE8021X];
167626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
167726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
167826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (TextUtils.isEmpty(keyMgmt)) {
167926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                throw new IllegalStateException("Not an EAP network");
168026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
168126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
168226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            return trimStringForKeyId(SSID) + "_" + keyMgmt + "_" +
168326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                    trimStringForKeyId(enterpriseConfig.getKeyId(current != null ?
168426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                            current.enterpriseConfig : null));
168526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        } catch (NullPointerException e) {
168626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            throw new IllegalStateException("Invalid config details");
168726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        }
168826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    }
168926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
169026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    private String trimStringForKeyId(String string) {
169126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        // Remove quotes and spaces
169226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        return string.replace("\"", "").replace(" ", "");
169326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    }
169426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static BitSet readBitSet(Parcel src) {
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cardinality = src.readInt();
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BitSet set = new BitSet();
16999b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (int i = 0; i < cardinality; i++) {
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            set.set(src.readInt());
17019b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return set;
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void writeBitSet(Parcel dest, BitSet set) {
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nextSetBit = -1;
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(set.cardinality());
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17119b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) {
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(nextSetBit);
17139b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1716ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    /** @hide */
1717ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    public int getAuthType() {
1718d49288352908e8cbc9a001e13df2eb35e78deb1aJan Nordqvist        if (allowedKeyManagement.cardinality() > 1) {
1719d49288352908e8cbc9a001e13df2eb35e78deb1aJan Nordqvist            throw new IllegalStateException("More than one auth type set");
172026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        }
1721ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
1722ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA_PSK;
1723ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.WPA2_PSK)) {
1724ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA2_PSK;
1725ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
1726ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA_EAP;
1727ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
1728ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.IEEE8021X;
1729ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        }
1730ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        return KeyMgmt.NONE;
1731ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    }
1732ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff
17337c3606c103e95d3991267cca2592402a68779cafvandwalle    /* @hide
17347c3606c103e95d3991267cca2592402a68779cafvandwalle     * Cache the config key, this seems useful as a speed up since a lot of
17357c3606c103e95d3991267cca2592402a68779cafvandwalle     * lookups in the config store are done and based on this key.
17367c3606c103e95d3991267cca2592402a68779cafvandwalle     */
17377c3606c103e95d3991267cca2592402a68779cafvandwalle    String mCachedConfigKey;
17387c3606c103e95d3991267cca2592402a68779cafvandwalle
17397c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
17407c3606c103e95d3991267cca2592402a68779cafvandwalle     *  return the string used to calculate the hash in WifiConfigStore
17417c3606c103e95d3991267cca2592402a68779cafvandwalle     *  and uniquely identify this WifiConfiguration
17427c3606c103e95d3991267cca2592402a68779cafvandwalle     */
17437c3606c103e95d3991267cca2592402a68779cafvandwalle    public String configKey(boolean allowCached) {
17447c3606c103e95d3991267cca2592402a68779cafvandwalle        String key;
17457c3606c103e95d3991267cca2592402a68779cafvandwalle        if (allowCached && mCachedConfigKey != null) {
17467c3606c103e95d3991267cca2592402a68779cafvandwalle            key = mCachedConfigKey;
1747b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande        } else if (providerFriendlyName != null) {
1748b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande            key = FQDN + KeyMgmt.strings[KeyMgmt.WPA_EAP];
17496fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            if (!shared) {
17506fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski                key += "-" + Integer.toString(UserHandle.getUserId(creatorUid));
17516fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            }
17527c3606c103e95d3991267cca2592402a68779cafvandwalle        } else {
17538e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti            if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
17548e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                key = SSID + KeyMgmt.strings[KeyMgmt.WPA_PSK];
17558e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti            } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
17568e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                    allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
17578e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                key = SSID + KeyMgmt.strings[KeyMgmt.WPA_EAP];
17588e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti            } else if (wepKeys[0] != null) {
17598e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                key = SSID + "WEP";
17608e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti            } else {
17618e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                key = SSID + KeyMgmt.strings[KeyMgmt.NONE];
17627c3606c103e95d3991267cca2592402a68779cafvandwalle            }
17636fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            if (!shared) {
17646fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski                key += "-" + Integer.toString(UserHandle.getUserId(creatorUid));
17656fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            }
17667c3606c103e95d3991267cca2592402a68779cafvandwalle            mCachedConfigKey = key;
17677c3606c103e95d3991267cca2592402a68779cafvandwalle        }
17687c3606c103e95d3991267cca2592402a68779cafvandwalle        return key;
17697c3606c103e95d3991267cca2592402a68779cafvandwalle    }
17707c3606c103e95d3991267cca2592402a68779cafvandwalle
17717c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
17727c3606c103e95d3991267cca2592402a68779cafvandwalle     * get configKey, force calculating the config string
17737c3606c103e95d3991267cca2592402a68779cafvandwalle     */
17747c3606c103e95d3991267cca2592402a68779cafvandwalle    public String configKey() {
17757c3606c103e95d3991267cca2592402a68779cafvandwalle        return configKey(false);
17767c3606c103e95d3991267cca2592402a68779cafvandwalle    }
17777c3606c103e95d3991267cca2592402a68779cafvandwalle
17786346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
17796346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration getIpConfiguration() {
17806346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration;
17816346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
17826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
17836346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
17846346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setIpConfiguration(IpConfiguration ipConfiguration) {
17856346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration = ipConfiguration;
17866346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
17876346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
17886346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
17890a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public StaticIpConfiguration getStaticIpConfiguration() {
17900a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return mIpConfiguration.getStaticIpConfiguration();
17916346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
17926346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
17936346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
17940a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setStaticIpConfiguration(StaticIpConfiguration staticIpConfiguration) {
17950a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        mIpConfiguration.setStaticIpConfiguration(staticIpConfiguration);
17966346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
17976346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
17986346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
17996346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration.IpAssignment getIpAssignment() {
18006346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration.ipAssignment;
18016346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
18026346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
18036346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
18046346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setIpAssignment(IpConfiguration.IpAssignment ipAssignment) {
18056346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.ipAssignment = ipAssignment;
18066346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
18076346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
18086346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
18096346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration.ProxySettings getProxySettings() {
18106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration.proxySettings;
18116346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
18126346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
18136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
18146346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setProxySettings(IpConfiguration.ProxySettings proxySettings) {
18156346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.proxySettings = proxySettings;
18166346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
18176346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
18186346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
18190a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public ProxyInfo getHttpProxy() {
18200a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return mIpConfiguration.httpProxy;
18210a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
18220a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
18230a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    /** @hide */
18240a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setHttpProxy(ProxyInfo httpProxy) {
18250a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        mIpConfiguration.httpProxy = httpProxy;
18260a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
18270a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
18280a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    /** @hide */
18296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setProxy(ProxySettings settings, ProxyInfo proxy) {
18306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.proxySettings = settings;
18310a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        mIpConfiguration.httpProxy = proxy;
18326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
18336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
183413f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle    /** Implement the Parcelable interface {@hide} */
1835678979748585c5903125a404e448ad6c111dedadJaewan Kim    public int describeContents() {
1836678979748585c5903125a404e448ad6c111dedadJaewan Kim        return 0;
1837678979748585c5903125a404e448ad6c111dedadJaewan Kim    }
1838678979748585c5903125a404e448ad6c111dedadJaewan Kim
18396fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski    /** @hide */
1840a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public void setPasspointManagementObjectTree(String passpointManagementObjectTree) {
1841a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        mPasspointManagementObjectTree = passpointManagementObjectTree;
1842a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
1843a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
1844a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /** @hide */
1845a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public String getMoTree() {
1846a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        return mPasspointManagementObjectTree;
1847a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
1848a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
1849128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    /** copy constructor {@hide} */
1850128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    public WifiConfiguration(WifiConfiguration source) {
1851128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        if (source != null) {
1852128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            networkId = source.networkId;
1853128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            status = source.status;
1854128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            SSID = source.SSID;
1855128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            BSSID = source.BSSID;
18568a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng            FQDN = source.FQDN;
1857a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande            roamingConsortiumIds = source.roamingConsortiumIds.clone();
1858b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande            providerFriendlyName = source.providerFriendlyName;
1859128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            preSharedKey = source.preSharedKey;
1860128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
18618d106780b6a638552749e54e169fc72537d4bcccxinhe            mNetworkSelectionStatus.copy(source.getNetworkSelectionStatus());
1862a0be0fb2709124a567f89114b1d8e80f74452edcxinhe            apBand = source.apBand;
1863a0be0fb2709124a567f89114b1d8e80f74452edcxinhe            apChannel = source.apChannel;
1864a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
1865128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            wepKeys = new String[4];
18669b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            for (int i = 0; i < wepKeys.length; i++) {
1867128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff                wepKeys[i] = source.wepKeys[i];
18689b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            }
1869128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
1870128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            wepTxKeyIndex = source.wepTxKeyIndex;
1871128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            priority = source.priority;
1872128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            hiddenSSID = source.hiddenSSID;
1873128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedKeyManagement   = (BitSet) source.allowedKeyManagement.clone();
1874128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedProtocols       = (BitSet) source.allowedProtocols.clone();
1875128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedAuthAlgorithms  = (BitSet) source.allowedAuthAlgorithms.clone();
1876128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedPairwiseCiphers = (BitSet) source.allowedPairwiseCiphers.clone();
1877128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedGroupCiphers    = (BitSet) source.allowedGroupCiphers.clone();
18789b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            enterpriseConfig = new WifiEnterpriseConfig(source.enterpriseConfig);
1879678979748585c5903125a404e448ad6c111dedadJaewan Kim
18807c3606c103e95d3991267cca2592402a68779cafvandwalle            defaultGwMacAddress = source.defaultGwMacAddress;
18817c3606c103e95d3991267cca2592402a68779cafvandwalle
18826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            mIpConfiguration = new IpConfiguration(source.mIpConfiguration);
18836346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
18847c3606c103e95d3991267cca2592402a68779cafvandwalle            if ((source.linkedConfigurations != null)
18857c3606c103e95d3991267cca2592402a68779cafvandwalle                    && (source.linkedConfigurations.size() > 0)) {
18867c3606c103e95d3991267cca2592402a68779cafvandwalle                linkedConfigurations = new HashMap<String, Integer>();
18877c3606c103e95d3991267cca2592402a68779cafvandwalle                linkedConfigurations.putAll(source.linkedConfigurations);
18887c3606c103e95d3991267cca2592402a68779cafvandwalle            }
18897c3606c103e95d3991267cca2592402a68779cafvandwalle            mCachedConfigKey = null; //force null configKey
1890e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle            selfAdded = source.selfAdded;
1891ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle            validatedInternetAccess = source.validatedInternetAccess;
18928faf2a2a15853368a14babf935c156664b5f0b6cJeff Davidson            ephemeral = source.ephemeral;
1893f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin            meteredHint = source.meteredHint;
1894fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin            useExternalScores = source.useExternalScores;
18957c3606c103e95d3991267cca2592402a68779cafvandwalle            if (source.visibility != null) {
18967c3606c103e95d3991267cca2592402a68779cafvandwalle                visibility = new Visibility(source.visibility);
18977c3606c103e95d3991267cca2592402a68779cafvandwalle            }
18983a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle
18993a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle            lastFailure = source.lastFailure;
19008f13548615f647a1208ace5369b504cb41149965vandwalle            didSelfAdd = source.didSelfAdd;
19018f13548615f647a1208ace5369b504cb41149965vandwalle            lastConnectUid = source.lastConnectUid;
19028f13548615f647a1208ace5369b504cb41149965vandwalle            lastUpdateUid = source.lastUpdateUid;
19038f13548615f647a1208ace5369b504cb41149965vandwalle            creatorUid = source.creatorUid;
19043e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            creatorName = source.creatorName;
19053e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            lastUpdateName = source.lastUpdateName;
19062d0f71eea20470985abde98d759910a1ac40b257vandwalle            peerWifiConfiguration = source.peerWifiConfiguration;
19078d106780b6a638552749e54e169fc72537d4bcccxinhe
1908111fa0274d1d6620f9634783585387f3b773949evandwalle            lastConnected = source.lastConnected;
1909111fa0274d1d6620f9634783585387f3b773949evandwalle            lastDisconnected = source.lastDisconnected;
1910154b2cf6bbb99ee258b289846183172139a87dbavandwalle            lastConnectionFailure = source.lastConnectionFailure;
19118650c035609507340e3a66459cea16ef08cd03a6vandwalle            lastRoamingFailure = source.lastRoamingFailure;
19128650c035609507340e3a66459cea16ef08cd03a6vandwalle            lastRoamingFailureReason = source.lastRoamingFailureReason;
19138650c035609507340e3a66459cea16ef08cd03a6vandwalle            roamingFailureBlackListTimeMilli = source.roamingFailureBlackListTimeMilli;
1914154b2cf6bbb99ee258b289846183172139a87dbavandwalle            numScorerOverride = source.numScorerOverride;
1915154b2cf6bbb99ee258b289846183172139a87dbavandwalle            numScorerOverrideAndSwitchedNetwork = source.numScorerOverrideAndSwitchedNetwork;
19164eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            numAssociation = source.numAssociation;
1917448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numUserTriggeredWifiDisableLowRSSI = source.numUserTriggeredWifiDisableLowRSSI;
1918448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numUserTriggeredWifiDisableBadRSSI = source.numUserTriggeredWifiDisableBadRSSI;
1919448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numUserTriggeredWifiDisableNotHighRSSI = source.numUserTriggeredWifiDisableNotHighRSSI;
1920448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numTicksAtLowRSSI = source.numTicksAtLowRSSI;
1921448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numTicksAtBadRSSI = source.numTicksAtBadRSSI;
1922448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numTicksAtNotHighRSSI = source.numTicksAtNotHighRSSI;
1923448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            numUserTriggeredJoinAttempts = source.numUserTriggeredJoinAttempts;
19243e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            userApproved = source.userApproved;
1925ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle            numNoInternetAccessReports = source.numNoInternetAccessReports;
19261248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti            noInternetAccessExpected = source.noInternetAccessExpected;
1927e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar            isCarrierNetwork = source.isCarrierNetwork;
1928ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle            creationTime = source.creationTime;
1929ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle            updateTime = source.updateTime;
19306fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            shared = source.shared;
19316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        }
19329e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff    }
19339e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
19356346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    @Override
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int flags) {
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(networkId);
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(status);
19398d106780b6a638552749e54e169fc72537d4bcccxinhe        mNetworkSelectionStatus.writeToParcel(dest);
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(SSID);
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(BSSID);
1942a0be0fb2709124a567f89114b1d8e80f74452edcxinhe        dest.writeInt(apBand);
1943a0be0fb2709124a567f89114b1d8e80f74452edcxinhe        dest.writeInt(apChannel);
19448a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng        dest.writeString(FQDN);
1945b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande        dest.writeString(providerFriendlyName);
1946a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande        dest.writeInt(roamingConsortiumIds.length);
19477226c8f95b5971af2710c8d2f8a8b6f2210e2420Vinit Deshpande        for (long roamingConsortiumId : roamingConsortiumIds) {
1948b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande            dest.writeLong(roamingConsortiumId);
1949b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande        }
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(preSharedKey);
19519b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (String wepKey : wepKeys) {
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeString(wepKey);
19539b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(wepTxKeyIndex);
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(priority);
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(hiddenSSID ? 1 : 0);
19575f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng        dest.writeInt(requirePMF ? 1 : 0);
19585f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng        dest.writeString(updateIdentifier);
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedKeyManagement);
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedProtocols);
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedAuthAlgorithms);
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedPairwiseCiphers);
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedGroupCiphers);
19654337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
19669b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        dest.writeParcelable(enterpriseConfig, flags);
1967678979748585c5903125a404e448ad6c111dedadJaewan Kim
19686346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        dest.writeParcelable(mIpConfiguration, flags);
19697c3606c103e95d3991267cca2592402a68779cafvandwalle        dest.writeString(dhcpServer);
19707c3606c103e95d3991267cca2592402a68779cafvandwalle        dest.writeString(defaultGwMacAddress);
1971e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        dest.writeInt(selfAdded ? 1 : 0);
19728f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(didSelfAdd ? 1 : 0);
1973ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        dest.writeInt(validatedInternetAccess ? 1 : 0);
19748faf2a2a15853368a14babf935c156664b5f0b6cJeff Davidson        dest.writeInt(ephemeral ? 1 : 0);
1975f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin        dest.writeInt(meteredHint ? 1 : 0);
1976fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin        dest.writeInt(useExternalScores ? 1 : 0);
19778f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(creatorUid);
19788f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(lastConnectUid);
19798f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(lastUpdateUid);
19803e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        dest.writeString(creatorName);
19813e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        dest.writeString(lastUpdateName);
1982154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeLong(lastConnectionFailure);
19838650c035609507340e3a66459cea16ef08cd03a6vandwalle        dest.writeLong(lastRoamingFailure);
19848650c035609507340e3a66459cea16ef08cd03a6vandwalle        dest.writeInt(lastRoamingFailureReason);
19858650c035609507340e3a66459cea16ef08cd03a6vandwalle        dest.writeLong(roamingFailureBlackListTimeMilli);
1986154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeInt(numScorerOverride);
1987154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeInt(numScorerOverrideAndSwitchedNetwork);
19884eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        dest.writeInt(numAssociation);
1989448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numUserTriggeredWifiDisableLowRSSI);
1990448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numUserTriggeredWifiDisableBadRSSI);
1991448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numUserTriggeredWifiDisableNotHighRSSI);
1992448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numTicksAtLowRSSI);
1993448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numTicksAtBadRSSI);
1994448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numTicksAtNotHighRSSI);
1995448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        dest.writeInt(numUserTriggeredJoinAttempts);
19963e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        dest.writeInt(userApproved);
1997ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        dest.writeInt(numNoInternetAccessReports);
19981248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti        dest.writeInt(noInternetAccessExpected ? 1 : 0);
1999e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar        dest.writeInt(isCarrierNetwork ? 1 : 0);
20006fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski        dest.writeInt(shared ? 1 : 0);
2001a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        dest.writeString(mPasspointManagementObjectTree);
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<WifiConfiguration> CREATOR =
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Creator<WifiConfiguration>() {
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiConfiguration createFromParcel(Parcel in) {
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WifiConfiguration config = new WifiConfiguration();
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.networkId = in.readInt();
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.status = in.readInt();
20118d106780b6a638552749e54e169fc72537d4bcccxinhe                config.mNetworkSelectionStatus.readFromParcel(in);
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.SSID = in.readString();
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.BSSID = in.readString();
2014a0be0fb2709124a567f89114b1d8e80f74452edcxinhe                config.apBand = in.readInt();
2015a0be0fb2709124a567f89114b1d8e80f74452edcxinhe                config.apChannel = in.readInt();
20168a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng                config.FQDN = in.readString();
2017b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                config.providerFriendlyName = in.readString();
2018b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                int numRoamingConsortiumIds = in.readInt();
20197226c8f95b5971af2710c8d2f8a8b6f2210e2420Vinit Deshpande                config.roamingConsortiumIds = new long[numRoamingConsortiumIds];
2020b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                for (int i = 0; i < numRoamingConsortiumIds; i++) {
2021a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande                    config.roamingConsortiumIds[i] = in.readLong();
2022b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                }
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.preSharedKey = in.readString();
20249b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                for (int i = 0; i < config.wepKeys.length; i++) {
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    config.wepKeys[i] = in.readString();
20269b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                }
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.wepTxKeyIndex = in.readInt();
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.priority = in.readInt();
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.hiddenSSID = in.readInt() != 0;
20305f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng                config.requirePMF = in.readInt() != 0;
20315f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng                config.updateIdentifier = in.readString();
20325f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedKeyManagement   = readBitSet(in);
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedProtocols       = readBitSet(in);
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedAuthAlgorithms  = readBitSet(in);
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedPairwiseCiphers = readBitSet(in);
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedGroupCiphers    = readBitSet(in);
20384337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
20399b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                config.enterpriseConfig = in.readParcelable(null);
20406346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                config.mIpConfiguration = in.readParcelable(null);
20417c3606c103e95d3991267cca2592402a68779cafvandwalle                config.dhcpServer = in.readString();
20427c3606c103e95d3991267cca2592402a68779cafvandwalle                config.defaultGwMacAddress = in.readString();
2043e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle                config.selfAdded = in.readInt() != 0;
20448f13548615f647a1208ace5369b504cb41149965vandwalle                config.didSelfAdd = in.readInt() != 0;
2045ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle                config.validatedInternetAccess = in.readInt() != 0;
20468faf2a2a15853368a14babf935c156664b5f0b6cJeff Davidson                config.ephemeral = in.readInt() != 0;
2047f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin                config.meteredHint = in.readInt() != 0;
2048fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin                config.useExternalScores = in.readInt() != 0;
20498f13548615f647a1208ace5369b504cb41149965vandwalle                config.creatorUid = in.readInt();
20508f13548615f647a1208ace5369b504cb41149965vandwalle                config.lastConnectUid = in.readInt();
20518f13548615f647a1208ace5369b504cb41149965vandwalle                config.lastUpdateUid = in.readInt();
20523e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                config.creatorName = in.readString();
20533e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                config.lastUpdateName = in.readString();
2054154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.lastConnectionFailure = in.readLong();
20558650c035609507340e3a66459cea16ef08cd03a6vandwalle                config.lastRoamingFailure = in.readLong();
20568650c035609507340e3a66459cea16ef08cd03a6vandwalle                config.lastRoamingFailureReason = in.readInt();
20578650c035609507340e3a66459cea16ef08cd03a6vandwalle                config.roamingFailureBlackListTimeMilli = in.readLong();
2058154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.numScorerOverride = in.readInt();
2059154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.numScorerOverrideAndSwitchedNetwork = in.readInt();
20604eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle                config.numAssociation = in.readInt();
2061448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numUserTriggeredWifiDisableLowRSSI = in.readInt();
2062448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numUserTriggeredWifiDisableBadRSSI = in.readInt();
2063448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numUserTriggeredWifiDisableNotHighRSSI = in.readInt();
2064448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numTicksAtLowRSSI = in.readInt();
2065448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numTicksAtBadRSSI = in.readInt();
2066448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numTicksAtNotHighRSSI = in.readInt();
2067448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                config.numUserTriggeredJoinAttempts = in.readInt();
20683e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                config.userApproved = in.readInt();
2069ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle                config.numNoInternetAccessReports = in.readInt();
20701248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti                config.noInternetAccessExpected = in.readInt() != 0;
2071e45b50293eb9f13596b3a797ecc6815a443d0cdfpkanwar                config.isCarrierNetwork = in.readInt() != 0;
20726fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski                config.shared = in.readInt() != 0;
2073a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande                config.mPasspointManagementObjectTree = in.readString();
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return config;
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiConfiguration[] newArray(int size) {
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new WifiConfiguration[size];
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
2081aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2082aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    /**
2083aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * Serializes the object for backup
2084aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * @hide
2085aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     */
2086aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    public byte[] getBytesForBackup() throws IOException {
2087aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        ByteArrayOutputStream baos = new ByteArrayOutputStream();
2088aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        DataOutputStream out = new DataOutputStream(baos);
2089aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2090aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        out.writeInt(BACKUP_VERSION);
2091aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        BackupUtils.writeString(out, SSID);
2092aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        out.writeInt(apBand);
2093aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        out.writeInt(apChannel);
2094aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        BackupUtils.writeString(out, preSharedKey);
2095aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        out.writeInt(getAuthType());
2096aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        return baos.toByteArray();
2097aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    }
2098aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2099aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    /**
2100aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * Deserializes a byte array into the WiFiConfiguration Object
2101aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * @hide
2102aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     */
2103aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    public static WifiConfiguration getWifiConfigFromBackup(DataInputStream in) throws IOException,
2104aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy            BackupUtils.BadVersionException {
2105aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        WifiConfiguration config = new WifiConfiguration();
2106aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        int version = in.readInt();
2107aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        if (version < 1 || version > BACKUP_VERSION) {
2108aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy            throw new BackupUtils.BadVersionException("Unknown Backup Serialization Version");
2109aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        }
2110aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2111aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        if (version == 1) return null; // Version 1 is a bad dataset.
2112aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2113aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.SSID = BackupUtils.readString(in);
2114aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.apBand = in.readInt();
2115aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.apChannel = in.readInt();
2116aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.preSharedKey = BackupUtils.readString(in);
2117aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.allowedKeyManagement.set(in.readInt());
2118aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        return config;
2119aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    }
2120b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne}
2121