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;
251375ede09255e04141f680c3e90526e9f34bf061Glen Kuhneimport android.net.Uri;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.os.Parcelable;
286fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowskiimport android.os.UserHandle;
2926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriffimport android.text.TextUtils;
30aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport android.util.BackupUtils;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport java.io.ByteArrayOutputStream;
33aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport java.io.DataInputStream;
34aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport java.io.DataOutputStream;
35aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddyimport java.io.IOException;
368d106780b6a638552749e54e169fc72537d4bcccxinheimport java.util.Arrays;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.BitSet;
388d106780b6a638552749e54e169fc72537d4bcccxinheimport java.util.HashMap;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class representing a configured Wi-Fi network, including the
429b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff * security configuration.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
44678979748585c5903125a404e448ad6c111dedadJaewan Kimpublic class WifiConfiguration implements Parcelable {
459b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    private static final String TAG = "WifiConfiguration";
46aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    /**
47aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * Current Version of the Backup Serializer.
48aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    */
49aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    private static final int BACKUP_VERSION = 2;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String ssidVarName = "ssid";
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String bssidVarName = "bssid";
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String pskVarName = "psk";
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String[] wepKeyVarNames = { "wep_key0", "wep_key1", "wep_key2", "wep_key3" };
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String wepTxKeyIdxVarName = "wep_tx_keyidx";
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String priorityVarName = "priority";
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String hiddenSSIDVarName = "scan_ssid";
645ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    /** {@hide} */
655f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public static final String pmfVarName = "ieee80211w";
665f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /** {@hide} */
675f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public static final String updateIdentiferVarName = "update_identifier";
685f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /** {@hide} */
695ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    public static final int INVALID_NETWORK_ID = -1;
70544eff2d23fdb73b993a2525414326fbd44d3428Rebecca Silberstein    /** {@hide} */
71544eff2d23fdb73b993a2525414326fbd44d3428Rebecca Silberstein    public static final int LOCAL_ONLY_NETWORK_ID = -2;
72a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
73a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /** {@hide} */
74a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    private String mPasspointManagementObjectTree;
75a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized key management schemes.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class KeyMgmt {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private KeyMgmt() { }
815069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA is not used; plaintext or static WEP could be used. */
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int NONE = 0;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA pre-shared key (requires {@code preSharedKey} to be specified). */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA_PSK = 1;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA using EAP authentication. Generally used with an external authentication server. */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA_EAP = 2;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** IEEE 802.1X using EAP authentication and (optionally) dynamically
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * generated WEP keys. */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int IEEE8021X = 3;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        /** WPA2 pre-shared key for use with soft access point
93ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          * (requires {@code preSharedKey} to be specified).
94ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          * @hide
95ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff          */
96b625377b1a9b324254fcde9928eade4473712486Jeremy Klein        @SystemApi
97ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        public static final int WPA2_PSK = 4;
98a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        /**
99a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         * Hotspot 2.0 r2 OSEN:
100a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         * @hide
101a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         */
102a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final int OSEN = 5;
103ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff
104e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart        /**
105e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart         * IEEE 802.11r Fast BSS Transition with PSK authentication.
106e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart         * @hide
107e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart         */
108e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart        public static final int FT_PSK = 6;
109e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart
110e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart        /**
111e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart         * IEEE 802.11r Fast BSS Transition with EAP authentication.
112e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart         * @hide
113e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart         */
114e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart        public static final int FT_EAP = 7;
115e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "key_mgmt";
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
118ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP", "IEEE8021X",
119e72f7dc385bf0d8ae2c5015aaa7de74b5ef769ebPaul Stewart                "WPA2_PSK", "OSEN", "FT_PSK", "FT_EAP" };
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1215069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized security protocols.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Protocol {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Protocol() { }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA/IEEE 802.11i/D3.0 */
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WPA = 0;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WPA2/IEEE 802.11i */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RSN = 1;
132a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        /** HS2.0 r2 OSEN
133a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         * @hide
134a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         */
135a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final int OSEN = 2;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "proto";
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final String[] strings = { "WPA", "RSN", "OSEN" };
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized IEEE 802.11 authentication algorithms.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class AuthAlgorithm {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private AuthAlgorithm() { }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Open System authentication (required for WPA/WPA2) */
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int OPEN = 0;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Shared Key authentication (requires static WEP keys) */
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int SHARED = 1;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** LEAP/Network EAP (only used with LEAP) */
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int LEAP = 2;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "auth_alg";
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "OPEN", "SHARED", "LEAP" };
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized pairwise ciphers for WPA.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class PairwiseCipher {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private PairwiseCipher() { }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Use only Group keys (deprecated) */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int NONE = 0;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TKIP = 1;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CCMP = 2;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "pairwise";
1745069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "NONE", "TKIP", "CCMP" };
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recognized group ciphers.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <pre>
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11)
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </pre>
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class GroupCipher {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private GroupCipher() { }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11) */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WEP40 = 0;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key */
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int WEP104 = 1;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TKIP = 2;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CCMP = 3;
198a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        /** Hotspot 2.0 r2 OSEN
199a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         * @hide
200a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande         */
201a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final int GTK_NOT_USED = 4;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String varName = "group";
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
205a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        public static final String[] strings =
206a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande                { "WEP40", "WEP104", "TKIP", "CCMP", "GTK_NOT_USED" };
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Possible status of a network configuration. */
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Status {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Status() { }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** this is the network we are currently connected to */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int CURRENT = 0;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** supplicant will not attempt to use this network */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int DISABLED = 1;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /** supplicant will consider this network available for association */
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ENABLED = 2;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String[] strings = { "current", "disabled", "enabled" };
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2238dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
2241ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti    public static final int UNKNOWN_UID = -1;
2251ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The ID number that the supplicant uses to identify this
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * network configuration entry. This must be passed as an argument
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to most calls into the supplicant.
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int networkId;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
233d4b072159de3a4042e813b043e07b2c125c1d6d9David Farrow    // Fixme We need remove this field to use only Quality network selection status only
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The current status of this network configuration entry.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Status
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int status;
2398dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy
2408dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /**
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The network's SSID. Can either be an ASCII string,
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which must be enclosed in double quotation marks
243d4b072159de3a4042e813b043e07b2c125c1d6d9David Farrow     * (e.g., {@code "MyNetwork"}), or a string of
244d4b072159de3a4042e813b043e07b2c125c1d6d9David Farrow     * hex digits, which are not enclosed in quotes
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (e.g., {@code 01a243f405}).
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String SSID;
24843d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When set, this network configuration entry should only be used when
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associating with the AP having the specified BSSID. The value is
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a string in the format of an Ethernet MAC address, e.g.,
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>XX:XX:XX:XX:XX:XX</code> where each <code>X</code> is a hex digit.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String BSSID;
256a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
257a0be0fb2709124a567f89114b1d8e80f74452edcxinhe    /**
258d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     * 2GHz band.
259d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     * @hide
260d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     */
261d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    public static final int AP_BAND_2GHZ = 0;
262d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu
263d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    /**
264d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     * 5GHz band.
265d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     * @hide
266d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu     */
267d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    public static final int AP_BAND_5GHZ = 1;
268d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu
269d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    /**
270a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * The band which AP resides on
271a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * 0-2G  1-5G
272a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * By default, 2G is chosen
2737e5e791d22e76eb576fd5cf6dd5437b8050b0438xinhe     * @hide
274a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     */
275d6676166599b7cadd043b0bd400aeace3059621bPeter Qiu    public int apBand = AP_BAND_2GHZ;
276a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
277a0be0fb2709124a567f89114b1d8e80f74452edcxinhe    /**
278a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * The channel which AP resides on,currently, US only
279a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * 2G  1-11
280a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * 5G  36,40,44,48,149,153,157,161,165
281a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     * 0 - find a random available channel according to the apBand
2827e5e791d22e76eb576fd5cf6dd5437b8050b0438xinhe     * @hide
283a0be0fb2709124a567f89114b1d8e80f74452edcxinhe     */
284a0be0fb2709124a567f89114b1d8e80f74452edcxinhe    public int apChannel = 0;
285a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
2868a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng    /**
287a3406db72c14efd9610efc911e337ad3eb45b1c6Roshan Pius     * Pre-shared key for use with WPA-PSK. Either an ASCII string enclosed in
288a3406db72c14efd9610efc911e337ad3eb45b1c6Roshan Pius     * double quotation marks (e.g., {@code "abcdefghij"} for PSK passphrase or
289a3406db72c14efd9610efc911e337ad3eb45b1c6Roshan Pius     * a string of 64 hex digits for raw PSK.
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the value of this key is read, the actual key is
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not returned, just a "*" if the key has a value, or the null
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * string otherwise.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String preSharedKey;
296d4b072159de3a4042e813b043e07b2c125c1d6d9David Farrow
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Up to four WEP keys. Either an ASCII string enclosed in double
299d4b072159de3a4042e813b043e07b2c125c1d6d9David Farrow     * quotation marks (e.g., {@code "abcdef"}) or a string
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of hex digits (e.g., {@code 0102030405}).
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the value of one of these keys is read, the actual key is
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not returned, just a "*" if the key has a value, or the null
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * string otherwise.
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] wepKeys;
3075069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Default WEP key index, ranging from 0 to 3. */
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int wepTxKeyIndex;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Priority determines the preference given to a network by {@code wpa_supplicant}
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when choosing an access point with which to associate.
31426300afd75eeb5d57ca1019058a0ab54bf2be733Roshan Pius     * @deprecated This field does not exist anymore.
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
316c082d63a3b62b7231f86d871ac16e0a24586f907Roshan Pius    @Deprecated
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int priority;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a network that does not broadcast its SSID, so an
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SSID-specific probe request must be used for scans.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hiddenSSID;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3265f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * This is a network that requries Protected Management Frames (PMF).
3275f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * @hide
3285f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     */
3295f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public boolean requirePMF;
3305f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
3315f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /**
3325f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * Update identifier, for Passpoint network.
3335f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     * @hide
3345f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng     */
3355f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    public String updateIdentifier;
3365f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
3375f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng    /**
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of key management protocols supported by this configuration.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link KeyMgmt} for descriptions of the values.
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to WPA-PSK WPA-EAP.
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedKeyManagement;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of security protocols supported by this configuration.
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link Protocol} for descriptions of the values.
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to WPA RSN.
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedProtocols;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of authentication protocols supported by this configuration.
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link AuthAlgorithm} for descriptions of the values.
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to automatic selection.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedAuthAlgorithms;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of pairwise ciphers for WPA supported by this configuration.
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link PairwiseCipher} for descriptions of the values.
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to CCMP TKIP.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedPairwiseCiphers;
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The set of group ciphers supported by this configuration.
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link GroupCipher} for descriptions of the values.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defaults to CCMP TKIP WEP104 WEP40.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BitSet allowedGroupCiphers;
3679b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    /**
36826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * The enterprise configuration details specifying the EAP method,
36926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * certificates and other settings associated with the EAP.
3709b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff     */
3719b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff    public WifiEnterpriseConfig enterpriseConfig;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
373678979748585c5903125a404e448ad6c111dedadJaewan Kim    /**
3746bbc8955c17ed44f63ddbf78d0e4d24b60ac05cdPeter Qiu     * Fully qualified domain name of a Passpoint configuration
375b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande     */
376b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    public String FQDN;
377b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande
378b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    /**
3796bbc8955c17ed44f63ddbf78d0e4d24b60ac05cdPeter Qiu     * Name of Passpoint credential provider
380b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande     */
381b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    public String providerFriendlyName;
382b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande
383b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    /**
3841379fd0b1ef952547934846f4b6c40780f885e47Peter Qiu     * Flag indicating if this network is provided by a home Passpoint provider or a roaming
385f7303ba18e1c6631da4e41a2b571e32f93f01844Peter Qiu     * Passpoint provider.  This flag will be {@code true} if this network is provided by
386f7303ba18e1c6631da4e41a2b571e32f93f01844Peter Qiu     * a home Passpoint provider and {@code false} if is provided by a roaming Passpoint provider
387f7303ba18e1c6631da4e41a2b571e32f93f01844Peter Qiu     * or is a non-Passpoint network.
3881379fd0b1ef952547934846f4b6c40780f885e47Peter Qiu     */
3891379fd0b1ef952547934846f4b6c40780f885e47Peter Qiu    public boolean isHomeProviderNetwork;
3901379fd0b1ef952547934846f4b6c40780f885e47Peter Qiu
3911379fd0b1ef952547934846f4b6c40780f885e47Peter Qiu    /**
3926bbc8955c17ed44f63ddbf78d0e4d24b60ac05cdPeter Qiu     * Roaming Consortium Id list for Passpoint credential; identifies a set of networks where
3936bbc8955c17ed44f63ddbf78d0e4d24b60ac05cdPeter Qiu     * Passpoint credential will be considered valid
394b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande     */
3957226c8f95b5971af2710c8d2f8a8b6f2210e2420Vinit Deshpande    public long[] roamingConsortiumIds;
396b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande
397b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande    /**
398678979748585c5903125a404e448ad6c111dedadJaewan Kim     * @hide
3996fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski     * This network configuration is visible to and usable by other users on the
4006fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski     * same device.
4016fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski     */
4026fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski    public boolean shared;
4036fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski
4046fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski    /**
4056fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski     * @hide
406678979748585c5903125a404e448ad6c111dedadJaewan Kim     */
4076346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    private IpConfiguration mIpConfiguration;
408678979748585c5903125a404e448ad6c111dedadJaewan Kim
409678979748585c5903125a404e448ad6c111dedadJaewan Kim    /**
410678979748585c5903125a404e448ad6c111dedadJaewan Kim     * @hide
4117c3606c103e95d3991267cca2592402a68779cafvandwalle     * dhcp server MAC address if known
4127c3606c103e95d3991267cca2592402a68779cafvandwalle     */
4137c3606c103e95d3991267cca2592402a68779cafvandwalle    public String dhcpServer;
4147c3606c103e95d3991267cca2592402a68779cafvandwalle
4157c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
4167c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
4177c3606c103e95d3991267cca2592402a68779cafvandwalle     * default Gateway MAC address if known
4187c3606c103e95d3991267cca2592402a68779cafvandwalle     */
4197c3606c103e95d3991267cca2592402a68779cafvandwalle    public String defaultGwMacAddress;
4207c3606c103e95d3991267cca2592402a68779cafvandwalle
4217c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
4227c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
423ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * last time we connected, this configuration had validated internet access
424448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     */
425ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    public boolean validatedInternetAccess;
426448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle
427448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle    /**
428448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle     * @hide
429b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * The number of beacon intervals between Delivery Traffic Indication Maps (DTIM)
430b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * This value is populated from scan results that contain Beacon Frames, which are infrequent.
431b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * The value is not guaranteed to be set or current (Although it SHOULDNT change once set)
432b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * Valid values are from 1 - 255. Initialized here as 0, use this to check if set.
433b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     */
434b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne    public int dtimInterval = 0;
435b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne
436b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne    /**
437580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu     * Flag indicating if this configuration represents a legacy Passpoint configuration
438580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu     * (Release N or older).  This is used for migrating Passpoint configuration from N to O.
439580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu     * This will no longer be needed after O.
440580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu     * @hide
441580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu     */
442580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu    public boolean isLegacyPasspointConfig = false;
443580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu    /**
444b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne     * @hide
4458f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of app creating the configuration
4468f13548615f647a1208ace5369b504cb41149965vandwalle     */
447adae06be9bfd8cb756e1793b52e682eb87258968Chelsea Derrick    @SystemApi
4488f13548615f647a1208ace5369b504cb41149965vandwalle    public int creatorUid;
4498f13548615f647a1208ace5369b504cb41149965vandwalle
4508f13548615f647a1208ace5369b504cb41149965vandwalle    /**
4518f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
4528f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of last app issuing a connection related command
4538f13548615f647a1208ace5369b504cb41149965vandwalle     */
4548f13548615f647a1208ace5369b504cb41149965vandwalle    public int lastConnectUid;
4558f13548615f647a1208ace5369b504cb41149965vandwalle
4568f13548615f647a1208ace5369b504cb41149965vandwalle    /**
4578f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
4588f13548615f647a1208ace5369b504cb41149965vandwalle     * Uid of last app modifying the configuration
4598f13548615f647a1208ace5369b504cb41149965vandwalle     */
460eb8f329a5e8d4df80447ab9676761f9743d20cd4Chelsea Derrick    @SystemApi
4618f13548615f647a1208ace5369b504cb41149965vandwalle    public int lastUpdateUid;
4628f13548615f647a1208ace5369b504cb41149965vandwalle
4638f13548615f647a1208ace5369b504cb41149965vandwalle    /**
4648f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
4653e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * Universal name for app creating the configuration
4663e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     *    see {#link {@link PackageManager#getNameForUid(int)}
4673e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
4683e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    @SystemApi
4693e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public String creatorName;
4703e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
4713e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
4723e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
4733e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * Universal name for app updating the configuration
4743e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     *    see {#link {@link PackageManager#getNameForUid(int)}
4753e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
4763e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    @SystemApi
4773e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public String lastUpdateName;
4783e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
4793e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
4803e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
4813e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * Status of user approval for connection
4823e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
4833e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public int userApproved = USER_UNSPECIFIED;
4843e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
4852ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /** The Below RSSI thresholds are used to configure AutoJoin
4862ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     *  - GOOD/LOW/BAD thresholds are used so as to calculate link score
4872e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - UNWANTED_SOFT are used by the blacklisting logic so as to handle
4882e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the unwanted network message coming from CS
4892e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - UNBLACKLIST thresholds are used so as to tweak the speed at which
4902e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the network is unblacklisted (i.e. if
4912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     *          it is seen with good RSSI, it is blacklisted faster)
4922e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  - INITIAL_AUTOJOIN_ATTEMPT, used to determine how close from
4932e93c38fa6fad224e56a45ff4244bdd538aec846vandwalle     *  the network we need to be before autojoin kicks in
4942ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
4957c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide **/
4967c3606c103e95d3991267cca2592402a68779cafvandwalle    public static int INVALID_RSSI = -127;
4977c3606c103e95d3991267cca2592402a68779cafvandwalle
4987c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
4997c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
5007c3606c103e95d3991267cca2592402a68779cafvandwalle     * A summary of the RSSI and Band status for that configuration
5017c3606c103e95d3991267cca2592402a68779cafvandwalle     * This is used as a temporary value by the auto-join controller
5027c3606c103e95d3991267cca2592402a68779cafvandwalle     */
5036f6c781cca66cabc1f06be368a6dfedceb88ed0eVinit Deshpande    public static final class Visibility {
5047c3606c103e95d3991267cca2592402a68779cafvandwalle        public int rssi5;   // strongest 5GHz RSSI
5057c3606c103e95d3991267cca2592402a68779cafvandwalle        public int rssi24;  // strongest 2.4GHz RSSI
5067c3606c103e95d3991267cca2592402a68779cafvandwalle        public int num5;    // number of BSSIDs on 5GHz
5077c3606c103e95d3991267cca2592402a68779cafvandwalle        public int num24;   // number of BSSIDs on 2.4GHz
508e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public long age5;   // timestamp of the strongest 5GHz BSSID (last time it was seen)
509e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public long age24;  // timestamp of the strongest 2.4GHz BSSID (last time it was seen)
510e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public String BSSID24;
511e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle        public String BSSID5;
51272e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public int score; // Debug only, indicate last score used for autojoin/cell-handover
51372e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public int currentNetworkBoost; // Debug only, indicate boost applied to RSSI if current
51472e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public int bandPreferenceBoost; // Debug only, indicate boost applied to RSSI if current
51572e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public int lastChoiceBoost; // Debug only, indicate last choice applied to this configuration
51672e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle        public String lastChoiceConfig; // Debug only, indicate last choice applied to this configuration
5175fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
5185fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public Visibility() {
5197c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi5 = INVALID_RSSI;
5207c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi24 = INVALID_RSSI;
5217c3606c103e95d3991267cca2592402a68779cafvandwalle        }
5225fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
5235fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public Visibility(Visibility source) {
5247c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi5 = source.rssi5;
5257c3606c103e95d3991267cca2592402a68779cafvandwalle            rssi24 = source.rssi24;
5267c3606c103e95d3991267cca2592402a68779cafvandwalle            age24 = source.age24;
5277c3606c103e95d3991267cca2592402a68779cafvandwalle            age5 = source.age5;
5287c3606c103e95d3991267cca2592402a68779cafvandwalle            num24 = source.num24;
5297c3606c103e95d3991267cca2592402a68779cafvandwalle            num5 = source.num5;
530e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle            BSSID5 = source.BSSID5;
531e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle            BSSID24 = source.BSSID24;
5327c3606c103e95d3991267cca2592402a68779cafvandwalle        }
5335fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
5345fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        @Override
5355fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        public String toString() {
5365fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            StringBuilder sbuf = new StringBuilder();
5375fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            sbuf.append("[");
5385fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            if (rssi24 > INVALID_RSSI) {
5395fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(rssi24));
5405fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(",");
5415fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(num24));
542e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                if (BSSID24 != null) sbuf.append(",").append(BSSID24);
5435fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            }
54472e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle            sbuf.append("; ");
5455fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            if (rssi5 > INVALID_RSSI) {
5465fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(rssi5));
5475fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(",");
5485fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle                sbuf.append(Integer.toString(num5));
549e26bc8fda7b2d9dad3882ec3fb22739b80d5390fvandwalle                if (BSSID5 != null) sbuf.append(",").append(BSSID5);
5505fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            }
55172e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle            if (score != 0) {
55272e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                sbuf.append("; ").append(score);
55372e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                sbuf.append(", ").append(currentNetworkBoost);
55472e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                sbuf.append(", ").append(bandPreferenceBoost);
55572e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                if (lastChoiceConfig != null) {
55672e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                    sbuf.append(", ").append(lastChoiceBoost);
55772e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                    sbuf.append(", ").append(lastChoiceConfig);
55872e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle                }
55972e1d3f53826c2f19727e30e4b576a0e2d0e3728vandwalle            }
5605fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            sbuf.append("]");
5615fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            return sbuf.toString();
5625fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        }
5637c3606c103e95d3991267cca2592402a68779cafvandwalle    }
5647c3606c103e95d3991267cca2592402a68779cafvandwalle
5657c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
5667c3606c103e95d3991267cca2592402a68779cafvandwalle     * Cache the visibility status of this configuration.
5677c3606c103e95d3991267cca2592402a68779cafvandwalle     * Visibility can change at any time depending on scan results availability.
5687c3606c103e95d3991267cca2592402a68779cafvandwalle     * Owner of the WifiConfiguration is responsible to set this field based on
5697c3606c103e95d3991267cca2592402a68779cafvandwalle     * recent scan results.
5707c3606c103e95d3991267cca2592402a68779cafvandwalle     ***/
5717c3606c103e95d3991267cca2592402a68779cafvandwalle    public Visibility visibility;
5727c3606c103e95d3991267cca2592402a68779cafvandwalle
5737c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
5747c3606c103e95d3991267cca2592402a68779cafvandwalle     * calculate and set Visibility for that configuration.
5757c3606c103e95d3991267cca2592402a68779cafvandwalle     *
5767c3606c103e95d3991267cca2592402a68779cafvandwalle     * age in milliseconds: we will consider only ScanResults that are more recent,
5777c3606c103e95d3991267cca2592402a68779cafvandwalle     * i.e. younger.
5787c3606c103e95d3991267cca2592402a68779cafvandwalle     ***/
5796f6c781cca66cabc1f06be368a6dfedceb88ed0eVinit Deshpande    public void setVisibility(Visibility status) {
5807c3606c103e95d3991267cca2592402a68779cafvandwalle        visibility = status;
5817c3606c103e95d3991267cca2592402a68779cafvandwalle    }
5827c3606c103e95d3991267cca2592402a68779cafvandwalle
5833e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    // States for the userApproved field
5843e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
5853e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
5863e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * User hasn't specified if connection is okay
5873e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
5883e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static final int USER_UNSPECIFIED = 0;
5893e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
5903e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
5913e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * User has approved this for connection
5923e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
5933e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static final int USER_APPROVED = 1;
5943e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
5953e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
5963e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * User has banned this from connection
5973e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
5983e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static final int USER_BANNED = 2;
5993e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /**
6003e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * @hide
6013e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     * Waiting for user input
6023e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber     */
6033e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static final int USER_PENDING = 3;
6043e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
6057c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
6067c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
607ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * Number of reports indicating no Internet Access
608ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     */
609ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    public int numNoInternetAccessReports;
610ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle
611ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    /**
612ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * @hide
613ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     * For debug: date at which the config was last updated
614ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     */
615ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle    public String updateTime;
616ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle
617ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle    /**
618ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     * @hide
619ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     * For debug: date at which the config was last updated
620ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     */
621ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle    public String creationTime;
622ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle
623ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle    /**
624ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle     * @hide
625ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * The WiFi configuration is considered to have no internet access for purpose of autojoining
626ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * if there has been a report of it having no internet access, and, it never have had
627ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * internet access in the past.
628ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     */
6295ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh    @SystemApi
630ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    public boolean hasNoInternetAccess() {
631ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        return numNoInternetAccessReports > 0 && !validatedInternetAccess;
632ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    }
633ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle
634ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle    /**
6351248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     * The WiFi configuration is expected not to have Internet access (e.g., a wireless printer, a
6361248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     * Chromecast hotspot, etc.). This will be set if the user explicitly confirms a connection to
6371248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     * this configuration and selects "don't ask again".
6381248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     * @hide
6391248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti     */
6401248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti    public boolean noInternetAccessExpected;
6411248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti
6421248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti    /**
6435ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh     * The WiFi configuration is expected not to have Internet access (e.g., a wireless printer, a
6445ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh     * Chromecast hotspot, etc.). This will be set if the user explicitly confirms a connection to
6455ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh     * this configuration and selects "don't ask again".
6465ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh     * @hide
6475ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh     */
6485ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh    @SystemApi
6495ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh    public boolean isNoInternetAccessExpected() {
6505ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh        return noInternetAccessExpected;
6515ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh    }
6525ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh
6535ac6650d4aa8dd6fa16a568bd86b0e38aca32161Amin Shaikh    /**
654ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle     * @hide
655154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system was connected to this configuration.
656111fa0274d1d6620f9634783585387f3b773949evandwalle     */
657111fa0274d1d6620f9634783585387f3b773949evandwalle    public long lastConnected;
658111fa0274d1d6620f9634783585387f3b773949evandwalle
659111fa0274d1d6620f9634783585387f3b773949evandwalle    /**
660111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
661154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system tried to connect and failed.
662154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
663154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public long lastConnectionFailure;
664154b2cf6bbb99ee258b289846183172139a87dbavandwalle
665154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
666154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
6678650c035609507340e3a66459cea16ef08cd03a6vandwalle     * Last time the system tried to roam and failed because of authentication failure or DHCP
6688650c035609507340e3a66459cea16ef08cd03a6vandwalle     * RENEW failure.
6698650c035609507340e3a66459cea16ef08cd03a6vandwalle     */
6708650c035609507340e3a66459cea16ef08cd03a6vandwalle    public long lastRoamingFailure;
6718650c035609507340e3a66459cea16ef08cd03a6vandwalle
6728650c035609507340e3a66459cea16ef08cd03a6vandwalle    /** @hide */
6738650c035609507340e3a66459cea16ef08cd03a6vandwalle    public static int ROAMING_FAILURE_IP_CONFIG = 1;
6748650c035609507340e3a66459cea16ef08cd03a6vandwalle    /** @hide */
6758650c035609507340e3a66459cea16ef08cd03a6vandwalle    public static int ROAMING_FAILURE_AUTH_FAILURE = 2;
6768650c035609507340e3a66459cea16ef08cd03a6vandwalle
6778650c035609507340e3a66459cea16ef08cd03a6vandwalle    /**
6788650c035609507340e3a66459cea16ef08cd03a6vandwalle     * @hide
6798650c035609507340e3a66459cea16ef08cd03a6vandwalle     * Initial amount of time this Wifi configuration gets blacklisted for network switching
6808650c035609507340e3a66459cea16ef08cd03a6vandwalle     * because of roaming failure
6818650c035609507340e3a66459cea16ef08cd03a6vandwalle     */
6828650c035609507340e3a66459cea16ef08cd03a6vandwalle    public long roamingFailureBlackListTimeMilli = 1000;
6838650c035609507340e3a66459cea16ef08cd03a6vandwalle
6848650c035609507340e3a66459cea16ef08cd03a6vandwalle    /**
6858650c035609507340e3a66459cea16ef08cd03a6vandwalle     * @hide
6868650c035609507340e3a66459cea16ef08cd03a6vandwalle     * Last roaming failure reason code
6878650c035609507340e3a66459cea16ef08cd03a6vandwalle     */
6888650c035609507340e3a66459cea16ef08cd03a6vandwalle    public int lastRoamingFailureReason;
6898650c035609507340e3a66459cea16ef08cd03a6vandwalle
6908650c035609507340e3a66459cea16ef08cd03a6vandwalle    /**
6918650c035609507340e3a66459cea16ef08cd03a6vandwalle     * @hide
692154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Last time the system was disconnected to this configuration.
693111fa0274d1d6620f9634783585387f3b773949evandwalle     */
694111fa0274d1d6620f9634783585387f3b773949evandwalle    public long lastDisconnected;
6952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
6967c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
697e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     * Set if the configuration was self added by the framework
6988f13548615f647a1208ace5369b504cb41149965vandwalle     * This boolean is cleared if we get a connect/save/ update or
6998f13548615f647a1208ace5369b504cb41149965vandwalle     * any wifiManager command that indicate the user interacted with the configuration
7008f13548615f647a1208ace5369b504cb41149965vandwalle     * since we will now consider that the configuration belong to him.
701e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     * @hide
702e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle     */
703e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle    public boolean selfAdded;
704e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle
705e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle    /**
7068f13548615f647a1208ace5369b504cb41149965vandwalle     * Set if the configuration was self added by the framework
7078f13548615f647a1208ace5369b504cb41149965vandwalle     * This boolean is set once and never cleared. It is used
7088f13548615f647a1208ace5369b504cb41149965vandwalle     * so as we never loose track of who created the
7098f13548615f647a1208ace5369b504cb41149965vandwalle     * configuration in the first place.
7108f13548615f647a1208ace5369b504cb41149965vandwalle     * @hide
7118f13548615f647a1208ace5369b504cb41149965vandwalle     */
7128f13548615f647a1208ace5369b504cb41149965vandwalle    public boolean didSelfAdd;
7138f13548615f647a1208ace5369b504cb41149965vandwalle
7148f13548615f647a1208ace5369b504cb41149965vandwalle    /**
715154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Peer WifiConfiguration this WifiConfiguration was added for
7162d0f71eea20470985abde98d759910a1ac40b257vandwalle     * @hide
7172d0f71eea20470985abde98d759910a1ac40b257vandwalle     */
7182d0f71eea20470985abde98d759910a1ac40b257vandwalle    public String peerWifiConfiguration;
7192d0f71eea20470985abde98d759910a1ac40b257vandwalle
7202d0f71eea20470985abde98d759910a1ac40b257vandwalle    /**
7217c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
7227c3606c103e95d3991267cca2592402a68779cafvandwalle     * Indicate that a WifiConfiguration is temporary and should not be saved
7237c3606c103e95d3991267cca2592402a68779cafvandwalle     * nor considered by AutoJoin.
7247c3606c103e95d3991267cca2592402a68779cafvandwalle     */
7257c3606c103e95d3991267cca2592402a68779cafvandwalle    public boolean ephemeral;
7267c3606c103e95d3991267cca2592402a68779cafvandwalle
7277c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
7287c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
7299f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh     * Indicate that a WifiConfiguration is temporary and should not be saved
7309f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh     * nor considered by AutoJoin.
7319f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh     */
7329f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh    @SystemApi
7339f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh    public boolean isEphemeral() {
7349f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh      return ephemeral;
7359f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh    }
7369f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh
7379f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh    /**
73843d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * Indicates if the creator of this configuration has expressed that it
73943d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * should be considered metered.
74043d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     *
74143d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * @see #isMetered(WifiConfiguration, WifiInfo)
7429f65210780d89a39245c01a2c52447512fbdd950Amin Shaikh     * @hide
743f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin     */
74414965357b7e5b1c6ac8334dc83a06e603c0e2740Amin Shaikh    @SystemApi
745f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin    public boolean meteredHint;
746f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin
74743d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    /** {@hide} */
74843d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    public static final int METERED_OVERRIDE_NONE = 0;
74943d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    /** {@hide} */
75043d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    public static final int METERED_OVERRIDE_METERED = 1;
75143d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    /** {@hide} */
75243d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    public static final int METERED_OVERRIDE_NOT_METERED = 2;
75343d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey
75443d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    /**
75543d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * Indicates if the end user has expressed an explicit opinion about the
75643d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * meteredness of this network, such as through the Settings app.
75743d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * <p>
75843d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * This should always override any values from {@link #meteredHint} or
75943d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * {@link WifiInfo#getMeteredHint()}.
76043d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     *
76143d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * @see #isMetered(WifiConfiguration, WifiInfo)
76243d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * @hide
76343d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     */
76443d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    public int meteredOverride = METERED_OVERRIDE_NONE;
76543d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey
766f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin    /**
76743d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * Blend together all the various opinions to decide if the given network
76843d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     * should be considered metered or not.
76943d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey     *
770f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin     * @hide
771c76fda726973693c6168ada797943070eac2f04bStephen Chen     */
77243d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    public static boolean isMetered(WifiConfiguration config, WifiInfo info) {
77343d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        boolean metered = false;
77443d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        if (info != null && info.getMeteredHint()) {
77543d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey            metered = true;
77643d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        }
77743d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        if (config != null && config.meteredHint) {
77843d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey            metered = true;
77943d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        }
78043d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        if (config != null
78143d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey                && config.meteredOverride == WifiConfiguration.METERED_OVERRIDE_METERED) {
78243d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey            metered = true;
78343d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        }
78443d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        if (config != null
78543d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey                && config.meteredOverride == WifiConfiguration.METERED_OVERRIDE_NOT_METERED) {
78643d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey            metered = false;
78743d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        }
78843d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        return metered;
78943d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey    }
790c76fda726973693c6168ada797943070eac2f04bStephen Chen
791c76fda726973693c6168ada797943070eac2f04bStephen Chen    /**
792c76fda726973693c6168ada797943070eac2f04bStephen Chen     * @hide
7931f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin     * Returns true if this WiFi config is for an open network.
7941f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin     */
7951f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin    public boolean isOpenNetwork() {
7961f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin        final int cardinality = allowedKeyManagement.cardinality();
7971f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin        final boolean hasNoKeyMgmt = cardinality == 0
7981f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin                || (cardinality == 1 && allowedKeyManagement.get(KeyMgmt.NONE));
7991f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin
8001f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin        boolean hasNoWepKeys = true;
8011f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin        if (wepKeys != null) {
8021f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin            for (int i = 0; i < wepKeys.length; i++) {
8031f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin                if (wepKeys[i] != null) {
8041f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin                    hasNoWepKeys = false;
8051f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin                    break;
8061f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin                }
8071f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin            }
8081f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin        }
8091f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin
8101f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin        return hasNoKeyMgmt && hasNoWepKeys;
8111f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin    }
8121f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin
8131f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin    /**
8141f6029bd6f45e98d8ba6b761ad5e08e3044f0fb5Jeremy Joslin     * @hide
815fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * Setting this value will force scan results associated with this configuration to
816fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * be included in the bucket of networks that are externally scored.
817fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * If not set, associated scan results will be treated as legacy saved networks and
818fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * will take precedence over networks in the scored category.
819fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     */
820fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin    @SystemApi
821fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin    public boolean useExternalScores;
822fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin
823fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin    /**
824fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin     * @hide
825154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Number of time the scorer overrode a the priority based choice, when comparing two
826154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * WifiConfigurations, note that since comparing WifiConfiguration happens very often
827154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * potentially at every scan, this number might become very large, even on an idle
828154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * system.
829154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
830154b2cf6bbb99ee258b289846183172139a87dbavandwalle    @SystemApi
831154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public int numScorerOverride;
832154b2cf6bbb99ee258b289846183172139a87dbavandwalle
833154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
834154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
835154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * Number of time the scorer overrode a the priority based choice, and the comparison
836154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * triggered a network switch
837154b2cf6bbb99ee258b289846183172139a87dbavandwalle     */
838154b2cf6bbb99ee258b289846183172139a87dbavandwalle    @SystemApi
839154b2cf6bbb99ee258b289846183172139a87dbavandwalle    public int numScorerOverrideAndSwitchedNetwork;
840154b2cf6bbb99ee258b289846183172139a87dbavandwalle
841154b2cf6bbb99ee258b289846183172139a87dbavandwalle    /**
842154b2cf6bbb99ee258b289846183172139a87dbavandwalle     * @hide
8434eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     * Number of time we associated to this configuration.
8444eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle     */
8454eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    @SystemApi
8464eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public int numAssociation;
8474eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
8488d106780b6a638552749e54e169fc72537d4bcccxinhe    /** @hide
8498d106780b6a638552749e54e169fc72537d4bcccxinhe     * Boost given to RSSI on a home network for the purpose of calculating the score
8508d106780b6a638552749e54e169fc72537d4bcccxinhe     * This adds stickiness to home networks, as defined by:
8518d106780b6a638552749e54e169fc72537d4bcccxinhe     * - less than 4 known BSSIDs
8528d106780b6a638552749e54e169fc72537d4bcccxinhe     * - PSK only
8538d106780b6a638552749e54e169fc72537d4bcccxinhe     * - TODO: add a test to verify that all BSSIDs are behind same gateway
8548d106780b6a638552749e54e169fc72537d4bcccxinhe     ***/
8558d106780b6a638552749e54e169fc72537d4bcccxinhe    public static final int HOME_NETWORK_RSSI_BOOST = 5;
8568d106780b6a638552749e54e169fc72537d4bcccxinhe
8578d106780b6a638552749e54e169fc72537d4bcccxinhe    /**
8588d106780b6a638552749e54e169fc72537d4bcccxinhe     * @hide
8598d106780b6a638552749e54e169fc72537d4bcccxinhe     * This class is used to contain all the information and API used for quality network selection
8608d106780b6a638552749e54e169fc72537d4bcccxinhe     */
8618d106780b6a638552749e54e169fc72537d4bcccxinhe    public static class NetworkSelectionStatus {
8628d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8638d106780b6a638552749e54e169fc72537d4bcccxinhe         * Quality Network Selection Status enable, temporary disabled, permanently disabled
8648d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8658d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8668d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is allowed to join Quality Network Selection
8678d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8688d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_ENABLED = 0;
8698d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8708d106780b6a638552749e54e169fc72537d4bcccxinhe         * network was temporary disabled. Can be re-enabled after a time period expire
8718d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8728d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_TEMPORARY_DISABLED  = 1;
8738d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8748d106780b6a638552749e54e169fc72537d4bcccxinhe         * network was permanently disabled.
8758d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8768d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_PERMANENTLY_DISABLED  = 2;
8778d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8788d106780b6a638552749e54e169fc72537d4bcccxinhe         * Maximum Network selection status
8798d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8808d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_STATUS_MAX = 3;
8818d106780b6a638552749e54e169fc72537d4bcccxinhe
8828d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8838d106780b6a638552749e54e169fc72537d4bcccxinhe         * Quality network selection status String (for debug purpose). Use Quality network
8848d106780b6a638552749e54e169fc72537d4bcccxinhe         * selection status value as index to extec the corresponding debug string
8858d106780b6a638552749e54e169fc72537d4bcccxinhe         */
88647fb68bd24ada11cb5f3b2f987134fa2ce3ee1dcRoshan Pius        public static final String[] QUALITY_NETWORK_SELECTION_STATUS = {
88790a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_ENABLED",
88890a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_TEMPORARY_DISABLED",
8898d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_PERMANENTLY_DISABLED"};
8908d106780b6a638552749e54e169fc72537d4bcccxinhe
8918d106780b6a638552749e54e169fc72537d4bcccxinhe        //Quality Network disabled reasons
8928d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
8938d106780b6a638552749e54e169fc72537d4bcccxinhe         * Default value. Means not disabled
8948d106780b6a638552749e54e169fc72537d4bcccxinhe         */
8958d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int NETWORK_SELECTION_ENABLE = 0;
8968d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
897f4315fed7e2f6e3bb1a55000dc58106fa647d82dRandy Pan         * The starting index for network selection disabled reasons
898f4315fed7e2f6e3bb1a55000dc58106fa647d82dRandy Pan         */
899f4315fed7e2f6e3bb1a55000dc58106fa647d82dRandy Pan        public static final int NETWORK_SELECTION_DISABLED_STARTING_INDEX = 1;
900f4315fed7e2f6e3bb1a55000dc58106fa647d82dRandy Pan        /**
90122de5aaca9b3d976d3f3cdf8b0a02f3b3ccb6d99Randy Pan         * @deprecated it is not used any more.
9028d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because higher layer (>2) network is bad
9038d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9048d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_BAD_LINK = 1;
9058d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9068d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because multiple association rejects
9078d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9088d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_ASSOCIATION_REJECTION = 2;
9098d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9108d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because multiple authentication failure
9118d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9128d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_AUTHENTICATION_FAILURE = 3;
9138d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9148d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because multiple DHCP failure
9158d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9168d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_DHCP_FAILURE = 4;
9178d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9188d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because of security network but no credentials
9198d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9208d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final int DISABLED_DNS_FAILURE = 5;
9218d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
92272baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius         * This network is disabled because we started WPS
92372baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius         */
92472baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        public static final int DISABLED_WPS_START = 6;
92572baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        /**
9268d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because EAP-TLS failure
9278d106780b6a638552749e54e169fc72537d4bcccxinhe         */
92872baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        public static final int DISABLED_TLS_VERSION_MISMATCH = 7;
92998773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        // Values above are for temporary disablement; values below are for permanent disablement.
9308d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
93172baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius         * This network is disabled due to absence of user credentials
9328d106780b6a638552749e54e169fc72537d4bcccxinhe         */
93372baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        public static final int DISABLED_AUTHENTICATION_NO_CREDENTIALS = 8;
9348d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9358d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled because no Internet connected and user do not want
9368d106780b6a638552749e54e169fc72537d4bcccxinhe         */
93772baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        public static final int DISABLED_NO_INTERNET = 9;
9388d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9398d106780b6a638552749e54e169fc72537d4bcccxinhe         * This network is disabled due to WifiManager disable it explicitly
9408d106780b6a638552749e54e169fc72537d4bcccxinhe         */
94172baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        public static final int DISABLED_BY_WIFI_MANAGER = 10;
94272baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        /**
94372baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius         * This network is disabled due to user switching
94472baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius         */
94572baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        public static final int DISABLED_DUE_TO_USER_SWITCH = 11;
9468d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
947873edc6e768492d715f3658e9a93491e3732391dPeter Qiu         * This network is disabled due to wrong password
948873edc6e768492d715f3658e9a93491e3732391dPeter Qiu         */
949873edc6e768492d715f3658e9a93491e3732391dPeter Qiu        public static final int DISABLED_BY_WRONG_PASSWORD = 12;
950873edc6e768492d715f3658e9a93491e3732391dPeter Qiu        /**
9518d106780b6a638552749e54e169fc72537d4bcccxinhe         * This Maximum disable reason value
9528d106780b6a638552749e54e169fc72537d4bcccxinhe         */
953873edc6e768492d715f3658e9a93491e3732391dPeter Qiu        public static final int NETWORK_SELECTION_DISABLED_MAX = 13;
9548d106780b6a638552749e54e169fc72537d4bcccxinhe
9558d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9568d106780b6a638552749e54e169fc72537d4bcccxinhe         * Quality network selection disable reason String (for debug purpose)
9578d106780b6a638552749e54e169fc72537d4bcccxinhe         */
95847fb68bd24ada11cb5f3b2f987134fa2ce3ee1dcRoshan Pius        public static final String[] QUALITY_NETWORK_SELECTION_DISABLE_REASON = {
95990a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_ENABLE",
96022de5aaca9b3d976d3f3cdf8b0a02f3b3ccb6d99Randy Pan                "NETWORK_SELECTION_DISABLED_BAD_LINK", // deprecated
9618d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_ASSOCIATION_REJECTION ",
9628d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_AUTHENTICATION_FAILURE",
9638d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_DHCP_FAILURE",
96490a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_DISABLED_DNS_FAILURE",
96572baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius                "NETWORK_SELECTION_DISABLED_WPS_START",
96690a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_DISABLED_TLS_VERSION",
9678d106780b6a638552749e54e169fc72537d4bcccxinhe                "NETWORK_SELECTION_DISABLED_AUTHENTICATION_NO_CREDENTIALS",
96890a3841994b40aeb1c3a7a6b78dd804e49eb5e13xinhe                "NETWORK_SELECTION_DISABLED_NO_INTERNET",
96972baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius                "NETWORK_SELECTION_DISABLED_BY_WIFI_MANAGER",
970873edc6e768492d715f3658e9a93491e3732391dPeter Qiu                "NETWORK_SELECTION_DISABLED_BY_USER_SWITCH",
971873edc6e768492d715f3658e9a93491e3732391dPeter Qiu                "NETWORK_SELECTION_DISABLED_BY_WRONG_PASSWORD"
97272baa1de4dadecf9ff309dc5e58c59b5bed654e0Roshan Pius        };
9738d106780b6a638552749e54e169fc72537d4bcccxinhe
9748d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9758d106780b6a638552749e54e169fc72537d4bcccxinhe         * Invalid time stamp for network selection disable
9768d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9778d106780b6a638552749e54e169fc72537d4bcccxinhe        public static final long INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP = -1L;
9788d106780b6a638552749e54e169fc72537d4bcccxinhe
979584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
980584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *  This constant indicates the current configuration has connect choice set
981584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
982584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private static final int CONNECT_CHOICE_EXISTS = 1;
983584dc6b8b9628d930de4ea3ad94894886294b855xinhe
984584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
985584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *  This constant indicates the current configuration does not have connect choice set
986584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
987584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private static final int CONNECT_CHOICE_NOT_EXISTS = -1;
988584dc6b8b9628d930de4ea3ad94894886294b855xinhe
9898d106780b6a638552749e54e169fc72537d4bcccxinhe        // fields for QualityNetwork Selection
9908d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9918d106780b6a638552749e54e169fc72537d4bcccxinhe         * Network selection status, should be in one of three status: enable, temporaily disabled
9928d106780b6a638552749e54e169fc72537d4bcccxinhe         * or permanently disabled
9938d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9948d106780b6a638552749e54e169fc72537d4bcccxinhe        private int mStatus;
9958d106780b6a638552749e54e169fc72537d4bcccxinhe
9968d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
9978d106780b6a638552749e54e169fc72537d4bcccxinhe         * Reason for disable this network
9988d106780b6a638552749e54e169fc72537d4bcccxinhe         */
9998d106780b6a638552749e54e169fc72537d4bcccxinhe        private int mNetworkSelectionDisableReason;
10008d106780b6a638552749e54e169fc72537d4bcccxinhe
10018d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
10028d106780b6a638552749e54e169fc72537d4bcccxinhe         * Last time we temporarily disabled the configuration
10038d106780b6a638552749e54e169fc72537d4bcccxinhe         */
10048d106780b6a638552749e54e169fc72537d4bcccxinhe        private long mTemporarilyDisabledTimestamp = INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP;
10058d106780b6a638552749e54e169fc72537d4bcccxinhe
10068d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
10078d106780b6a638552749e54e169fc72537d4bcccxinhe         * counter for each Network selection disable reason
10088d106780b6a638552749e54e169fc72537d4bcccxinhe         */
10098d106780b6a638552749e54e169fc72537d4bcccxinhe        private int[] mNetworkSeclectionDisableCounter = new int[NETWORK_SELECTION_DISABLED_MAX];
10108d106780b6a638552749e54e169fc72537d4bcccxinhe
10118d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1012584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Connect Choice over this configuration
1013584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *
1014584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * When current wifi configuration is visible to the user but user explicitly choose to
1015584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * connect to another network X, the another networks X's configure key will be stored here.
1016584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * We will consider user has a preference of X over this network. And in the future,
1017584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * network selection will always give X a higher preference over this configuration.
1018584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * configKey is : "SSID"-WEP-WPA_PSK-WPA_EAP
1019584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1020584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private String mConnectChoice;
1021584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1022584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1023584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * The system timestamp when we records the connectChoice. This value is obtained from
1024584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * System.currentTimeMillis
1025584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1026584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private long mConnectChoiceTimestamp = INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP;
1027584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1028584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1029584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Used to cache the temporary candidate during the network selection procedure. It will be
1030584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * kept updating once a new scan result has a higher score than current one
1031584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1032584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private ScanResult mCandidate;
1033584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1034584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1035584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Used to cache the score of the current temporary candidate during the network
1036584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * selection procedure.
1037584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1038584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private int mCandidateScore;
1039584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1040584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1041584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Indicate whether this network is visible in latest Qualified Network Selection. This
1042584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * means there is scan result found related to this Configuration and meet the minimum
1043584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * requirement. The saved network need not join latest Qualified Network Selection. For
1044584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * example, it is disabled. True means network is visible in latest Qualified Network
1045584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * Selection and false means network is invisible
1046584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1047584dc6b8b9628d930de4ea3ad94894886294b855xinhe        private boolean mSeenInLastQualifiedNetworkSelection;
1048584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1049584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1050cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         * Boolean indicating if we have ever successfully connected to this network.
1051cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         *
1052cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         * This value will be set to true upon a successful connection.
1053cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         * This value will be set to false if a previous value was not stored in the config or if
1054cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         * the credentials are updated (ex. a password change).
1055cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein         */
1056cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        private boolean mHasEverConnected;
1057cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein
1058cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        /**
105998773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         * Boolean indicating whether {@link com.android.server.wifi.RecommendedNetworkEvaluator}
106098773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         * chose not to connect to this network in the last qualified network selection process.
106198773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         */
106298773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        private boolean mNotRecommended;
106398773d4837922715c740d06bfd02666dceaf350bAmin Shaikh
106498773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        /**
106598773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         * Set whether {@link com.android.server.wifi.RecommendedNetworkEvaluator} does not
106698773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         * recommend connecting to this network.
106798773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         */
106898773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        public void setNotRecommended(boolean notRecommended) {
106998773d4837922715c740d06bfd02666dceaf350bAmin Shaikh            mNotRecommended = notRecommended;
107098773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        }
107198773d4837922715c740d06bfd02666dceaf350bAmin Shaikh
107298773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        /**
107398773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         * Returns whether {@link com.android.server.wifi.RecommendedNetworkEvaluator} does not
107498773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         * recommend connecting to this network.
107598773d4837922715c740d06bfd02666dceaf350bAmin Shaikh         */
107698773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        public boolean isNotRecommended() {
107798773d4837922715c740d06bfd02666dceaf350bAmin Shaikh            return mNotRecommended;
107898773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        }
107998773d4837922715c740d06bfd02666dceaf350bAmin Shaikh
108098773d4837922715c740d06bfd02666dceaf350bAmin Shaikh        /**
1081584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set whether this network is visible in latest Qualified Network Selection
1082584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param seen value set to candidate
1083584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1084584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setSeenInLastQualifiedNetworkSelection(boolean seen) {
1085584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mSeenInLastQualifiedNetworkSelection =  seen;
1086584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1087584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1088584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1089584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get whether this network is visible in latest Qualified Network Selection
1090584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns true -- network is visible in latest Qualified Network Selection
1091584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *         false -- network is invisible in latest Qualified Network Selection
1092584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1093584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public boolean getSeenInLastQualifiedNetworkSelection() {
1094584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mSeenInLastQualifiedNetworkSelection;
1095584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1096584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1097584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set the temporary candidate of current network selection procedure
1098584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param scanCandidate {@link ScanResult} the candidate set to mCandidate
1099584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1100584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setCandidate(ScanResult scanCandidate) {
1101584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mCandidate = scanCandidate;
1102584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1103584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1104584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1105584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get the temporary candidate of current network selection procedure
1106584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return  returns {@link ScanResult} temporary candidate of current network selection
1107584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * procedure
1108584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1109584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public ScanResult getCandidate() {
1110584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mCandidate;
1111584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1112584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1113584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1114584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set the score of the temporary candidate of current network selection procedure
1115584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param score value set to mCandidateScore
1116584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1117584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setCandidateScore(int score) {
1118584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mCandidateScore = score;
1119584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1120584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1121584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1122584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get the score of the temporary candidate of current network selection procedure
1123584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns score of the temporary candidate of current network selection procedure
1124584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1125584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public int getCandidateScore() {
1126584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mCandidateScore;
1127584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1128584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1129584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1130584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get user preferred choice over this configuration
1131584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *@return returns configKey of user preferred choice over this configuration
1132584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1133584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public String getConnectChoice() {
1134584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mConnectChoice;
1135584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1136584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1137584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1138584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set user preferred choice over this configuration
1139584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param newConnectChoice, the configKey of user preferred choice over this configuration
1140584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1141584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setConnectChoice(String newConnectChoice) {
1142584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mConnectChoice = newConnectChoice;
1143584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1144584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1145584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1146584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get the timeStamp when user select a choice over this configuration
1147584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns when current connectChoice is set (time from System.currentTimeMillis)
1148584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1149584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public long getConnectChoiceTimestamp() {
1150584dc6b8b9628d930de4ea3ad94894886294b855xinhe            return mConnectChoiceTimestamp;
1151584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1152584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1153584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1154584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set the timeStamp when user select a choice over this configuration
1155584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param timeStamp, the timestamp set to connectChoiceTimestamp, expected timestamp should
1156584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *        be obtained from System.currentTimeMillis
1157584dc6b8b9628d930de4ea3ad94894886294b855xinhe         */
1158584dc6b8b9628d930de4ea3ad94894886294b855xinhe        public void setConnectChoiceTimestamp(long timeStamp) {
1159584dc6b8b9628d930de4ea3ad94894886294b855xinhe            mConnectChoiceTimestamp = timeStamp;
1160584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1161584dc6b8b9628d930de4ea3ad94894886294b855xinhe
1162584dc6b8b9628d930de4ea3ad94894886294b855xinhe        /**
1163584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get current Quality network selection status
1164584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns current Quality network selection status in String (for debug purpose)
11658d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11668d106780b6a638552749e54e169fc72537d4bcccxinhe        public String getNetworkStatusString() {
11678d106780b6a638552749e54e169fc72537d4bcccxinhe            return QUALITY_NETWORK_SELECTION_STATUS[mStatus];
11688d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11698d106780b6a638552749e54e169fc72537d4bcccxinhe
1170cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        public void setHasEverConnected(boolean value) {
1171cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            mHasEverConnected = value;
1172cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        }
1173cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein
1174cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        public boolean getHasEverConnected() {
1175cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            return mHasEverConnected;
1176cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        }
1177cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein
1178311a72164b1060445b4067090c0bfd6615747093Roshan Pius        public NetworkSelectionStatus() {
1179cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            // previously stored configs will not have this parameter, so we default to false.
1180cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            mHasEverConnected = false;
1181cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        };
11828d106780b6a638552749e54e169fc72537d4bcccxinhe
11838d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
11848d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param reason specific error reason
11858d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return  corresponding network disable reason String (for debug purpose)
11868d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11878d106780b6a638552749e54e169fc72537d4bcccxinhe        public static String getNetworkDisableReasonString(int reason) {
11888d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE && reason < NETWORK_SELECTION_DISABLED_MAX) {
11898d106780b6a638552749e54e169fc72537d4bcccxinhe                return QUALITY_NETWORK_SELECTION_DISABLE_REASON[reason];
11908d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
11918d106780b6a638552749e54e169fc72537d4bcccxinhe                return null;
11928d106780b6a638552749e54e169fc72537d4bcccxinhe            }
11938d106780b6a638552749e54e169fc72537d4bcccxinhe        }
11948d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1195584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get current network disable reason
11968d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return current network disable reason in String (for debug purpose)
11978d106780b6a638552749e54e169fc72537d4bcccxinhe         */
11988d106780b6a638552749e54e169fc72537d4bcccxinhe        public String getNetworkDisableReasonString() {
11998d106780b6a638552749e54e169fc72537d4bcccxinhe            return QUALITY_NETWORK_SELECTION_DISABLE_REASON[mNetworkSelectionDisableReason];
12008d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12018d106780b6a638552749e54e169fc72537d4bcccxinhe
12028d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12038d106780b6a638552749e54e169fc72537d4bcccxinhe         * get current network network selection status
1204584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return return current network network selection status
12058d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12068d106780b6a638552749e54e169fc72537d4bcccxinhe        public int getNetworkSelectionStatus() {
12078d106780b6a638552749e54e169fc72537d4bcccxinhe            return mStatus;
12088d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12098d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12108d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return whether current network is enabled to join network selection
12118d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12128d106780b6a638552749e54e169fc72537d4bcccxinhe        public boolean isNetworkEnabled() {
12138d106780b6a638552749e54e169fc72537d4bcccxinhe            return mStatus == NETWORK_SELECTION_ENABLED;
12148d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12158d106780b6a638552749e54e169fc72537d4bcccxinhe
12168d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12178d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return whether current network is temporary disabled
12188d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12198d106780b6a638552749e54e169fc72537d4bcccxinhe        public boolean isNetworkTemporaryDisabled() {
12208d106780b6a638552749e54e169fc72537d4bcccxinhe            return mStatus == NETWORK_SELECTION_TEMPORARY_DISABLED;
12218d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12228d106780b6a638552749e54e169fc72537d4bcccxinhe
12238d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1224584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns whether current network is permanently disabled
12258d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12268d106780b6a638552749e54e169fc72537d4bcccxinhe        public boolean isNetworkPermanentlyDisabled() {
12278d106780b6a638552749e54e169fc72537d4bcccxinhe            return mStatus == NETWORK_SELECTION_PERMANENTLY_DISABLED;
12288d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1229584dc6b8b9628d930de4ea3ad94894886294b855xinhe
12308d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1231584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set current networ work selection status
12328d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param status network selection status to set
12338d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12348d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setNetworkSelectionStatus(int status) {
12358d106780b6a638552749e54e169fc72537d4bcccxinhe            if (status >= 0 && status < NETWORK_SELECTION_STATUS_MAX) {
12368d106780b6a638552749e54e169fc72537d4bcccxinhe                mStatus = status;
12378d106780b6a638552749e54e169fc72537d4bcccxinhe            }
12388d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1239584dc6b8b9628d930de4ea3ad94894886294b855xinhe
12408d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1241584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns current network's disable reason
12428d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12438d106780b6a638552749e54e169fc72537d4bcccxinhe        public int getNetworkSelectionDisableReason() {
12448d106780b6a638552749e54e169fc72537d4bcccxinhe            return mNetworkSelectionDisableReason;
12458d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12468d106780b6a638552749e54e169fc72537d4bcccxinhe
12478d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1248584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * set Network disable reason
12498d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param  reason Network disable reason
12508d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12518d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setNetworkSelectionDisableReason(int reason) {
12528d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= 0 && reason < NETWORK_SELECTION_DISABLED_MAX) {
12538d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSelectionDisableReason = reason;
12548d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
12558d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
12568d106780b6a638552749e54e169fc72537d4bcccxinhe            }
12578d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1258584dc6b8b9628d930de4ea3ad94894886294b855xinhe
12598d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1260584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * check whether network is disabled by this reason
1261584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @param reason a specific disable reason
1262584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return true -- network is disabled for this reason
1263584dc6b8b9628d930de4ea3ad94894886294b855xinhe         *         false -- network is not disabled for this reason
12648d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12658d106780b6a638552749e54e169fc72537d4bcccxinhe        public boolean isDisabledByReason(int reason) {
12668d106780b6a638552749e54e169fc72537d4bcccxinhe            return mNetworkSelectionDisableReason == reason;
12678d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1268584dc6b8b9628d930de4ea3ad94894886294b855xinhe
12698d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
12708d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param timeStamp Set when current network is disabled in millisecond since January 1,
12718d106780b6a638552749e54e169fc72537d4bcccxinhe         * 1970 00:00:00.0 UTC
12728d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12738d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setDisableTime(long timeStamp) {
12748d106780b6a638552749e54e169fc72537d4bcccxinhe            mTemporarilyDisabledTimestamp = timeStamp;
12758d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12768d106780b6a638552749e54e169fc72537d4bcccxinhe
12778d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1278584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * @return returns when current network is disabled in millisecond since January 1,
12798d106780b6a638552749e54e169fc72537d4bcccxinhe         * 1970 00:00:00.0 UTC
12808d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12818d106780b6a638552749e54e169fc72537d4bcccxinhe        public long getDisableTime() {
12828d106780b6a638552749e54e169fc72537d4bcccxinhe            return mTemporarilyDisabledTimestamp;
12838d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12848d106780b6a638552749e54e169fc72537d4bcccxinhe
12858d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
1286584dc6b8b9628d930de4ea3ad94894886294b855xinhe         * get the disable counter of a specific reason
12878d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param  reason specific failure reason
12888d106780b6a638552749e54e169fc72537d4bcccxinhe         * @exception throw IllegalArgumentException for illegal input
12898d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return counter number for specific error reason.
12908d106780b6a638552749e54e169fc72537d4bcccxinhe         */
12918d106780b6a638552749e54e169fc72537d4bcccxinhe        public int getDisableReasonCounter(int reason) {
12928d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE && reason < NETWORK_SELECTION_DISABLED_MAX) {
12938d106780b6a638552749e54e169fc72537d4bcccxinhe                return mNetworkSeclectionDisableCounter[reason];
12948d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
12958d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
12968d106780b6a638552749e54e169fc72537d4bcccxinhe            }
12978d106780b6a638552749e54e169fc72537d4bcccxinhe        }
12988d106780b6a638552749e54e169fc72537d4bcccxinhe
12998d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
13008d106780b6a638552749e54e169fc72537d4bcccxinhe         * set the counter of a specific failure reason
13018d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param reason reason for disable error
13028d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param value the counter value for this specific reason
13038d106780b6a638552749e54e169fc72537d4bcccxinhe         * @exception throw IllegalArgumentException for illegal input
13048d106780b6a638552749e54e169fc72537d4bcccxinhe         */
13058d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setDisableReasonCounter(int reason, int value) {
13068d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE && reason < NETWORK_SELECTION_DISABLED_MAX) {
13078d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSeclectionDisableCounter[reason] = value;
13088d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
13098d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
13108d106780b6a638552749e54e169fc72537d4bcccxinhe            }
13118d106780b6a638552749e54e169fc72537d4bcccxinhe        }
13128d106780b6a638552749e54e169fc72537d4bcccxinhe
13138d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
13148d106780b6a638552749e54e169fc72537d4bcccxinhe         * increment the counter of a specific failure reason
13158d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param reason a specific failure reason
13168d106780b6a638552749e54e169fc72537d4bcccxinhe         * @exception throw IllegalArgumentException for illegal input
13178d106780b6a638552749e54e169fc72537d4bcccxinhe         */
13188d106780b6a638552749e54e169fc72537d4bcccxinhe        public void incrementDisableReasonCounter(int reason) {
13198d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE  && reason < NETWORK_SELECTION_DISABLED_MAX) {
13208d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSeclectionDisableCounter[reason]++;
13218d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
13228d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
13238d106780b6a638552749e54e169fc72537d4bcccxinhe            }
13248d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1325584dc6b8b9628d930de4ea3ad94894886294b855xinhe
13268d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
13278d106780b6a638552749e54e169fc72537d4bcccxinhe         * clear the counter of a specific failure reason
13288d106780b6a638552749e54e169fc72537d4bcccxinhe         * @hide
13298d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param reason a specific failure reason
13308d106780b6a638552749e54e169fc72537d4bcccxinhe         * @exception throw IllegalArgumentException for illegal input
13318d106780b6a638552749e54e169fc72537d4bcccxinhe         */
13328d106780b6a638552749e54e169fc72537d4bcccxinhe        public void clearDisableReasonCounter(int reason) {
13338d106780b6a638552749e54e169fc72537d4bcccxinhe            if (reason >= NETWORK_SELECTION_ENABLE && reason < NETWORK_SELECTION_DISABLED_MAX) {
13348d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSeclectionDisableCounter[reason] = NETWORK_SELECTION_ENABLE;
13358d106780b6a638552749e54e169fc72537d4bcccxinhe            } else {
13368d106780b6a638552749e54e169fc72537d4bcccxinhe                throw new IllegalArgumentException("Illegal reason value: " + reason);
13378d106780b6a638552749e54e169fc72537d4bcccxinhe            }
13388d106780b6a638552749e54e169fc72537d4bcccxinhe        }
1339584dc6b8b9628d930de4ea3ad94894886294b855xinhe
13408d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
13418d106780b6a638552749e54e169fc72537d4bcccxinhe         * clear all the failure reason counters
13428d106780b6a638552749e54e169fc72537d4bcccxinhe         */
13438d106780b6a638552749e54e169fc72537d4bcccxinhe        public void clearDisableReasonCounter() {
13448d106780b6a638552749e54e169fc72537d4bcccxinhe            Arrays.fill(mNetworkSeclectionDisableCounter, NETWORK_SELECTION_ENABLE);
13458d106780b6a638552749e54e169fc72537d4bcccxinhe        }
13468d106780b6a638552749e54e169fc72537d4bcccxinhe
13478d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
13488d106780b6a638552749e54e169fc72537d4bcccxinhe         * BSSID for connection to this network (through network selection procedure)
13498d106780b6a638552749e54e169fc72537d4bcccxinhe         */
13508d106780b6a638552749e54e169fc72537d4bcccxinhe        private String mNetworkSelectionBSSID;
13518d106780b6a638552749e54e169fc72537d4bcccxinhe
13528d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
13538d106780b6a638552749e54e169fc72537d4bcccxinhe         * get current network Selection BSSID
13548d106780b6a638552749e54e169fc72537d4bcccxinhe         * @return current network Selection BSSID
13558d106780b6a638552749e54e169fc72537d4bcccxinhe         */
13568d106780b6a638552749e54e169fc72537d4bcccxinhe        public String getNetworkSelectionBSSID() {
13578d106780b6a638552749e54e169fc72537d4bcccxinhe            return mNetworkSelectionBSSID;
13588d106780b6a638552749e54e169fc72537d4bcccxinhe        }
13598d106780b6a638552749e54e169fc72537d4bcccxinhe
13608d106780b6a638552749e54e169fc72537d4bcccxinhe        /**
13618d106780b6a638552749e54e169fc72537d4bcccxinhe         * set network Selection BSSID
13628d106780b6a638552749e54e169fc72537d4bcccxinhe         * @param bssid The target BSSID for assocaition
13638d106780b6a638552749e54e169fc72537d4bcccxinhe         */
13648d106780b6a638552749e54e169fc72537d4bcccxinhe        public void setNetworkSelectionBSSID(String bssid) {
13658d106780b6a638552749e54e169fc72537d4bcccxinhe            mNetworkSelectionBSSID = bssid;
13668d106780b6a638552749e54e169fc72537d4bcccxinhe        }
13678d106780b6a638552749e54e169fc72537d4bcccxinhe
13688d106780b6a638552749e54e169fc72537d4bcccxinhe        public void copy(NetworkSelectionStatus source) {
13698d106780b6a638552749e54e169fc72537d4bcccxinhe            mStatus = source.mStatus;
13708d106780b6a638552749e54e169fc72537d4bcccxinhe            mNetworkSelectionDisableReason = source.mNetworkSelectionDisableReason;
13718d106780b6a638552749e54e169fc72537d4bcccxinhe            for (int index = NETWORK_SELECTION_ENABLE; index < NETWORK_SELECTION_DISABLED_MAX;
13728d106780b6a638552749e54e169fc72537d4bcccxinhe                    index++) {
13738d106780b6a638552749e54e169fc72537d4bcccxinhe                mNetworkSeclectionDisableCounter[index] =
13748d106780b6a638552749e54e169fc72537d4bcccxinhe                        source.mNetworkSeclectionDisableCounter[index];
13758d106780b6a638552749e54e169fc72537d4bcccxinhe            }
13768d106780b6a638552749e54e169fc72537d4bcccxinhe            mTemporarilyDisabledTimestamp = source.mTemporarilyDisabledTimestamp;
13778d106780b6a638552749e54e169fc72537d4bcccxinhe            mNetworkSelectionBSSID = source.mNetworkSelectionBSSID;
1378d2d667275d4565e6c56a324b17f72fb4f5448ad5Roshan Pius            setSeenInLastQualifiedNetworkSelection(source.getSeenInLastQualifiedNetworkSelection());
1379521c66e73cbd48b11c2fe4b28ffcf4279acb045cRoshan Pius            setCandidate(source.getCandidate());
1380521c66e73cbd48b11c2fe4b28ffcf4279acb045cRoshan Pius            setCandidateScore(source.getCandidateScore());
1381584dc6b8b9628d930de4ea3ad94894886294b855xinhe            setConnectChoice(source.getConnectChoice());
1382584dc6b8b9628d930de4ea3ad94894886294b855xinhe            setConnectChoiceTimestamp(source.getConnectChoiceTimestamp());
1383cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            setHasEverConnected(source.getHasEverConnected());
138434cfdb26a62e114d13749d392d56cabcccc8cdb8Amin Shaikh            setNotRecommended(source.isNotRecommended());
13858d106780b6a638552749e54e169fc72537d4bcccxinhe        }
13868d106780b6a638552749e54e169fc72537d4bcccxinhe
13878d106780b6a638552749e54e169fc72537d4bcccxinhe        public void writeToParcel(Parcel dest) {
13888d106780b6a638552749e54e169fc72537d4bcccxinhe            dest.writeInt(getNetworkSelectionStatus());
13898d106780b6a638552749e54e169fc72537d4bcccxinhe            dest.writeInt(getNetworkSelectionDisableReason());
13908d106780b6a638552749e54e169fc72537d4bcccxinhe            for (int index = NETWORK_SELECTION_ENABLE; index < NETWORK_SELECTION_DISABLED_MAX;
13918d106780b6a638552749e54e169fc72537d4bcccxinhe                    index++) {
13928d106780b6a638552749e54e169fc72537d4bcccxinhe                dest.writeInt(getDisableReasonCounter(index));
13938d106780b6a638552749e54e169fc72537d4bcccxinhe            }
13948d106780b6a638552749e54e169fc72537d4bcccxinhe            dest.writeLong(getDisableTime());
13958d106780b6a638552749e54e169fc72537d4bcccxinhe            dest.writeString(getNetworkSelectionBSSID());
1396584dc6b8b9628d930de4ea3ad94894886294b855xinhe            if (getConnectChoice() != null) {
1397584dc6b8b9628d930de4ea3ad94894886294b855xinhe                dest.writeInt(CONNECT_CHOICE_EXISTS);
1398584dc6b8b9628d930de4ea3ad94894886294b855xinhe                dest.writeString(getConnectChoice());
1399584dc6b8b9628d930de4ea3ad94894886294b855xinhe                dest.writeLong(getConnectChoiceTimestamp());
1400584dc6b8b9628d930de4ea3ad94894886294b855xinhe            } else {
1401584dc6b8b9628d930de4ea3ad94894886294b855xinhe                dest.writeInt(CONNECT_CHOICE_NOT_EXISTS);
1402584dc6b8b9628d930de4ea3ad94894886294b855xinhe            }
1403cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            dest.writeInt(getHasEverConnected() ? 1 : 0);
140498773d4837922715c740d06bfd02666dceaf350bAmin Shaikh            dest.writeInt(isNotRecommended() ? 1 : 0);
14058d106780b6a638552749e54e169fc72537d4bcccxinhe        }
14068d106780b6a638552749e54e169fc72537d4bcccxinhe
14078d106780b6a638552749e54e169fc72537d4bcccxinhe        public void readFromParcel(Parcel in) {
14088d106780b6a638552749e54e169fc72537d4bcccxinhe            setNetworkSelectionStatus(in.readInt());
14098d106780b6a638552749e54e169fc72537d4bcccxinhe            setNetworkSelectionDisableReason(in.readInt());
14108d106780b6a638552749e54e169fc72537d4bcccxinhe            for (int index = NETWORK_SELECTION_ENABLE; index < NETWORK_SELECTION_DISABLED_MAX;
14118d106780b6a638552749e54e169fc72537d4bcccxinhe                    index++) {
14128d106780b6a638552749e54e169fc72537d4bcccxinhe                setDisableReasonCounter(index, in.readInt());
14138d106780b6a638552749e54e169fc72537d4bcccxinhe            }
14148d106780b6a638552749e54e169fc72537d4bcccxinhe            setDisableTime(in.readLong());
14158d106780b6a638552749e54e169fc72537d4bcccxinhe            setNetworkSelectionBSSID(in.readString());
1416584dc6b8b9628d930de4ea3ad94894886294b855xinhe            if (in.readInt() == CONNECT_CHOICE_EXISTS) {
1417584dc6b8b9628d930de4ea3ad94894886294b855xinhe                setConnectChoice(in.readString());
1418584dc6b8b9628d930de4ea3ad94894886294b855xinhe                setConnectChoiceTimestamp(in.readLong());
1419584dc6b8b9628d930de4ea3ad94894886294b855xinhe            } else {
1420584dc6b8b9628d930de4ea3ad94894886294b855xinhe                setConnectChoice(null);
1421584dc6b8b9628d930de4ea3ad94894886294b855xinhe                setConnectChoiceTimestamp(INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP);
1422584dc6b8b9628d930de4ea3ad94894886294b855xinhe            }
1423cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein            setHasEverConnected(in.readInt() != 0);
142498773d4837922715c740d06bfd02666dceaf350bAmin Shaikh            setNotRecommended(in.readInt() != 0);
14258d106780b6a638552749e54e169fc72537d4bcccxinhe        }
14268d106780b6a638552749e54e169fc72537d4bcccxinhe    }
14278d106780b6a638552749e54e169fc72537d4bcccxinhe
14288d106780b6a638552749e54e169fc72537d4bcccxinhe    /**
14298d106780b6a638552749e54e169fc72537d4bcccxinhe     * @hide
14308d106780b6a638552749e54e169fc72537d4bcccxinhe     * network selection related member
14318d106780b6a638552749e54e169fc72537d4bcccxinhe     */
1432311a72164b1060445b4067090c0bfd6615747093Roshan Pius    private NetworkSelectionStatus mNetworkSelectionStatus = new NetworkSelectionStatus();
14338d106780b6a638552749e54e169fc72537d4bcccxinhe
14348d106780b6a638552749e54e169fc72537d4bcccxinhe    /**
14358d106780b6a638552749e54e169fc72537d4bcccxinhe     * @hide
1436446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne     * This class is intended to store extra failure reason information for the most recent
1437446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne     * connection attempt, so that it may be surfaced to the settings UI
1438446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne     */
1439446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne    public static class RecentFailure {
1440446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne
1441446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        /**
1442446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         * No recent failure, or no specific reason given for the recent connection failure
1443446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         */
1444446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        public static final int NONE = 0;
1445446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        /**
1446446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         * Connection to this network recently failed due to Association Rejection Status 17
1447446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         * (AP is full)
1448446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         */
1449446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        public static final int STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17;
1450446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        /**
1451446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         * Association Rejection Status code (NONE for success/non-association-rejection-fail)
1452446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         */
1453446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        private int mAssociationStatus = NONE;
1454446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne
1455446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        /**
1456446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         * @param status the association status code for the recent failure
1457446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         */
1458446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        public void setAssociationStatus(int status) {
1459446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne            mAssociationStatus = status;
1460446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        }
1461446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        /**
1462446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         * Sets the RecentFailure to NONE
1463446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         */
1464446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        public void clear() {
1465446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne            mAssociationStatus = NONE;
1466446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        }
1467446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        /**
1468446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         * Get the recent failure code
1469446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne         */
1470446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        public int getAssociationStatus() {
1471446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne            return mAssociationStatus;
1472446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        }
1473446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne    }
1474446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne
1475446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne    /**
1476446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne     * @hide
1477446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne     * RecentFailure member
1478446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne     */
1479446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne    final public RecentFailure recentFailure = new RecentFailure();
1480446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne
1481446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne    /**
1482446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne     * @hide
14838d106780b6a638552749e54e169fc72537d4bcccxinhe     * @return network selection status
14848d106780b6a638552749e54e169fc72537d4bcccxinhe     */
14858d106780b6a638552749e54e169fc72537d4bcccxinhe    public NetworkSelectionStatus getNetworkSelectionStatus() {
14868d106780b6a638552749e54e169fc72537d4bcccxinhe        return mNetworkSelectionStatus;
14878d106780b6a638552749e54e169fc72537d4bcccxinhe    }
1488311a72164b1060445b4067090c0bfd6615747093Roshan Pius
1489311a72164b1060445b4067090c0bfd6615747093Roshan Pius    /**
1490311a72164b1060445b4067090c0bfd6615747093Roshan Pius     * Set the network selection status
1491311a72164b1060445b4067090c0bfd6615747093Roshan Pius     * @hide
1492311a72164b1060445b4067090c0bfd6615747093Roshan Pius     */
1493311a72164b1060445b4067090c0bfd6615747093Roshan Pius    public void setNetworkSelectionStatus(NetworkSelectionStatus status) {
1494311a72164b1060445b4067090c0bfd6615747093Roshan Pius        mNetworkSelectionStatus = status;
1495311a72164b1060445b4067090c0bfd6615747093Roshan Pius    }
1496311a72164b1060445b4067090c0bfd6615747093Roshan Pius
14977c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
14987c3606c103e95d3991267cca2592402a68779cafvandwalle     * @hide
14997c3606c103e95d3991267cca2592402a68779cafvandwalle     * Linked Configurations: represent the set of Wificonfigurations that are equivalent
15007c3606c103e95d3991267cca2592402a68779cafvandwalle     * regarding roaming and auto-joining.
15017c3606c103e95d3991267cca2592402a68779cafvandwalle     * The linked configuration may or may not have same SSID, and may or may not have same
15027c3606c103e95d3991267cca2592402a68779cafvandwalle     * credentials.
15037c3606c103e95d3991267cca2592402a68779cafvandwalle     * For instance, linked configurations will have same defaultGwMacAddress or same dhcp server.
15047c3606c103e95d3991267cca2592402a68779cafvandwalle     */
15057c3606c103e95d3991267cca2592402a68779cafvandwalle    public HashMap<String, Integer>  linkedConfigurations;
15067c3606c103e95d3991267cca2592402a68779cafvandwalle
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiConfiguration() {
15085ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff        networkId = INVALID_NETWORK_ID;
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SSID = null;
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BSSID = null;
15118a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng        FQDN = null;
15127226c8f95b5971af2710c8d2f8a8b6f2210e2420Vinit Deshpande        roamingConsortiumIds = new long[0];
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        priority = 0;
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        hiddenSSID = false;
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedKeyManagement = new BitSet();
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedProtocols = new BitSet();
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedAuthAlgorithms = new BitSet();
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedPairwiseCiphers = new BitSet();
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allowedGroupCiphers = new BitSet();
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wepKeys = new String[4];
15219b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (int i = 0; i < wepKeys.length; i++) {
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wepKeys[i] = null;
15234337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang        }
15249b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        enterpriseConfig = new WifiEnterpriseConfig();
1525e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        selfAdded = false;
15268f13548615f647a1208ace5369b504cb41149965vandwalle        didSelfAdd = false;
1527e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        ephemeral = false;
1528f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin        meteredHint = false;
152943d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        meteredOverride = METERED_OVERRIDE_NONE;
1530fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin        useExternalScores = false;
1531ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        validatedInternetAccess = false;
15326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration = new IpConfiguration();
15333e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        lastUpdateUid = -1;
15343e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        creatorUid = -1;
15356fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski        shared = true;
1536b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne        dtimInterval = 0;
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
153910652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    /**
15406bbc8955c17ed44f63ddbf78d0e4d24b60ac05cdPeter Qiu     * Identify if this configuration represents a Passpoint network
15412522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande     */
15422522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande    public boolean isPasspoint() {
1543ad25bb89251c0552cfbc6c254853c79b7d9c121aVinit Deshpande        return !TextUtils.isEmpty(FQDN)
15442522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande                && !TextUtils.isEmpty(providerFriendlyName)
15452522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande                && enterpriseConfig != null
15462522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande                && enterpriseConfig.getEapMethod() != WifiEnterpriseConfig.Eap.NONE;
15472522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande    }
15482522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande
15492522c830a3ad3ae2ca7f675f13fafab8835d4f0cVinit Deshpande    /**
1550111fa0274d1d6620f9634783585387f3b773949evandwalle     * Helper function, identify if a configuration is linked
1551111fa0274d1d6620f9634783585387f3b773949evandwalle     * @hide
1552111fa0274d1d6620f9634783585387f3b773949evandwalle     */
1553111fa0274d1d6620f9634783585387f3b773949evandwalle    public boolean isLinked(WifiConfiguration config) {
15548d106780b6a638552749e54e169fc72537d4bcccxinhe        if (config != null) {
15558d106780b6a638552749e54e169fc72537d4bcccxinhe            if (config.linkedConfigurations != null && linkedConfigurations != null) {
15568d106780b6a638552749e54e169fc72537d4bcccxinhe                if (config.linkedConfigurations.get(configKey()) != null
15578d106780b6a638552749e54e169fc72537d4bcccxinhe                        && linkedConfigurations.get(config.configKey()) != null) {
15588d106780b6a638552749e54e169fc72537d4bcccxinhe                    return true;
15598d106780b6a638552749e54e169fc72537d4bcccxinhe                }
1560111fa0274d1d6620f9634783585387f3b773949evandwalle            }
1561111fa0274d1d6620f9634783585387f3b773949evandwalle        }
1562111fa0274d1d6620f9634783585387f3b773949evandwalle        return  false;
15637c3606c103e95d3991267cca2592402a68779cafvandwalle    }
15647c3606c103e95d3991267cca2592402a68779cafvandwalle
15657c3606c103e95d3991267cca2592402a68779cafvandwalle    /**
1566c55cd103708493f9d45122236affbf08b49456f0Sky Faber     * Helper function, idenfity if a configuration should be treated as an enterprise network
1567c55cd103708493f9d45122236affbf08b49456f0Sky Faber     * @hide
1568c55cd103708493f9d45122236affbf08b49456f0Sky Faber     */
1569c55cd103708493f9d45122236affbf08b49456f0Sky Faber    public boolean isEnterprise() {
157029ce1dab5a97a8ec266d8314f552c2ecdf9bd99fRoshan Pius        return (allowedKeyManagement.get(KeyMgmt.WPA_EAP)
157129ce1dab5a97a8ec266d8314f552c2ecdf9bd99fRoshan Pius                || allowedKeyManagement.get(KeyMgmt.IEEE8021X))
157229ce1dab5a97a8ec266d8314f552c2ecdf9bd99fRoshan Pius                && enterpriseConfig != null
157329ce1dab5a97a8ec266d8314f552c2ecdf9bd99fRoshan Pius                && enterpriseConfig.getEapMethod() != WifiEnterpriseConfig.Eap.NONE;
1574c55cd103708493f9d45122236affbf08b49456f0Sky Faber    }
1575c55cd103708493f9d45122236affbf08b49456f0Sky Faber
15768dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    @Override
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
15788dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy        StringBuilder sbuf = new StringBuilder();
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.status == WifiConfiguration.Status.CURRENT) {
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sbuf.append("* ");
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (this.status == WifiConfiguration.Status.DISABLED) {
158263edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle            sbuf.append("- DSBLE ");
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append("ID: ").append(this.networkId).append(" SSID: ").append(this.SSID).
1585b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                append(" PROVIDER-NAME: ").append(this.providerFriendlyName).
15868d106780b6a638552749e54e169fc72537d4bcccxinhe                append(" BSSID: ").append(this.BSSID).append(" FQDN: ").append(this.FQDN)
15878d106780b6a638552749e54e169fc72537d4bcccxinhe                .append(" PRIO: ").append(this.priority)
1588e23993848c65c7fb2c91bb89989117d35dabe5c3mukesh agrawal                .append(" HIDDEN: ").append(this.hiddenSSID)
15898d106780b6a638552749e54e169fc72537d4bcccxinhe                .append('\n');
15908d106780b6a638552749e54e169fc72537d4bcccxinhe
15918d106780b6a638552749e54e169fc72537d4bcccxinhe
15928d106780b6a638552749e54e169fc72537d4bcccxinhe        sbuf.append(" NetworkSelectionStatus ")
15938d106780b6a638552749e54e169fc72537d4bcccxinhe                .append(mNetworkSelectionStatus.getNetworkStatusString() + "\n");
15948d106780b6a638552749e54e169fc72537d4bcccxinhe        if (mNetworkSelectionStatus.getNetworkSelectionDisableReason() > 0) {
15958d106780b6a638552749e54e169fc72537d4bcccxinhe            sbuf.append(" mNetworkSelectionDisableReason ")
15968d106780b6a638552749e54e169fc72537d4bcccxinhe                    .append(mNetworkSelectionStatus.getNetworkDisableReasonString() + "\n");
15978d106780b6a638552749e54e169fc72537d4bcccxinhe
15988d106780b6a638552749e54e169fc72537d4bcccxinhe            for (int index = mNetworkSelectionStatus.NETWORK_SELECTION_ENABLE;
15998d106780b6a638552749e54e169fc72537d4bcccxinhe                    index < mNetworkSelectionStatus.NETWORK_SELECTION_DISABLED_MAX; index++) {
16008d106780b6a638552749e54e169fc72537d4bcccxinhe                if (mNetworkSelectionStatus.getDisableReasonCounter(index) != 0) {
16018d106780b6a638552749e54e169fc72537d4bcccxinhe                    sbuf.append(NetworkSelectionStatus.getNetworkDisableReasonString(index)
16028d106780b6a638552749e54e169fc72537d4bcccxinhe                            + " counter:" + mNetworkSelectionStatus.getDisableReasonCounter(index)
16038d106780b6a638552749e54e169fc72537d4bcccxinhe                            + "\n");
16048d106780b6a638552749e54e169fc72537d4bcccxinhe                }
16058d106780b6a638552749e54e169fc72537d4bcccxinhe            }
16060561030490e418fcead83606249d8cfdc344a163Mike Lockwood        }
1607584dc6b8b9628d930de4ea3ad94894886294b855xinhe        if (mNetworkSelectionStatus.getConnectChoice() != null) {
1608584dc6b8b9628d930de4ea3ad94894886294b855xinhe            sbuf.append(" connect choice: ").append(mNetworkSelectionStatus.getConnectChoice());
1609584dc6b8b9628d930de4ea3ad94894886294b855xinhe            sbuf.append(" connect choice set time: ").append(mNetworkSelectionStatus
1610584dc6b8b9628d930de4ea3ad94894886294b855xinhe                    .getConnectChoiceTimestamp());
1611584dc6b8b9628d930de4ea3ad94894886294b855xinhe        }
1612cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein        sbuf.append(" hasEverConnected: ")
1613cd7167db2d8a18ad3e0a594c46e46d7ffafdaaccRebecca Silberstein                .append(mNetworkSelectionStatus.getHasEverConnected()).append("\n");
16148d106780b6a638552749e54e169fc72537d4bcccxinhe
16150561030490e418fcead83606249d8cfdc344a163Mike Lockwood        if (this.numAssociation > 0) {
16160561030490e418fcead83606249d8cfdc344a163Mike Lockwood            sbuf.append(" numAssociation ").append(this.numAssociation).append("\n");
161716a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        }
1618ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        if (this.numNoInternetAccessReports > 0) {
1619ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle            sbuf.append(" numNoInternetAccessReports ");
1620ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle            sbuf.append(this.numNoInternetAccessReports).append("\n");
1621ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        }
1622ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle        if (this.updateTime != null) {
162343d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey            sbuf.append(" update ").append(this.updateTime).append("\n");
1624ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle        }
1625ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle        if (this.creationTime != null) {
162643d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey            sbuf.append(" creation ").append(this.creationTime).append("\n");
1627ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle        }
162894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.didSelfAdd) sbuf.append(" didSelfAdd");
162994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.selfAdded) sbuf.append(" selfAdded");
1630ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        if (this.validatedInternetAccess) sbuf.append(" validatedInternetAccess");
16318faf2a2a15853368a14babf935c156664b5f0b6cJeff Davidson        if (this.ephemeral) sbuf.append(" ephemeral");
1632f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin        if (this.meteredHint) sbuf.append(" meteredHint");
1633fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin        if (this.useExternalScores) sbuf.append(" useExternalScores");
1634f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin        if (this.didSelfAdd || this.selfAdded || this.validatedInternetAccess
163543d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey            || this.ephemeral || this.meteredHint || this.useExternalScores) {
163616a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle            sbuf.append("\n");
163716a40cc7b597f0492f633cc0f742dc796955e7fdvandwalle        }
163843d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        if (this.meteredOverride != METERED_OVERRIDE_NONE) {
163943d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey            sbuf.append(" meteredOverride ").append(meteredOverride).append("\n");
164043d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        }
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" KeyMgmt:");
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int k = 0; k < this.allowedKeyManagement.size(); k++) {
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedKeyManagement.get(k)) {
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (k < KeyMgmt.strings.length) {
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(KeyMgmt.strings[k]);
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" Protocols:");
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int p = 0; p < this.allowedProtocols.size(); p++) {
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedProtocols.get(p)) {
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p < Protocol.strings.length) {
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(Protocol.strings[p]);
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" AuthAlgorithms:");
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int a = 0; a < this.allowedAuthAlgorithms.size(); a++) {
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedAuthAlgorithms.get(a)) {
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a < AuthAlgorithm.strings.length) {
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(AuthAlgorithm.strings[a]);
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" PairwiseCiphers:");
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int pc = 0; pc < this.allowedPairwiseCiphers.size(); pc++) {
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedPairwiseCiphers.get(pc)) {
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pc < PairwiseCipher.strings.length) {
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(PairwiseCipher.strings[pc]);
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append('\n');
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sbuf.append(" GroupCiphers:");
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int gc = 0; gc < this.allowedGroupCiphers.size(); gc++) {
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (this.allowedGroupCiphers.get(gc)) {
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sbuf.append(" ");
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (gc < GroupCipher.strings.length) {
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append(GroupCipher.strings[gc]);
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sbuf.append("??");
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16995069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        sbuf.append('\n').append(" PSK: ");
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (this.preSharedKey != null) {
17015069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang            sbuf.append('*');
17025069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang        }
170394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("\nEnterprise config:\n");
17049b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        sbuf.append(enterpriseConfig);
17059b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff
170694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        sbuf.append("IP config:\n");
17076346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        sbuf.append(mIpConfiguration.toString());
1708128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
17098d106780b6a638552749e54e169fc72537d4bcccxinhe        if (mNetworkSelectionStatus.getNetworkSelectionBSSID() != null) {
17108d106780b6a638552749e54e169fc72537d4bcccxinhe            sbuf.append(" networkSelectionBSSID="
17118d106780b6a638552749e54e169fc72537d4bcccxinhe                    + mNetworkSelectionStatus.getNetworkSelectionBSSID());
17128d106780b6a638552749e54e169fc72537d4bcccxinhe        }
171394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        long now_ms = System.currentTimeMillis();
17148d106780b6a638552749e54e169fc72537d4bcccxinhe        if (mNetworkSelectionStatus.getDisableTime() != NetworkSelectionStatus
17158d106780b6a638552749e54e169fc72537d4bcccxinhe                .INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP) {
171694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
17178d106780b6a638552749e54e169fc72537d4bcccxinhe            long diff = now_ms - mNetworkSelectionStatus.getDisableTime();
17182ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            if (diff <= 0) {
171994fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append(" blackListed since <incorrect>");
17202ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            } else {
1721aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append(" blackListed: ").append(Long.toString(diff / 1000)).append("sec ");
172294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            }
172394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        }
1724aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        if (creatorUid != 0) sbuf.append(" cuid=" + creatorUid);
17253e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        if (creatorName != null) sbuf.append(" cname=" + creatorName);
17263e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        if (lastUpdateUid != 0) sbuf.append(" luid=" + lastUpdateUid);
17273e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        if (lastUpdateName != null) sbuf.append(" lname=" + lastUpdateName);
17281ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti        sbuf.append(" lcuid=" + lastConnectUid);
17291ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti        sbuf.append(" userApproved=" + userApprovedAsString(userApproved));
17301ac50cb32c08388540f53833c04a02f13fed0824Lorenzo Colitti        sbuf.append(" noInternetAccessExpected=" + noInternetAccessExpected);
17311248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti        sbuf.append(" ");
17323e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
173394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.lastConnected != 0) {
173494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
173594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            long diff = now_ms - this.lastConnected;
173694fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            if (diff <= 0) {
173794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle                sbuf.append("lastConnected since <incorrect>");
173894fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            } else {
1739aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("lastConnected: ").append(Long.toString(diff / 1000)).append("sec ");
174094fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            }
174194fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        }
174294fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle        if (this.lastConnectionFailure != 0) {
174394fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            sbuf.append('\n');
174494fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            long diff = now_ms - this.lastConnectionFailure;
174594fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            if (diff <= 0) {
17465ddc65b9860b7ef39a0921bcbca3cbc50abe3a2cPierre Vandwalle                sbuf.append("lastConnectionFailure since <incorrect> ");
174794fe7e99d1e99a6bb351da48a8e17b1d61b0efdcvandwalle            } else {
1748aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("lastConnectionFailure: ").append(Long.toString(diff / 1000));
1749aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("sec ");
17502ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle            }
17512ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle        }
17528650c035609507340e3a66459cea16ef08cd03a6vandwalle        if (this.lastRoamingFailure != 0) {
17538650c035609507340e3a66459cea16ef08cd03a6vandwalle            sbuf.append('\n');
17548650c035609507340e3a66459cea16ef08cd03a6vandwalle            long diff = now_ms - this.lastRoamingFailure;
17558650c035609507340e3a66459cea16ef08cd03a6vandwalle            if (diff <= 0) {
17565ddc65b9860b7ef39a0921bcbca3cbc50abe3a2cPierre Vandwalle                sbuf.append("lastRoamingFailure since <incorrect> ");
17578650c035609507340e3a66459cea16ef08cd03a6vandwalle            } else {
1758aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("lastRoamingFailure: ").append(Long.toString(diff / 1000));
1759aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy                sbuf.append("sec ");
17608650c035609507340e3a66459cea16ef08cd03a6vandwalle            }
17618650c035609507340e3a66459cea16ef08cd03a6vandwalle        }
17628650c035609507340e3a66459cea16ef08cd03a6vandwalle        sbuf.append("roamingFailureBlackListTimeMilli: ").
17638650c035609507340e3a66459cea16ef08cd03a6vandwalle                append(Long.toString(this.roamingFailureBlackListTimeMilli));
1764448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        sbuf.append('\n');
1765448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        if (this.linkedConfigurations != null) {
1766aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy            for (String key : this.linkedConfigurations.keySet()) {
1767448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                sbuf.append(" linked: ").append(key);
1768448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle                sbuf.append('\n');
1769448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle            }
1770448e208b0a1b2a4cec22b636afd28d58f8785c2evandwalle        }
1771446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        sbuf.append("recentFailure: ").append("Association Rejection code: ")
1772446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne                .append(recentFailure.getAssociationStatus()).append("\n");
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sbuf.toString();
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1776b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** {@hide} */
1777b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public String getPrintableSsid() {
1778b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (SSID == null) return "";
1779b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        final int length = SSID.length();
1780b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (length > 2 && (SSID.charAt(0) == '"') && SSID.charAt(length - 1) == '"') {
1781b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return SSID.substring(1, length - 1);
1782b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
1783b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
1784b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        /** The ascii-encoded string format is P"<ascii-encoded-string>"
1785b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         * The decoding is implemented in the supplicant for a newly configured
1786b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         * network.
1787b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff         */
1788b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (length > 3 && (SSID.charAt(0) == 'P') && (SSID.charAt(1) == '"') &&
1789b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                (SSID.charAt(length-1) == '"')) {
1790b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded(
1791b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    SSID.substring(2, length - 1));
1792b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return wifiSsid.toString();
1793b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
1794b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return SSID;
1795b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
1796b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
17973e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    /** @hide **/
17983e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    public static String userApprovedAsString(int userApproved) {
17993e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        switch (userApproved) {
18003e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            case USER_APPROVED:
18013e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                return "USER_APPROVED";
18023e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            case USER_BANNED:
18033e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                return "USER_BANNED";
18043e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            case USER_UNSPECIFIED:
18053e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                return "USER_UNSPECIFIED";
18063e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            default:
18073e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                return "INVALID";
18083e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        }
18093e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber    }
18103e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber
181126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    /**
181226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * Get an identifier for associating credentials with this config
181326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @param current configuration contains values for additional fields
181426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     *                that are not part of this configuration. Used
181526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     *                when a config with some fields is passed by an application.
181626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @throws IllegalStateException if config is invalid for key id generation
181726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     * @hide
181826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff     */
1819ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public String getKeyIdForCredentials(WifiConfiguration current) {
182026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        String keyMgmt = null;
182126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
182226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        try {
182326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            // Get current config details for fields that are not initialized
182426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (TextUtils.isEmpty(SSID)) SSID = current.SSID;
182526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.cardinality() == 0) {
182626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                allowedKeyManagement = current.allowedKeyManagement;
182726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
182826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
182926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                keyMgmt = KeyMgmt.strings[KeyMgmt.WPA_EAP];
183026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
183161b5a7689320274ce5fff9a9eae1866d8d696b9bJan Nordqvist            if (allowedKeyManagement.get(KeyMgmt.OSEN)) {
183261b5a7689320274ce5fff9a9eae1866d8d696b9bJan Nordqvist                keyMgmt = KeyMgmt.strings[KeyMgmt.OSEN];
183361b5a7689320274ce5fff9a9eae1866d8d696b9bJan Nordqvist            }
183426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
183526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                keyMgmt += KeyMgmt.strings[KeyMgmt.IEEE8021X];
183626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
183726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
183826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            if (TextUtils.isEmpty(keyMgmt)) {
183926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                throw new IllegalStateException("Not an EAP network");
184026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            }
184126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
184226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            return trimStringForKeyId(SSID) + "_" + keyMgmt + "_" +
184326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                    trimStringForKeyId(enterpriseConfig.getKeyId(current != null ?
184426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff                            current.enterpriseConfig : null));
184526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        } catch (NullPointerException e) {
184626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff            throw new IllegalStateException("Invalid config details");
184726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        }
184826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    }
184926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
185026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    private String trimStringForKeyId(String string) {
185126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        // Remove quotes and spaces
185226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        return string.replace("\"", "").replace(" ", "");
185326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff    }
185426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static BitSet readBitSet(Parcel src) {
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cardinality = src.readInt();
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BitSet set = new BitSet();
18599b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (int i = 0; i < cardinality; i++) {
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            set.set(src.readInt());
18619b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return set;
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void writeBitSet(Parcel dest, BitSet set) {
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nextSetBit = -1;
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(set.cardinality());
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18719b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) {
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(nextSetBit);
18739b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1876ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    /** @hide */
1877ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    public int getAuthType() {
1878d49288352908e8cbc9a001e13df2eb35e78deb1aJan Nordqvist        if (allowedKeyManagement.cardinality() > 1) {
1879d49288352908e8cbc9a001e13df2eb35e78deb1aJan Nordqvist            throw new IllegalStateException("More than one auth type set");
188026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff        }
1881ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
1882ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA_PSK;
1883ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.WPA2_PSK)) {
1884ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA2_PSK;
1885ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
1886ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.WPA_EAP;
1887ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        } else if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
1888ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff            return KeyMgmt.IEEE8021X;
1889ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        }
1890ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff        return KeyMgmt.NONE;
1891ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff    }
1892ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff
18937c3606c103e95d3991267cca2592402a68779cafvandwalle    /* @hide
18947c3606c103e95d3991267cca2592402a68779cafvandwalle     * Cache the config key, this seems useful as a speed up since a lot of
18957c3606c103e95d3991267cca2592402a68779cafvandwalle     * lookups in the config store are done and based on this key.
18967c3606c103e95d3991267cca2592402a68779cafvandwalle     */
18977c3606c103e95d3991267cca2592402a68779cafvandwalle    String mCachedConfigKey;
18987c3606c103e95d3991267cca2592402a68779cafvandwalle
18997c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
19007c3606c103e95d3991267cca2592402a68779cafvandwalle     *  return the string used to calculate the hash in WifiConfigStore
19017c3606c103e95d3991267cca2592402a68779cafvandwalle     *  and uniquely identify this WifiConfiguration
19027c3606c103e95d3991267cca2592402a68779cafvandwalle     */
19037c3606c103e95d3991267cca2592402a68779cafvandwalle    public String configKey(boolean allowCached) {
19047c3606c103e95d3991267cca2592402a68779cafvandwalle        String key;
19057c3606c103e95d3991267cca2592402a68779cafvandwalle        if (allowCached && mCachedConfigKey != null) {
19067c3606c103e95d3991267cca2592402a68779cafvandwalle            key = mCachedConfigKey;
1907b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande        } else if (providerFriendlyName != null) {
1908b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande            key = FQDN + KeyMgmt.strings[KeyMgmt.WPA_EAP];
19096fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            if (!shared) {
19106fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski                key += "-" + Integer.toString(UserHandle.getUserId(creatorUid));
19116fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            }
19127c3606c103e95d3991267cca2592402a68779cafvandwalle        } else {
19138e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti            if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
19148e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                key = SSID + KeyMgmt.strings[KeyMgmt.WPA_PSK];
19158e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti            } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
19168e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                    allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
19178e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                key = SSID + KeyMgmt.strings[KeyMgmt.WPA_EAP];
19188e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti            } else if (wepKeys[0] != null) {
19198e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                key = SSID + "WEP";
19208e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti            } else {
19218e1e34a3f659f76bbbfce2a2a8bdd3f471bf707dLorenzo Colitti                key = SSID + KeyMgmt.strings[KeyMgmt.NONE];
19227c3606c103e95d3991267cca2592402a68779cafvandwalle            }
19236fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            if (!shared) {
19246fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski                key += "-" + Integer.toString(UserHandle.getUserId(creatorUid));
19256fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            }
19267c3606c103e95d3991267cca2592402a68779cafvandwalle            mCachedConfigKey = key;
19277c3606c103e95d3991267cca2592402a68779cafvandwalle        }
19287c3606c103e95d3991267cca2592402a68779cafvandwalle        return key;
19297c3606c103e95d3991267cca2592402a68779cafvandwalle    }
19307c3606c103e95d3991267cca2592402a68779cafvandwalle
19317c3606c103e95d3991267cca2592402a68779cafvandwalle    /** @hide
19327c3606c103e95d3991267cca2592402a68779cafvandwalle     * get configKey, force calculating the config string
19337c3606c103e95d3991267cca2592402a68779cafvandwalle     */
19347c3606c103e95d3991267cca2592402a68779cafvandwalle    public String configKey() {
19357c3606c103e95d3991267cca2592402a68779cafvandwalle        return configKey(false);
19367c3606c103e95d3991267cca2592402a68779cafvandwalle    }
19377c3606c103e95d3991267cca2592402a68779cafvandwalle
19386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
19396346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration getIpConfiguration() {
19406346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration;
19416346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
19426346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
19436346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
19446346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setIpConfiguration(IpConfiguration ipConfiguration) {
19456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration = ipConfiguration;
19466346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
19476346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
19486346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
19490a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public StaticIpConfiguration getStaticIpConfiguration() {
19500a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return mIpConfiguration.getStaticIpConfiguration();
19516346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
19526346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
19536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
19540a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setStaticIpConfiguration(StaticIpConfiguration staticIpConfiguration) {
19550a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        mIpConfiguration.setStaticIpConfiguration(staticIpConfiguration);
19566346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
19576346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
19586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
19596346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration.IpAssignment getIpAssignment() {
19606346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration.ipAssignment;
19616346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
19626346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
19636346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
19646346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setIpAssignment(IpConfiguration.IpAssignment ipAssignment) {
19656346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.ipAssignment = ipAssignment;
19666346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
19676346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
19686346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
19696346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration.ProxySettings getProxySettings() {
19706346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return mIpConfiguration.proxySettings;
19716346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
19726346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
19736346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** @hide */
19746346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setProxySettings(IpConfiguration.ProxySettings proxySettings) {
19756346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.proxySettings = proxySettings;
19766346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
19776346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
19781375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne    /**
19791375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     * Returns the HTTP proxy used by this object.
19801375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     * @return a {@link ProxyInfo httpProxy} representing the proxy specified by this
19811375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     *                  WifiConfiguration, or {@code null} if no proxy is specified.
19821375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     */
19830a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public ProxyInfo getHttpProxy() {
19841375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        if (mIpConfiguration.proxySettings == IpConfiguration.ProxySettings.NONE) {
19851375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            return null;
19861375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        }
19871375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        return new ProxyInfo(mIpConfiguration.httpProxy);
19880a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
19890a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
19901375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne    /**
19911375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     * Set the {@link ProxyInfo} for this WifiConfiguration.
19921375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     * @param httpProxy {@link ProxyInfo} representing the httpProxy to be used by this
19931375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     *                  WifiConfiguration. Setting this {@code null} will explicitly set no proxy,
19941375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     *                  removing any proxy that was previously set.
19951375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     * @exception throw IllegalArgumentException for invalid httpProxy
19961375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne     */
19970a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setHttpProxy(ProxyInfo httpProxy) {
19981375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        if (httpProxy == null) {
19991375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            mIpConfiguration.setProxySettings(IpConfiguration.ProxySettings.NONE);
20001375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            mIpConfiguration.setHttpProxy(null);
20011375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            return;
20021375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        }
20031375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        ProxyInfo httpProxyCopy;
20041375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        ProxySettings proxySettingCopy;
20051375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        if (!Uri.EMPTY.equals(httpProxy.getPacFileUrl())) {
20061375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            proxySettingCopy = IpConfiguration.ProxySettings.PAC;
20071375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            // Construct a new PAC URL Proxy
20081375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            httpProxyCopy = new ProxyInfo(httpProxy.getPacFileUrl(), httpProxy.getPort());
20091375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        } else {
20101375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            proxySettingCopy = IpConfiguration.ProxySettings.STATIC;
20111375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            // Construct a new HTTP Proxy
20121375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            httpProxyCopy = new ProxyInfo(httpProxy.getHost(), httpProxy.getPort(),
20131375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne                    httpProxy.getExclusionListAsString());
20141375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        }
20151375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        if (!httpProxyCopy.isValid()) {
20161375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne            throw new IllegalArgumentException("Invalid ProxyInfo: " + httpProxyCopy.toString());
20171375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        }
20181375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        mIpConfiguration.setProxySettings(proxySettingCopy);
20191375ede09255e04141f680c3e90526e9f34bf061Glen Kuhne        mIpConfiguration.setHttpProxy(httpProxyCopy);
20200a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
20210a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
20220a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    /** @hide */
20236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void setProxy(ProxySettings settings, ProxyInfo proxy) {
20246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        mIpConfiguration.proxySettings = settings;
20250a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        mIpConfiguration.httpProxy = proxy;
20266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
20276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
202813f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle    /** Implement the Parcelable interface {@hide} */
2029678979748585c5903125a404e448ad6c111dedadJaewan Kim    public int describeContents() {
2030678979748585c5903125a404e448ad6c111dedadJaewan Kim        return 0;
2031678979748585c5903125a404e448ad6c111dedadJaewan Kim    }
2032678979748585c5903125a404e448ad6c111dedadJaewan Kim
20336fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski    /** @hide */
2034a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public void setPasspointManagementObjectTree(String passpointManagementObjectTree) {
2035a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        mPasspointManagementObjectTree = passpointManagementObjectTree;
2036a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
2037a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
2038a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /** @hide */
2039a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public String getMoTree() {
2040a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        return mPasspointManagementObjectTree;
2041a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
2042a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
2043128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    /** copy constructor {@hide} */
2044128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff    public WifiConfiguration(WifiConfiguration source) {
2045128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff        if (source != null) {
2046128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            networkId = source.networkId;
2047128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            status = source.status;
2048128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            SSID = source.SSID;
2049128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            BSSID = source.BSSID;
20508a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng            FQDN = source.FQDN;
2051a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande            roamingConsortiumIds = source.roamingConsortiumIds.clone();
2052b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande            providerFriendlyName = source.providerFriendlyName;
20531379fd0b1ef952547934846f4b6c40780f885e47Peter Qiu            isHomeProviderNetwork = source.isHomeProviderNetwork;
2054128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            preSharedKey = source.preSharedKey;
2055128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
20568d106780b6a638552749e54e169fc72537d4bcccxinhe            mNetworkSelectionStatus.copy(source.getNetworkSelectionStatus());
2057a0be0fb2709124a567f89114b1d8e80f74452edcxinhe            apBand = source.apBand;
2058a0be0fb2709124a567f89114b1d8e80f74452edcxinhe            apChannel = source.apChannel;
2059a0be0fb2709124a567f89114b1d8e80f74452edcxinhe
2060128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            wepKeys = new String[4];
20619b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            for (int i = 0; i < wepKeys.length; i++) {
2062128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff                wepKeys[i] = source.wepKeys[i];
20639b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            }
2064128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff
2065128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            wepTxKeyIndex = source.wepTxKeyIndex;
2066128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            priority = source.priority;
2067128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            hiddenSSID = source.hiddenSSID;
2068128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedKeyManagement   = (BitSet) source.allowedKeyManagement.clone();
2069128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedProtocols       = (BitSet) source.allowedProtocols.clone();
2070128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedAuthAlgorithms  = (BitSet) source.allowedAuthAlgorithms.clone();
2071128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedPairwiseCiphers = (BitSet) source.allowedPairwiseCiphers.clone();
2072128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff            allowedGroupCiphers    = (BitSet) source.allowedGroupCiphers.clone();
20739b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff            enterpriseConfig = new WifiEnterpriseConfig(source.enterpriseConfig);
2074678979748585c5903125a404e448ad6c111dedadJaewan Kim
20757c3606c103e95d3991267cca2592402a68779cafvandwalle            defaultGwMacAddress = source.defaultGwMacAddress;
20767c3606c103e95d3991267cca2592402a68779cafvandwalle
20776346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            mIpConfiguration = new IpConfiguration(source.mIpConfiguration);
20786346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
20797c3606c103e95d3991267cca2592402a68779cafvandwalle            if ((source.linkedConfigurations != null)
20807c3606c103e95d3991267cca2592402a68779cafvandwalle                    && (source.linkedConfigurations.size() > 0)) {
20817c3606c103e95d3991267cca2592402a68779cafvandwalle                linkedConfigurations = new HashMap<String, Integer>();
20827c3606c103e95d3991267cca2592402a68779cafvandwalle                linkedConfigurations.putAll(source.linkedConfigurations);
20837c3606c103e95d3991267cca2592402a68779cafvandwalle            }
20847c3606c103e95d3991267cca2592402a68779cafvandwalle            mCachedConfigKey = null; //force null configKey
2085e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle            selfAdded = source.selfAdded;
2086ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle            validatedInternetAccess = source.validatedInternetAccess;
2087580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu            isLegacyPasspointConfig = source.isLegacyPasspointConfig;
20888faf2a2a15853368a14babf935c156664b5f0b6cJeff Davidson            ephemeral = source.ephemeral;
2089f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin            meteredHint = source.meteredHint;
2090c76fda726973693c6168ada797943070eac2f04bStephen Chen            meteredOverride = source.meteredOverride;
2091fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin            useExternalScores = source.useExternalScores;
20927c3606c103e95d3991267cca2592402a68779cafvandwalle            if (source.visibility != null) {
20937c3606c103e95d3991267cca2592402a68779cafvandwalle                visibility = new Visibility(source.visibility);
20947c3606c103e95d3991267cca2592402a68779cafvandwalle            }
20953a74e2ef1681eaae973fc989b3533a7f9c82e7b1vandwalle
20968f13548615f647a1208ace5369b504cb41149965vandwalle            didSelfAdd = source.didSelfAdd;
20978f13548615f647a1208ace5369b504cb41149965vandwalle            lastConnectUid = source.lastConnectUid;
20988f13548615f647a1208ace5369b504cb41149965vandwalle            lastUpdateUid = source.lastUpdateUid;
20998f13548615f647a1208ace5369b504cb41149965vandwalle            creatorUid = source.creatorUid;
21003e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            creatorName = source.creatorName;
21013e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            lastUpdateName = source.lastUpdateName;
21022d0f71eea20470985abde98d759910a1ac40b257vandwalle            peerWifiConfiguration = source.peerWifiConfiguration;
21038d106780b6a638552749e54e169fc72537d4bcccxinhe
2104111fa0274d1d6620f9634783585387f3b773949evandwalle            lastConnected = source.lastConnected;
2105111fa0274d1d6620f9634783585387f3b773949evandwalle            lastDisconnected = source.lastDisconnected;
2106154b2cf6bbb99ee258b289846183172139a87dbavandwalle            lastConnectionFailure = source.lastConnectionFailure;
21078650c035609507340e3a66459cea16ef08cd03a6vandwalle            lastRoamingFailure = source.lastRoamingFailure;
21088650c035609507340e3a66459cea16ef08cd03a6vandwalle            lastRoamingFailureReason = source.lastRoamingFailureReason;
21098650c035609507340e3a66459cea16ef08cd03a6vandwalle            roamingFailureBlackListTimeMilli = source.roamingFailureBlackListTimeMilli;
2110154b2cf6bbb99ee258b289846183172139a87dbavandwalle            numScorerOverride = source.numScorerOverride;
2111154b2cf6bbb99ee258b289846183172139a87dbavandwalle            numScorerOverrideAndSwitchedNetwork = source.numScorerOverrideAndSwitchedNetwork;
21124eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            numAssociation = source.numAssociation;
21133e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber            userApproved = source.userApproved;
2114ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle            numNoInternetAccessReports = source.numNoInternetAccessReports;
21151248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti            noInternetAccessExpected = source.noInternetAccessExpected;
2116ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle            creationTime = source.creationTime;
2117ced1a6599042826a3bf678871d6b8a9e7187e973Pierre Vandwalle            updateTime = source.updateTime;
21186fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski            shared = source.shared;
2119446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne            recentFailure.setAssociationStatus(source.recentFailure.getAssociationStatus());
21206346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        }
21219e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff    }
21229e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
21246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    @Override
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int flags) {
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(networkId);
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(status);
21288d106780b6a638552749e54e169fc72537d4bcccxinhe        mNetworkSelectionStatus.writeToParcel(dest);
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(SSID);
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(BSSID);
2131a0be0fb2709124a567f89114b1d8e80f74452edcxinhe        dest.writeInt(apBand);
2132a0be0fb2709124a567f89114b1d8e80f74452edcxinhe        dest.writeInt(apChannel);
21338a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng        dest.writeString(FQDN);
2134b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande        dest.writeString(providerFriendlyName);
21351379fd0b1ef952547934846f4b6c40780f885e47Peter Qiu        dest.writeInt(isHomeProviderNetwork ? 1 : 0);
2136a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande        dest.writeInt(roamingConsortiumIds.length);
21377226c8f95b5971af2710c8d2f8a8b6f2210e2420Vinit Deshpande        for (long roamingConsortiumId : roamingConsortiumIds) {
2138b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande            dest.writeLong(roamingConsortiumId);
2139b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande        }
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(preSharedKey);
21419b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        for (String wepKey : wepKeys) {
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeString(wepKey);
21439b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        }
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(wepTxKeyIndex);
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(priority);
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(hiddenSSID ? 1 : 0);
21475f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng        dest.writeInt(requirePMF ? 1 : 0);
21485f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng        dest.writeString(updateIdentifier);
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedKeyManagement);
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedProtocols);
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedAuthAlgorithms);
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedPairwiseCiphers);
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeBitSet(dest, allowedGroupCiphers);
21554337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
21569b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff        dest.writeParcelable(enterpriseConfig, flags);
2157678979748585c5903125a404e448ad6c111dedadJaewan Kim
21586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        dest.writeParcelable(mIpConfiguration, flags);
21597c3606c103e95d3991267cca2592402a68779cafvandwalle        dest.writeString(dhcpServer);
21607c3606c103e95d3991267cca2592402a68779cafvandwalle        dest.writeString(defaultGwMacAddress);
2161e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle        dest.writeInt(selfAdded ? 1 : 0);
21628f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(didSelfAdd ? 1 : 0);
2163ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        dest.writeInt(validatedInternetAccess ? 1 : 0);
2164580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu        dest.writeInt(isLegacyPasspointConfig ? 1 : 0);
21658faf2a2a15853368a14babf935c156664b5f0b6cJeff Davidson        dest.writeInt(ephemeral ? 1 : 0);
2166f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin        dest.writeInt(meteredHint ? 1 : 0);
216743d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey        dest.writeInt(meteredOverride);
2168fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin        dest.writeInt(useExternalScores ? 1 : 0);
21698f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(creatorUid);
21708f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(lastConnectUid);
21718f13548615f647a1208ace5369b504cb41149965vandwalle        dest.writeInt(lastUpdateUid);
21723e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        dest.writeString(creatorName);
21733e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        dest.writeString(lastUpdateName);
2174154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeLong(lastConnectionFailure);
21758650c035609507340e3a66459cea16ef08cd03a6vandwalle        dest.writeLong(lastRoamingFailure);
21768650c035609507340e3a66459cea16ef08cd03a6vandwalle        dest.writeInt(lastRoamingFailureReason);
21778650c035609507340e3a66459cea16ef08cd03a6vandwalle        dest.writeLong(roamingFailureBlackListTimeMilli);
2178154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeInt(numScorerOverride);
2179154b2cf6bbb99ee258b289846183172139a87dbavandwalle        dest.writeInt(numScorerOverrideAndSwitchedNetwork);
21804eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        dest.writeInt(numAssociation);
21813e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber        dest.writeInt(userApproved);
2182ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle        dest.writeInt(numNoInternetAccessReports);
21831248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti        dest.writeInt(noInternetAccessExpected ? 1 : 0);
21846fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski        dest.writeInt(shared ? 1 : 0);
2185a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        dest.writeString(mPasspointManagementObjectTree);
2186446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne        dest.writeInt(recentFailure.getAssociationStatus());
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Implement the Parcelable interface {@hide} */
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<WifiConfiguration> CREATOR =
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Creator<WifiConfiguration>() {
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiConfiguration createFromParcel(Parcel in) {
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WifiConfiguration config = new WifiConfiguration();
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.networkId = in.readInt();
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.status = in.readInt();
21968d106780b6a638552749e54e169fc72537d4bcccxinhe                config.mNetworkSelectionStatus.readFromParcel(in);
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.SSID = in.readString();
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.BSSID = in.readString();
2199a0be0fb2709124a567f89114b1d8e80f74452edcxinhe                config.apBand = in.readInt();
2200a0be0fb2709124a567f89114b1d8e80f74452edcxinhe                config.apChannel = in.readInt();
22018a9eb81df1218884bf0c4cdb214d2f1ec0a5679cYuhao Zheng                config.FQDN = in.readString();
2202b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                config.providerFriendlyName = in.readString();
22031379fd0b1ef952547934846f4b6c40780f885e47Peter Qiu                config.isHomeProviderNetwork = in.readInt() != 0;
2204b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                int numRoamingConsortiumIds = in.readInt();
22057226c8f95b5971af2710c8d2f8a8b6f2210e2420Vinit Deshpande                config.roamingConsortiumIds = new long[numRoamingConsortiumIds];
2206b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                for (int i = 0; i < numRoamingConsortiumIds; i++) {
2207a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande                    config.roamingConsortiumIds[i] = in.readLong();
2208b21d2489c1bd330e39f4489c7f221ebb4dffc283Vinit Deshpande                }
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.preSharedKey = in.readString();
22109b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                for (int i = 0; i < config.wepKeys.length; i++) {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    config.wepKeys[i] = in.readString();
22129b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                }
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.wepTxKeyIndex = in.readInt();
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.priority = in.readInt();
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.hiddenSSID = in.readInt() != 0;
22165f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng                config.requirePMF = in.readInt() != 0;
22175f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng                config.updateIdentifier = in.readString();
22185f9385f7eaaacf854bfbe3268eefd3dd39dab05aYuhao Zheng
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedKeyManagement   = readBitSet(in);
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedProtocols       = readBitSet(in);
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedAuthAlgorithms  = readBitSet(in);
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedPairwiseCiphers = readBitSet(in);
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config.allowedGroupCiphers    = readBitSet(in);
22244337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang
22259b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff                config.enterpriseConfig = in.readParcelable(null);
22266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                config.mIpConfiguration = in.readParcelable(null);
22277c3606c103e95d3991267cca2592402a68779cafvandwalle                config.dhcpServer = in.readString();
22287c3606c103e95d3991267cca2592402a68779cafvandwalle                config.defaultGwMacAddress = in.readString();
2229e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle                config.selfAdded = in.readInt() != 0;
22308f13548615f647a1208ace5369b504cb41149965vandwalle                config.didSelfAdd = in.readInt() != 0;
2231ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle                config.validatedInternetAccess = in.readInt() != 0;
2232580a1bdfbc6a8c4ca25e796af234711184c13871Peter Qiu                config.isLegacyPasspointConfig = in.readInt() != 0;
22338faf2a2a15853368a14babf935c156664b5f0b6cJeff Davidson                config.ephemeral = in.readInt() != 0;
2234f0c9b8c68fd6f6deeab3d51a62a02f4ea17bdb98Jeremy Joslin                config.meteredHint = in.readInt() != 0;
223543d2a1700b6eb1d804924c6a1e5e0161a13a5348Jeff Sharkey                config.meteredOverride = in.readInt();
2236fc8601310d9af6e8ac16a118b16a1ae414e93900Jeremy Joslin                config.useExternalScores = in.readInt() != 0;
22378f13548615f647a1208ace5369b504cb41149965vandwalle                config.creatorUid = in.readInt();
22388f13548615f647a1208ace5369b504cb41149965vandwalle                config.lastConnectUid = in.readInt();
22398f13548615f647a1208ace5369b504cb41149965vandwalle                config.lastUpdateUid = in.readInt();
22403e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                config.creatorName = in.readString();
22413e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                config.lastUpdateName = in.readString();
2242154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.lastConnectionFailure = in.readLong();
22438650c035609507340e3a66459cea16ef08cd03a6vandwalle                config.lastRoamingFailure = in.readLong();
22448650c035609507340e3a66459cea16ef08cd03a6vandwalle                config.lastRoamingFailureReason = in.readInt();
22458650c035609507340e3a66459cea16ef08cd03a6vandwalle                config.roamingFailureBlackListTimeMilli = in.readLong();
2246154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.numScorerOverride = in.readInt();
2247154b2cf6bbb99ee258b289846183172139a87dbavandwalle                config.numScorerOverrideAndSwitchedNetwork = in.readInt();
22484eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle                config.numAssociation = in.readInt();
22493e3857c4f5d277c69bcb0ff3a581a176f3a84bf8Sky Faber                config.userApproved = in.readInt();
2250ec3e9805dd7c527f961d1f2a14e5752b461186cavandwalle                config.numNoInternetAccessReports = in.readInt();
22511248dd3c296a94457d5864b7f433335f32490b50Lorenzo Colitti                config.noInternetAccessExpected = in.readInt() != 0;
22526fb0756d2f59d70507919350f6192718b5d3f630Bartosz Fabianowski                config.shared = in.readInt() != 0;
2253a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande                config.mPasspointManagementObjectTree = in.readString();
2254446afac1590733f9545118fed5ae8e769368b8b2Glen Kuhne                config.recentFailure.setAssociationStatus(in.readInt());
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return config;
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public WifiConfiguration[] newArray(int size) {
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new WifiConfiguration[size];
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
2262aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2263aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    /**
2264aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * Serializes the object for backup
2265aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * @hide
2266aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     */
2267aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    public byte[] getBytesForBackup() throws IOException {
2268aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        ByteArrayOutputStream baos = new ByteArrayOutputStream();
2269aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        DataOutputStream out = new DataOutputStream(baos);
2270aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2271aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        out.writeInt(BACKUP_VERSION);
2272aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        BackupUtils.writeString(out, SSID);
2273aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        out.writeInt(apBand);
2274aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        out.writeInt(apChannel);
2275aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        BackupUtils.writeString(out, preSharedKey);
2276aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        out.writeInt(getAuthType());
2277aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        return baos.toByteArray();
2278aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    }
2279aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2280aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    /**
2281aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * Deserializes a byte array into the WiFiConfiguration Object
2282aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     * @hide
2283aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy     */
2284aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    public static WifiConfiguration getWifiConfigFromBackup(DataInputStream in) throws IOException,
2285aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy            BackupUtils.BadVersionException {
2286aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        WifiConfiguration config = new WifiConfiguration();
2287aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        int version = in.readInt();
2288aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        if (version < 1 || version > BACKUP_VERSION) {
2289aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy            throw new BackupUtils.BadVersionException("Unknown Backup Serialization Version");
2290aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        }
2291aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2292aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        if (version == 1) return null; // Version 1 is a bad dataset.
2293aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy
2294aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.SSID = BackupUtils.readString(in);
2295aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.apBand = in.readInt();
2296aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.apChannel = in.readInt();
2297aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.preSharedKey = BackupUtils.readString(in);
2298aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        config.allowedKeyManagement.set(in.readInt());
2299aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy        return config;
2300aeb4c0601330f5f30fe0026a714ff59f0fe90abfRitesh Reddy    }
2301b6cd6fa5a7314047409823ba48ff9e124ff53a70Glen Kuhne}
2302