WifiMetrics.java revision 5f001750a0ce82a8b3a47ac566117d4de27f3e23
11b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/*
21b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Copyright (C) 2016 The Android Open Source Project
31b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *
41b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Licensed under the Apache License, Version 2.0 (the "License");
51b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * you may not use this file except in compliance with the License.
61b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * You may obtain a copy of the License at
71b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *
81b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *      http://www.apache.org/licenses/LICENSE-2.0
91b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *
101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Unless required by applicable law or agreed to in writing, software
111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * distributed under the License is distributed on an "AS IS" BASIS,
121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * See the License for the specific language governing permissions and
141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * limitations under the License.
151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */
161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepackage com.android.server.wifi;
181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
194dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhneimport android.net.wifi.ScanResult;
202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhneimport android.net.wifi.WifiConfiguration;
211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport android.os.SystemClock;
221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport android.util.Base64;
23c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.Log;
24c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.SparseIntArray;
251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
26f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail;
27f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil;
28f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor;
301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter;
311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList;
321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar;
331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List;
341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/**
361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated.
371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include:
381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Aggregated connection stats (num of connections, num of failures, ...)
391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Discrete connection event stats (time, duration, failure codes, ...)
401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Router details (technology type, authentication type, ...)
411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Scan stats
421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */
431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics {
441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final String TAG = "WifiMetrics";
45c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final boolean DBG = false;
461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private final Object mLock = new Object();
472532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private static final int MAX_CONNECTION_EVENTS = 256;
48ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
49ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private boolean mScreenOn;
50ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private int mWifiState;
511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Metrics are stored within an instance of the WifiLog proto during runtime,
531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during
541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced
551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * together at dump-time
561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private final WifiMetricsProto.WifiLog mWifiLogProto;
581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Session information that gets logged for every Wifi connection attempt.
601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private final List<ConnectionEvent> mConnectionEventList;
621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The latest started (but un-ended) connection attempt
641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private ConnectionEvent mCurrentConnectionEvent;
661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode
681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
69c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private SparseIntArray mScanReturnEntries;
701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Mapping of system state to the counts of scans requested in that wifi state * screenOn
721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * combination. Indexed by WifiLog.WifiState * (1 + screenOn)
731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
74c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private SparseIntArray mWifiSystemStateEntries;
751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class RouterFingerPrint {
771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto;
782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        RouterFingerPrint() {
791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint();
801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType);
861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo);
871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mDtim=" + mRouterFingerPrintProto.dtim);
881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication);
891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mHidden=" + mRouterFingerPrintProto.hidden);
901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology);
911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6);
921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        public void updateFromWifiConfiguration(WifiConfiguration config) {
96ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            synchronized (mLock) {
97ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (config != null) {
98ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Is this a hidden network
99ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mRouterFingerPrintProto.hidden = config.hiddenSSID;
100ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Config may not have a valid dtimInterval set yet, in which case dtim will be zero
101ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // (These are only populated from beacon frame scan results, which are returned as
102ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // scan results from the chip far less frequently than Probe-responses)
103ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.dtimInterval > 0) {
104ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mRouterFingerPrintProto.dtim = config.dtimInterval;
105ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
106ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mCurrentConnectionEvent.mConfigSsid = config.SSID;
107ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Get AuthType information from config (We do this again from ScanResult after
108ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // associating with BSSID)
109ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.allowedKeyManagement != null
110ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                            && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
111ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
112ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
113ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else if (config.isEnterprise()) {
114ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
115ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
116ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else {
117ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
118ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
119ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
120ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // If there's a ScanResult candidate associated with this config already, get it and
121ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // log (more accurate) metrics from it
122ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
123ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (candidate != null) {
124ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        updateMetricsFromScanResult(candidate);
125ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
12696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
1272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
1282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
1291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
1301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
1311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Log event, tracking the start time, end time and result of a wireless connection attempt.
1331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class ConnectionEvent {
1351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        WifiMetricsProto.ConnectionEvent mConnectionEvent;
13696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field
13796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //covering more than just l2 failures. see b/27652362
13896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        /**
13996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot
14096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * more failures than just l2 though, since the proto does not have a place to log
14196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * framework failures)
14296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         */
1432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // Failure is unknown
14496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_UNKNOWN = 0;
1452532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NONE
14696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NONE = 1;
1472532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // ASSOCIATION_REJECTION_EVENT
14896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ASSOCIATION_REJECTION = 2;
1492532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // AUTHENTICATION_FAILURE_EVENT
15096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_AUTHENTICATION_FAILURE = 3;
1512532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // SSID_TEMP_DISABLED (Also Auth failure)
15296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_SSID_TEMP_DISABLED = 4;
1534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // reconnect() or reassociate() call to WifiNative failed
15496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_CONNECT_NETWORK_FAILED = 5;
1552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NETWORK_DISCONNECTION_EVENT
15696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NETWORK_DISCONNECTION = 6;
1574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // NEW_CONNECTION_ATTEMPT before previous finished
15896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7;
15996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // New connection attempt to the same network & bssid
16096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8;
16196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // Roam Watchdog timer triggered (Roaming timed out)
16296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ROAM_TIMEOUT = 9;
16396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // DHCP failure
16496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_DHCP = 10;
16596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne
1664dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        RouterFingerPrint mRouterFingerPrint;
1674dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealStartTime;
1684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealEndTime;
1694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigSsid;
1704dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigBssid;
171ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private int mWifiState;
172ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private boolean mScreenOn;
1732532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
1741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private ConnectionEvent() {
1751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mConnectionEvent = new WifiMetricsProto.ConnectionEvent();
176947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealEndTime = 0;
177947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealStartTime = 0;
1782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mRouterFingerPrint = new RouterFingerPrint();
1792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto;
1804dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigSsid = "<NULL>";
1814dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigBssid = "<NULL>";
182ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN;
183ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = false;
1841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
1851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
1861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
1871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
1881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            sb.append("startTime=");
1891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            Calendar c = Calendar.getInstance();
1901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
1911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                c.setTimeInMillis(mConnectionEvent.startTimeMillis);
1921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.startTimeMillis == 0 ? "            <null>" :
1931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
1944dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", SSID=");
1954dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigSsid);
1964dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", BSSID=");
1974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigBssid);
1984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", durationMillis=");
1991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.durationTakenToConnectMillis);
2002532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                sb.append(", roamType=");
2014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.roamType) {
2022532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 1:
2032532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_NONE");
2042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 2:
2062532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_DBDC");
2072532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2082532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 3:
2092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_ENTERPRISE");
2102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2112532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 4:
2122532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_USER_SELECTED");
2132532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2142532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 5:
2152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNRELATED");
2162532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2172532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    default:
2182532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNKNOWN");
2192532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                }
2204dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", connectionResult=");
2214dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.connectionResult);
2221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", level2FailureCode=");
2234dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.level2FailureCode) {
22496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NONE:
2254dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
2264dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
22796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ASSOCIATION_REJECTION:
2284dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("ASSOCIATION_REJECTION");
2294dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
23096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_AUTHENTICATION_FAILURE:
2314dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("AUTHENTICATION_FAILURE");
2324dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
23396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_SSID_TEMP_DISABLED:
2344dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("SSID_TEMP_DISABLED");
2354dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
23696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_CONNECT_NETWORK_FAILED:
2374dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("CONNECT_NETWORK_FAILED");
2384dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
23996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NETWORK_DISCONNECTION:
2404dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NETWORK_DISCONNECTION");
2414dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
24296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NEW_CONNECTION_ATTEMPT:
2434dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NEW_CONNECTION_ATTEMPT");
2444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
24596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_REDUNDANT_CONNECTION_ATTEMPT:
24696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("REDUNDANT_CONNECTION_ATTEMPT");
24796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
24896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ROAM_TIMEOUT:
24996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("ROAM_TIMEOUT");
25096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
25196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_DHCP:
25296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("DHCP");
2534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
2544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
2554dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
2571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", connectivityLevelFailureCode=");
2584dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.connectivityLevelFailureCode) {
2594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NONE:
2604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
2614dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2624dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_DHCP:
2634dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("DHCP");
2644dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2654dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET:
2664dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NO_INTERNET");
2674dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED:
2694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNWANTED");
2704dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
2724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
2734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
2754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", signalStrength=");
2764dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.signalStrength);
277ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", wifiState=");
278ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                switch(mWifiState) {
279ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISABLED:
280ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISABLED");
281ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
282ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
283ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISCONNECTED");
284ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
285ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
286ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_ASSOCIATED");
287ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
288ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    default:
289ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_UNKNOWN");
290ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
291ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                }
292ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", screenOn=");
293ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(mScreenOn);
294ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(". mRouterFingerprint: ");
2951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mRouterFingerPrint.toString());
2961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
2971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
2981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
3011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public WifiMetrics() {
3021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiLogProto = new WifiMetricsProto.WifiLog();
3031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mConnectionEventList = new ArrayList<>();
304c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        mScanReturnEntries = new SparseIntArray();
305c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        mWifiSystemStateEntries = new SparseIntArray();
3061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mCurrentConnectionEvent = null;
307ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mScreenOn = true;
308ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED;
3091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
311c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    // Values used for indexing SystemStateEntries
312c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_ON = 1;
313c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_OFF = 0;
314c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
3151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
3161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Create a new connection event. Call when wifi attempts to make a new network connection
3171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity
3181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * failure code.
3191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Gathers and sets the RouterFingerPrint data as well
3201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
321947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne     * @param config WifiConfiguration of the config used for the current connection attempt
3221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X
3231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
32496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne    public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) {
3251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
32696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            // Check if this is overlapping another current connection event
32796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            if (mCurrentConnectionEvent != null) {
32896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                //Is this new Connection Event the same as the current one
32996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                if (mCurrentConnectionEvent.mConfigSsid != null
33096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigBssid != null
33196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && config != null
33296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID)
33396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && (mCurrentConnectionEvent.mConfigBssid.equals("any")
33496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) {
33596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    mCurrentConnectionEvent.mConfigBssid = targetBSSID;
33696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to the same network
33796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT,
33896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
33996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                } else {
34096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to different network
34196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT,
34296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
34396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
34496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            }
34596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            //If past maximum connection events, start removing the oldest
3464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) {
3474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                mConnectionEventList.remove(0);
3484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            }
3494dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent = new ConnectionEvent();
3504dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.startTimeMillis =
3514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    System.currentTimeMillis();
35296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = targetBSSID;
3534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
3544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config);
35596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = "any";
3564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mRealStartTime = SystemClock.elapsedRealtime();
357ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mWifiState = mWifiState;
358ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mScreenOn = mScreenOn;
3594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConnectionEventList.add(mCurrentConnectionEvent);
3601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
3611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
3631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
3642532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * set the RoamType of the current ConnectionEvent (if any)
3652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
3662532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    public void setConnectionEventRoamType(int roamType) {
367ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
368ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null) {
369ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
370ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            }
3712532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
3722532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
373f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
374f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    /**
375f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Set AP related metrics from ScanDetail
376f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
377f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void setConnectionScanDetail(ScanDetail scanDetail) {
378ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
379ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null && scanDetail != null) {
380ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
381ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
382ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //Ensure that we have a networkDetail, and that it corresponds to the currently
383ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //tracked connection attempt
384ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (networkDetail != null && scanResult != null
385ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid != null
386ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid
387ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        .equals("\"" + networkDetail.getSSID() + "\"")) {
388ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromNetworkDetail(networkDetail);
389ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromScanResult(scanResult);
390ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                }
391f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne            }
392f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        }
393f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
394f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
3952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
3961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * End a Connection event record. Call when wifi connection attempt succeeds or fails.
3971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If a Connection event has not been started and is active when .end is called, a new one is
3981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * created with zero duration.
3991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
4001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param level2FailureCode Level 2 failure code returned by supplicant
4011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X
4021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
4031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) {
4041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
4052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
4062532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                boolean result = (level2FailureCode == 1)
4072532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE);
4082532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0;
4092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mRealEndTime = SystemClock.elapsedRealtime();
4102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int)
4112532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        (mCurrentConnectionEvent.mRealEndTime
4122532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        - mCurrentConnectionEvent.mRealStartTime);
4132532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode;
4142532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode =
4152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        connectivityFailureCode;
416f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                // ConnectionEvent already added to ConnectionEvents List. Safe to null current here
4172532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent = null;
4181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
4191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
4222b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
4232b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail
4242b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
4252b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) {
4262b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int dtimInterval = networkDetail.getDtimInterval();
4272b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (dtimInterval > 0) {
4282b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim =
4292b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                    dtimInterval;
4302b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
4312b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int connectionWifiMode;
4322b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        switch (networkDetail.getWifiMode()) {
4332b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_UNDEFINED:
4342b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN;
4352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11A:
4372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A;
4382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11B:
4402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B;
4412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11G:
4432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G;
4442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11N:
4462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N;
4472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11AC  :
4492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC;
4502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            default:
4522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER;
4532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
4552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
4562b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                .routerTechnology = connectionWifiMode;
4572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
4582b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
4592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
4602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent RSSI and authentication type from ScanResult
4612b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
4622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromScanResult(ScanResult scanResult) {
4632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level;
4642b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
4652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
46696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID;
4672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (scanResult.capabilities != null) {
4682b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            if (scanResult.capabilities.contains("WEP")) {
4692b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
4702b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
4712b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            } else if (scanResult.capabilities.contains("PSK")) {
4722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
4732b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
4742b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            } else if (scanResult.capabilities.contains("EAP")) {
4752b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
4762b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
4772b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            }
4782b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
47996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo =
48096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                scanResult.frequency;
4812b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
4822b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
4831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumSavedNetworks(int num) {
4841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
4851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numSavedNetworks = num;
4861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
4891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumOpenNetworks(int num) {
4901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
4911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numOpenNetworks = num;
4921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
4951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumPersonalNetworks(int num) {
4961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
4971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numPersonalNetworks = num;
4981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumEnterpriseNetworks(int num) {
5021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numEnterpriseNetworks = num;
5041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumNetworksAddedByUser(int num) {
5081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNetworksAddedByUser = num;
5101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumNetworksAddedByApps(int num) {
5141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNetworksAddedByApps = num;
5161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsLocationEnabled(boolean enabled) {
5201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isLocationEnabled = enabled;
5221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsScanningAlwaysEnabled(boolean enabled) {
5261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isScanningAlwaysEnabled = enabled;
5281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
5321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Non Empty Scan Results count
5331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
5341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementNonEmptyScanResultCount() {
535c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount");
5361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNonEmptyScanResults++;
5381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
5421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Empty Scan Results count
5431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
5441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementEmptyScanResultCount() {
545c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementEmptyScanResultCount");
5461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numEmptyScanResults++;
5481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
552c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Increment background scan count
553c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
554c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementBackgroundScanCount() {
555c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementBackgroundScanCount");
556c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
557c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numBackgroundScans++;
558c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
559c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
560c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
561c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne   /**
562c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get Background scan count
563c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
564c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getBackgroundScanCount() {
565c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
566c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numBackgroundScans;
567c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
568c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
569c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
570c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
57170ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne     * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry
572c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
573c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementOneshotScanCount() {
574c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
575c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numOneshotScans++;
576c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
57770ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne        incrementWifiSystemScanStateCount(mWifiState, mScreenOn);
578c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
579c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
580c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
581c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get oneshot scan count
582c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
583c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getOneshotScanCount() {
584c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
585c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numOneshotScans;
586c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
588c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
589c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String returnCodeToString(int scanReturnCode) {
590c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(scanReturnCode){
591c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_UNKNOWN:
592c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_UNKNOWN";
593c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_SUCCESS:
594c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_SUCCESS";
595c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED:
596c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INTERRUPTED";
597c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION:
598c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INVALID_CONFIGURATION";
599c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED:
600c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "FAILURE_WIFI_DISABLED";
601c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
602c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "<UNKNOWN>";
603c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
604c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
605c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
606c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
6071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment count of scan return code occurrence
6081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
6091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X
6101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
611c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) {
6121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
613c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode));
614c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mScanReturnEntries.get(scanReturnCode);
615c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry += countToAdd;
6161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mScanReturnEntries.put(scanReturnCode, entry);
6171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
619c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
620c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this scanReturnCode
621c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * @param scanReturnCode that we are getting the count for
622c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
623c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getScanReturnEntry(int scanReturnCode) {
624c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
625c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mScanReturnEntries.get(scanReturnCode);
626c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
627c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
628c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
629c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String wifiSystemStateToString(int state) {
630c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(state){
631c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_UNKNOWN:
632c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_UNKNOWN";
633c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISABLED:
634c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISABLED";
635c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
636c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISCONNECTED";
637c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
638c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_ASSOCIATED";
639c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
640c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "default";
641c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
642c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
6431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
6451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off
6461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
6471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X
6481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param screenOn Is the screen on
6491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
6501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementWifiSystemScanStateCount(int state, boolean screenOn) {
6511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
652c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) {
653c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state)
654c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + " " + screenOn);
6551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
656c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF);
657c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mWifiSystemStateEntries.get(index);
658c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry++;
659c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiSystemStateEntries.put(index, entry);
660c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
661c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
662c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
663c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
664c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this system State Entry
665c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
666c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getSystemStateCount(int state, boolean screenOn) {
667c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
668c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF);
669c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiSystemStateEntries.get(index);
6701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
673ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
6745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack
6755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
6765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggers() {
6775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
6785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggers++;
6795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
6805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
6815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
6825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad association threshold when watchdog triggered
6835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
6845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) {
6855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
6865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count;
6875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
6885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
6895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
6905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad authentication threshold when watchdog triggered
6915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
6925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) {
6935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
6945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count;
6955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
6965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
6975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
6985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad dhcp threshold when watchdog triggered
6995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) {
7015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count;
7035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad other threshold when watchdog triggered
7075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) {
7095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count;
7115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks seen when watchdog triggered
7155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) {
7175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count;
7195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad association network
7235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAssociation() {
7255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++;
7275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad authentication network
7315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() {
7335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++;
7355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad dhcp network
7395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadDhcp() {
7415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++;
7435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad other network
7475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadOther() {
7495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++;
7515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
7545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
755ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed pno is working
756ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
757ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoGood() {
758ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
759ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoGood++;
760ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
761ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
762ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
763ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found pno not working
764ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
765ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoBad() {
766ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
767ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoBad++;
768ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
769ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
770ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
771ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed background scan is working
772ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
773ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundGood() {
774ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
775ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundGood++;
776ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
777ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
778ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
779ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found background scan not working
780ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
781ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundBad() {
782ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
783ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundBad++;
784ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
785ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
786ce003b812aead64dcb36647180991150021b24c1Glen Kuhne
78711638f348ba45f9f417928e79b81186cef76c561Glen Kuhne    public static final String PROTO_DUMP_ARG = "wifiMetricsProto";
7881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
7891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager
7901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * at this time
7911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
7921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param fd unused
7931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param pw PrintWriter for writing dump to
7941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param args unused
7951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
7961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
7971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            pw.println("WifiMetrics:");
79911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne            if (args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) {
8001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                //Dump serialized WifiLog proto
8011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                consolidateProto(true);
8021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
8031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (mCurrentConnectionEvent != event) {
8041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //indicate that automatic bug report has been taken for all valid
8051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //connection events
8061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
8071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
8081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
8091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto);
8101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT);
8111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println(metricsProtoDump);
8121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("EndWifiMetrics");
8132532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                clear();
8141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            } else {
8151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mConnectionEvents:");
8161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
8171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    String eventLine = event.toString();
8181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (event == mCurrentConnectionEvent) {
8191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        eventLine += "CURRENTLY OPEN EVENT";
8201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
8211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    pw.println(eventLine);
8221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
8231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks);
8241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks);
8251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworks="
8261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numPersonalNetworks);
8271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworks="
8281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworks);
8291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled);
8301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isScanningAlwaysEnabled="
8311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.isScanningAlwaysEnabled);
832c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByUser="
833c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByUser);
834c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByApps="
835c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByApps);
836c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNonEmptyScanResults="
837c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNonEmptyScanResults);
838c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numEmptyScanResults="
839c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numEmptyScanResults);
840c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numOneshotScans="
841c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numOneshotScans);
842c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numBackgroundScans="
843c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numBackgroundScans);
844c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
845c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mScanReturnEntries:");
846c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_UNKNOWN: " + getScanReturnEntry(
847c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_UNKNOWN));
848c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_SUCCESS: " + getScanReturnEntry(
849c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_SUCCESS));
850c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry(
851c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED));
852c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry(
853c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION));
854c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  FAILURE_WIFI_DISABLED: " + getScanReturnEntry(
855c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED));
856c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
857c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>");
858c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN       ON: "
859c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true));
860c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED      ON: "
861c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true));
862c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED  ON: "
863c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true));
864c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED    ON: "
865c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true));
866c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN      OFF: "
867c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false));
868c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED     OFF: "
869c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false));
870c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED OFF: "
871c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false));
872c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED   OFF: "
873c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false));
874ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood="
875ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoGood);
876ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad="
877ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoBad);
878ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood="
879ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundGood);
880ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad="
881ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundBad);
8825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggers="
8835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggers);
8845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal="
8855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal);
8865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal="
8875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal);
8885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal="
8895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal);
8905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal="
8915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal);
8925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal="
8935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal);
8945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation="
8955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation);
8965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication="
8975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication);
8985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp="
8995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp);
9005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther="
9015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther);
9021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
9031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
9041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
9051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
9061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
907c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their
908c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * respective lists within mWifiLogProto
9091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
9101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param incremental Only include ConnectionEvents created since last automatic bug report
9111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
9121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private void consolidateProto(boolean incremental) {
9131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>();
9141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
9151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            for (ConnectionEvent event : mConnectionEventList) {
916c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // If this is not incremental, dump full ConnectionEvent list
917c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // Else Dump all un-dumped events except for the current one
9181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                if (!incremental || ((mCurrentConnectionEvent != event)
9191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        && !event.mConnectionEvent.automaticBugReportTaken)) {
9201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //Get all ConnectionEvents that haven not been dumped as a proto, also exclude
9211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //the current active un-ended connection event
9221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    events.add(event.mConnectionEvent);
923c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    if (incremental) {
924c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
925c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    }
9261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
9271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
9281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            if (events.size() > 0) {
9291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent);
9301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
931c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
932c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list
933c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.scanReturnEntries =
934c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()];
935c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mScanReturnEntries.size(); i++) {
936c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry();
937c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i);
938c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i);
939c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
940c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
941c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list
942c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // This one is slightly more complex, as the Sparse are indexed with:
943c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //     key: wifiState * 2 + isScreenOn, value: wifiStateCount
944c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.wifiSystemStateEntries =
945c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog
946c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    .WifiSystemStateEntry[mWifiSystemStateEntries.size()];
947c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mWifiSystemStateEntries.size(); i++) {
948c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i] =
949c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        new WifiMetricsProto.WifiLog.WifiSystemStateEntry();
950c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiState =
951c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.keyAt(i) / 2;
952c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount =
953c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.valueAt(i);
954c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].isScreenOn =
955c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        (mWifiSystemStateEntries.keyAt(i) % 2) > 0;
956c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
9571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
9581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
9591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
9601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
9611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Serializes all of WifiMetrics to WifiLog proto, and returns the byte array.
9621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Does not count as taking an automatic bug report
9631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
9641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @return byte array of the deserialized & consolidated Proto
9651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
9661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public byte[] toByteArray() {
967ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
968ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            consolidateProto(false);
969ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            return mWifiLogProto.toByteArray(mWifiLogProto);
970ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        }
9711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
9722532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
9732532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
9742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * Clear all WifiMetrics, except for currentConnectionEvent.
9752532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
9762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private void clear() {
9772532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        synchronized (mLock) {
9782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEventList.clear();
9792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
9802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mConnectionEventList.add(mCurrentConnectionEvent);
9812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
9822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mScanReturnEntries.clear();
9832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiSystemStateEntries.clear();
9842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiLogProto.clear();
9852532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
9862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
987ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
988ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
989ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set screen state (On/Off)
990ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
991ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setScreenState(boolean screenOn) {
992ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
993ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = screenOn;
994ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
995ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
996ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
997ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
998ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED)
999ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
1000ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setWifiState(int wifiState) {
1001ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
1002ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = wifiState;
1003ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
1004ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
10051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne}
1006