WifiMetrics.java revision 59f9a74676831ba4634b35d56a1e2bbe9bf4e322
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.util.Base64;
22c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.Log;
23c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.SparseIntArray;
241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
25f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail;
26f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil;
2759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport com.android.server.wifi.util.ScanResultUtil;
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;
467a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
477a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL
487a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
497a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MAX_RSSI_POLL = 0;
507a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MIN_RSSI_POLL = -127;
511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private final Object mLock = new Object();
522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private static final int MAX_CONNECTION_EVENTS = 256;
53107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private Clock mClock;
54ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private boolean mScreenOn;
55ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private int mWifiState;
561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Metrics are stored within an instance of the WifiLog proto during runtime,
581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during
591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced
601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * together at dump-time
611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
627a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog();
631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Session information that gets logged for every Wifi connection attempt.
651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
667a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>();
671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The latest started (but un-ended) connection attempt
691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private ConnectionEvent mCurrentConnectionEvent;
711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode
731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
747a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mScanReturnEntries = new SparseIntArray();
751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Mapping of system state to the counts of scans requested in that wifi state * screenOn
771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * combination. Indexed by WifiLog.WifiState * (1 + screenOn)
781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray();
80f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of RSSI values to counts. */
81f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mRssiPollCounts = new SparseIntArray();
82f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of alert reason to the respective alert count. */
83f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray();
84107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    /**
85107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data
86107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * capture for for this WifiMetricsProto
87107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     */
88107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private long mRecordStartTimeSec;
891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class RouterFingerPrint {
911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto;
922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        RouterFingerPrint() {
931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint();
941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType);
1001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo);
1011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mDtim=" + mRouterFingerPrintProto.dtim);
1021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication);
1031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mHidden=" + mRouterFingerPrintProto.hidden);
1041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology);
1051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6);
1061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
1071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
1081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
1092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        public void updateFromWifiConfiguration(WifiConfiguration config) {
110ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            synchronized (mLock) {
111ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (config != null) {
112ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Is this a hidden network
113ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mRouterFingerPrintProto.hidden = config.hiddenSSID;
114ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Config may not have a valid dtimInterval set yet, in which case dtim will be zero
115ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // (These are only populated from beacon frame scan results, which are returned as
116ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // scan results from the chip far less frequently than Probe-responses)
117ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.dtimInterval > 0) {
118ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mRouterFingerPrintProto.dtim = config.dtimInterval;
119ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
120ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mCurrentConnectionEvent.mConfigSsid = config.SSID;
121ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Get AuthType information from config (We do this again from ScanResult after
122ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // associating with BSSID)
123ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.allowedKeyManagement != null
124ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                            && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
125ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
126ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
127ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else if (config.isEnterprise()) {
128ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
129ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
130ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else {
131ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
132ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
133ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
13459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
13559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                            .passpoint = config.isPasspoint();
136ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // If there's a ScanResult candidate associated with this config already, get it and
137ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // log (more accurate) metrics from it
138ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
139ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (candidate != null) {
140ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        updateMetricsFromScanResult(candidate);
141ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
14296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
1432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
1442532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
1451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
1461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
1471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Log event, tracking the start time, end time and result of a wireless connection attempt.
1491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class ConnectionEvent {
1511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        WifiMetricsProto.ConnectionEvent mConnectionEvent;
15296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field
15396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //covering more than just l2 failures. see b/27652362
15496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        /**
15596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot
15696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * more failures than just l2 though, since the proto does not have a place to log
15796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * framework failures)
15896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         */
1592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // Failure is unknown
16096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_UNKNOWN = 0;
1612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NONE
16296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NONE = 1;
1632532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // ASSOCIATION_REJECTION_EVENT
16496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ASSOCIATION_REJECTION = 2;
1652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // AUTHENTICATION_FAILURE_EVENT
16696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_AUTHENTICATION_FAILURE = 3;
1672532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // SSID_TEMP_DISABLED (Also Auth failure)
16896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_SSID_TEMP_DISABLED = 4;
1694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // reconnect() or reassociate() call to WifiNative failed
17096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_CONNECT_NETWORK_FAILED = 5;
1712532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NETWORK_DISCONNECTION_EVENT
17296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NETWORK_DISCONNECTION = 6;
1734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // NEW_CONNECTION_ATTEMPT before previous finished
17496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7;
17596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // New connection attempt to the same network & bssid
17696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8;
17796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // Roam Watchdog timer triggered (Roaming timed out)
17896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ROAM_TIMEOUT = 9;
17996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // DHCP failure
18096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_DHCP = 10;
18196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne
1824dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        RouterFingerPrint mRouterFingerPrint;
1834dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealStartTime;
1844dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealEndTime;
1854dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigSsid;
1864dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigBssid;
187ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private int mWifiState;
188ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private boolean mScreenOn;
1892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
1901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private ConnectionEvent() {
1911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mConnectionEvent = new WifiMetricsProto.ConnectionEvent();
192947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealEndTime = 0;
193947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealStartTime = 0;
1942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mRouterFingerPrint = new RouterFingerPrint();
1952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto;
1964dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigSsid = "<NULL>";
1974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigBssid = "<NULL>";
198ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN;
199ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = false;
2001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
2031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
2041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            sb.append("startTime=");
2051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            Calendar c = Calendar.getInstance();
2061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
2071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                c.setTimeInMillis(mConnectionEvent.startTimeMillis);
2081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.startTimeMillis == 0 ? "            <null>" :
2091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
2104dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", SSID=");
2114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigSsid);
2124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", BSSID=");
2134dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigBssid);
2144dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", durationMillis=");
2151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.durationTakenToConnectMillis);
2162532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                sb.append(", roamType=");
2174dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.roamType) {
2182532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 1:
2192532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_NONE");
2202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2212532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 2:
2222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_DBDC");
2232532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 3:
2252532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_ENTERPRISE");
2262532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 4:
2282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_USER_SELECTED");
2292532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2302532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 5:
2312532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNRELATED");
2322532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2332532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    default:
2342532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNKNOWN");
2352532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                }
2364dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", connectionResult=");
2374dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.connectionResult);
2381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", level2FailureCode=");
2394dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.level2FailureCode) {
24096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NONE:
2414dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
2424dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
24396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ASSOCIATION_REJECTION:
2444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("ASSOCIATION_REJECTION");
2454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
24696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_AUTHENTICATION_FAILURE:
2474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("AUTHENTICATION_FAILURE");
2484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
24996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_SSID_TEMP_DISABLED:
2504dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("SSID_TEMP_DISABLED");
2514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
25296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_CONNECT_NETWORK_FAILED:
2534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("CONNECT_NETWORK_FAILED");
2544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
25596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NETWORK_DISCONNECTION:
2564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NETWORK_DISCONNECTION");
2574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
25896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NEW_CONNECTION_ATTEMPT:
2594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NEW_CONNECTION_ATTEMPT");
2604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
26196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_REDUNDANT_CONNECTION_ATTEMPT:
26296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("REDUNDANT_CONNECTION_ATTEMPT");
26396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
26496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ROAM_TIMEOUT:
26596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("ROAM_TIMEOUT");
26696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
26796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_DHCP:
26896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("DHCP");
2694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
2704dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
2714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
2731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", connectivityLevelFailureCode=");
2744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.connectivityLevelFailureCode) {
2754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NONE:
2764dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
2774dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2784dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_DHCP:
2794dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("DHCP");
2804dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2814dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET:
2824dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NO_INTERNET");
2834dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2844dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED:
2854dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNWANTED");
2864dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2874dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
2884dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
2894dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
2904dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
2914dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", signalStrength=");
2924dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.signalStrength);
293ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", wifiState=");
294ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                switch(mWifiState) {
295ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISABLED:
296ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISABLED");
297ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
298ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
299ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISCONNECTED");
300ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
301ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
302ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_ASSOCIATED");
303ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
304ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    default:
305ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_UNKNOWN");
306ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
307ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                }
308ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", screenOn=");
309ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(mScreenOn);
310ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(". mRouterFingerprint: ");
3111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mRouterFingerPrint.toString());
3121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
3131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
3141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
3151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
317107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    public WifiMetrics(Clock clock) {
318107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mClock = clock;
3191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mCurrentConnectionEvent = null;
320ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mScreenOn = true;
321ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED;
322107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
3231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
325c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    // Values used for indexing SystemStateEntries
326c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_ON = 1;
327c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_OFF = 0;
328c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
3291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
3301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Create a new connection event. Call when wifi attempts to make a new network connection
3311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity
3321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * failure code.
3331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Gathers and sets the RouterFingerPrint data as well
3341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
335947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne     * @param config WifiConfiguration of the config used for the current connection attempt
3361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X
3371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
33896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne    public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) {
3391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
34096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            // Check if this is overlapping another current connection event
34196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            if (mCurrentConnectionEvent != null) {
34296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                //Is this new Connection Event the same as the current one
34396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                if (mCurrentConnectionEvent.mConfigSsid != null
34496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigBssid != null
34596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && config != null
34696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID)
34796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && (mCurrentConnectionEvent.mConfigBssid.equals("any")
34896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) {
34996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    mCurrentConnectionEvent.mConfigBssid = targetBSSID;
35096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to the same network
35196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT,
35296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
35396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                } else {
35496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to different network
35596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT,
35696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
35796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
35896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            }
35996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            //If past maximum connection events, start removing the oldest
3604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) {
3614dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                mConnectionEventList.remove(0);
3624dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            }
3634dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent = new ConnectionEvent();
3644dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.startTimeMillis =
365107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    mClock.getWallClockMillis();
36696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = targetBSSID;
3674dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
3684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config);
36996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = "any";
370107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis();
371ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mWifiState = mWifiState;
372ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mScreenOn = mScreenOn;
3734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConnectionEventList.add(mCurrentConnectionEvent);
3741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
3751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
3771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
3782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * set the RoamType of the current ConnectionEvent (if any)
3792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
3802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    public void setConnectionEventRoamType(int roamType) {
381ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
382ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null) {
383ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
384ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            }
3852532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
3862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
387f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
388f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    /**
389f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Set AP related metrics from ScanDetail
390f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
391f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void setConnectionScanDetail(ScanDetail scanDetail) {
392ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
393ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null && scanDetail != null) {
394ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
395ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
396ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //Ensure that we have a networkDetail, and that it corresponds to the currently
397ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //tracked connection attempt
398ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (networkDetail != null && scanResult != null
399ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid != null
400ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid
401ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        .equals("\"" + networkDetail.getSSID() + "\"")) {
402ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromNetworkDetail(networkDetail);
403ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromScanResult(scanResult);
404ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                }
405f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne            }
406f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        }
407f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
408f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
4092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
4101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * End a Connection event record. Call when wifi connection attempt succeeds or fails.
4111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If a Connection event has not been started and is active when .end is called, a new one is
4121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * created with zero duration.
4131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
4141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param level2FailureCode Level 2 failure code returned by supplicant
4151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X
4161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
4171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) {
4181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
4192532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
4202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                boolean result = (level2FailureCode == 1)
4212532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE);
4222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0;
423107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis();
4242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int)
4252532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        (mCurrentConnectionEvent.mRealEndTime
4262532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        - mCurrentConnectionEvent.mRealStartTime);
4272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode;
4282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode =
4292532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        connectivityFailureCode;
430f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                // ConnectionEvent already added to ConnectionEvents List. Safe to null current here
4312532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent = null;
4321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
4331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
4362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
4372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail
4382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
4392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) {
4402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int dtimInterval = networkDetail.getDtimInterval();
4412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (dtimInterval > 0) {
4422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim =
4432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                    dtimInterval;
4442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
4452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int connectionWifiMode;
4462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        switch (networkDetail.getWifiMode()) {
4472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_UNDEFINED:
4482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN;
4492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11A:
4512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A;
4522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11B:
4542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B;
4552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4562b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11G:
4572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G;
4582b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11N:
4602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N;
4612b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11AC  :
4632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC;
4642b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            default:
4662b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER;
4672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
4682b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
4692b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
4702b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                .routerTechnology = connectionWifiMode;
4712b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
4722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
4732b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
4742b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent RSSI and authentication type from ScanResult
4752b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
4762b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromScanResult(ScanResult scanResult) {
4772b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level;
4782b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
4792b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
48096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID;
4812b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (scanResult.capabilities != null) {
48259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
4832b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
4842b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
48559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) {
4862b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
4872b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
48859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
4892b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
4902b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
4912b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            }
4922b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
49396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo =
49496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                scanResult.frequency;
4952b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
4962b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
4971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumSavedNetworks(int num) {
4981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
4991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numSavedNetworks = num;
5001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumOpenNetworks(int num) {
5041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numOpenNetworks = num;
5061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumPersonalNetworks(int num) {
5101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numPersonalNetworks = num;
5121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumEnterpriseNetworks(int num) {
5161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numEnterpriseNetworks = num;
5181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
52159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    void setNumHiddenNetworks(int num) {
52259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        synchronized (mLock) {
52359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHiddenNetworks = num;
52459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
52559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    }
52659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
52759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    void setNumPasspointNetworks(int num) {
52859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        synchronized (mLock) {
52959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numPasspointNetworks = num;
53059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
53159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    }
53259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
5331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumNetworksAddedByUser(int num) {
5341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNetworksAddedByUser = num;
5361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setNumNetworksAddedByApps(int num) {
5401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNetworksAddedByApps = num;
5421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsLocationEnabled(boolean enabled) {
5461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isLocationEnabled = enabled;
5481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsScanningAlwaysEnabled(boolean enabled) {
5521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isScanningAlwaysEnabled = enabled;
5541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
5581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Non Empty Scan Results count
5591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
5601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementNonEmptyScanResultCount() {
561c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount");
5621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNonEmptyScanResults++;
5641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
5681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Empty Scan Results count
5691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
5701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementEmptyScanResultCount() {
571c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementEmptyScanResultCount");
5721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numEmptyScanResults++;
5741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
578c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Increment background scan count
579c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
580c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementBackgroundScanCount() {
581c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementBackgroundScanCount");
582c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
583c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numBackgroundScans++;
584c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
585c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
586c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne   /**
588c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get Background scan count
589c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
590c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getBackgroundScanCount() {
591c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
592c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numBackgroundScans;
593c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
594c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
595c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
596c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
59770ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne     * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry
598c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
599c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementOneshotScanCount() {
600c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
601c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numOneshotScans++;
602c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
60370ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne        incrementWifiSystemScanStateCount(mWifiState, mScreenOn);
604c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
605c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
606c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
607c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get oneshot scan count
608c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
609c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getOneshotScanCount() {
610c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
611c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numOneshotScans;
612c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
613c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
614c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
615c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String returnCodeToString(int scanReturnCode) {
616c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(scanReturnCode){
617c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_UNKNOWN:
618c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_UNKNOWN";
619c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_SUCCESS:
620c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_SUCCESS";
621c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED:
622c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INTERRUPTED";
623c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION:
624c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INVALID_CONFIGURATION";
625c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED:
626c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "FAILURE_WIFI_DISABLED";
627c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
628c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "<UNKNOWN>";
629c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
630c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
631c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
632c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
6331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment count of scan return code occurrence
6341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
6351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X
6361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
637c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) {
6381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
639c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode));
640c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mScanReturnEntries.get(scanReturnCode);
641c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry += countToAdd;
6421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mScanReturnEntries.put(scanReturnCode, entry);
6431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
645c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
646c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this scanReturnCode
647c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * @param scanReturnCode that we are getting the count for
648c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
649c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getScanReturnEntry(int scanReturnCode) {
650c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
651c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mScanReturnEntries.get(scanReturnCode);
652c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
653c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
654c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
655c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String wifiSystemStateToString(int state) {
656c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(state){
657c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_UNKNOWN:
658c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_UNKNOWN";
659c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISABLED:
660c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISABLED";
661c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
662c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISCONNECTED";
663c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
664c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_ASSOCIATED";
665c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
666c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "default";
667c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
668c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
6691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
6711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off
6721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
6731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X
6741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param screenOn Is the screen on
6751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
6761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementWifiSystemScanStateCount(int state, boolean screenOn) {
6771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
678c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) {
679c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state)
680c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + " " + screenOn);
6811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
682c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF);
683c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mWifiSystemStateEntries.get(index);
684c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry++;
685c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiSystemStateEntries.put(index, entry);
686c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
687c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
688c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
689c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
690c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this system State Entry
691c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
692c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getSystemStateCount(int state, boolean screenOn) {
693c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
694c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF);
695c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiSystemStateEntries.get(index);
6961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
699ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
7005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack
7015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggers() {
7035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggers++;
7055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad association threshold when watchdog triggered
7095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) {
7115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count;
7135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad authentication threshold when watchdog triggered
7175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) {
7195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count;
7215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad dhcp threshold when watchdog triggered
7255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) {
7275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count;
7295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad other threshold when watchdog triggered
7335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) {
7355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count;
7375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks seen when watchdog triggered
7415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) {
7435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count;
7455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad association network
7495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAssociation() {
7515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++;
7535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad authentication network
7575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() {
7595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++;
7615f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7625f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7635f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7645f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad dhcp network
7655f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7665f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadDhcp() {
7675f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7685f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++;
7695f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7705f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7715f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad other network
7735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadOther() {
7755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++;
7775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
7805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
781ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed pno is working
782ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
783ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoGood() {
784ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
785ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoGood++;
786ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
787ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
788ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
789ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found pno not working
790ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
791ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoBad() {
792ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
793ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoBad++;
794ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
795ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
796ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
797ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed background scan is working
798ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
799ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundGood() {
800ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
801ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundGood++;
802ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
803ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
804ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
805ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found background scan not working
806ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
807ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundBad() {
808ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
809ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundBad++;
810ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
811ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
812ce003b812aead64dcb36647180991150021b24c1Glen Kuhne
8137a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
8147a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Increment occurence count of RSSI level from RSSI poll.
8157a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Ignores rssi values outside the bounds of [MIN_RSSI_POLL, MAX_RSSI_POLL]
8167a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
8177a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    public void incrementRssiPollRssiCount(int rssi) {
8187a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) {
8197a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            return;
8207a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
8217a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        synchronized (mLock) {
8227a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            int count = mRssiPollCounts.get(rssi);
8237a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mRssiPollCounts.put(rssi, count + 1);
8247a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
8257a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    }
8267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
827da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne    /**
828f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * Increments the count of alerts by alert reason.
829f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     *
830f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * @param reason The cause of the alert. The reason values are driver-specific.
831f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     */
832f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    public void incrementAlertReasonCount(int reason) {
833f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX
834f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) {
835f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED;
836f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
837f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        synchronized (mLock) {
838f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            int alertCount = mWifiAlertReasonCounts.get(reason);
839f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.put(reason, alertCount + 1);
840f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
841f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    }
842f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
843f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /**
84459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     * Counts all the different types of networks seen in a set of scan results
84559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     */
84659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    public void countScanResults(List<ScanDetail> scanDetails) {
84759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        if (scanDetails == null) {
84859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            return;
84959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
85059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int totalResults = 0;
85159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int openNetworks = 0;
85259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int personalNetworks = 0;
85359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int enterpriseNetworks = 0;
85459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hiddenNetworks = 0;
85559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r1Networks = 0;
85659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r2Networks = 0;
85759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        for (ScanDetail scanDetail : scanDetails) {
85859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            NetworkDetail networkDetail = scanDetail.getNetworkDetail();
85959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            ScanResult scanResult = scanDetail.getScanResult();
86059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            totalResults++;
86159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (networkDetail != null) {
86259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.isHiddenBeaconFrame()) {
86359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    hiddenNetworks++;
86459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
86559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.getHSRelease() != null) {
86659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
86759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r1Networks++;
86859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
86959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r2Networks++;
87059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    }
87159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
87259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
87359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (scanResult != null && scanResult.capabilities != null) {
87459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
87559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    enterpriseNetworks++;
87659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)
87759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        || ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
87859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    personalNetworks++;
87959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else {
88059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    openNetworks++;
88159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
88259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
88359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
88459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        synchronized (mLock) {
88559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numTotalScanResults += totalResults;
88659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numOpenNetworkScanResults += openNetworks;
88759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numPersonalNetworkScanResults += personalNetworks;
88859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks;
88959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks;
89059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks;
89159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks;
89259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numScans++;
89359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
89459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    }
89559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
89659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    /**
897da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne     * Increment count of Watchdog successes.
898da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne     */
899da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne    public void incrementNumLastResortWatchdogSuccesses() {
900da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        synchronized (mLock) {
901da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne            mWifiLogProto.numLastResortWatchdogSuccesses++;
902da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne        }
903da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne    }
904da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne
90559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
90611638f348ba45f9f417928e79b81186cef76c561Glen Kuhne    public static final String PROTO_DUMP_ARG = "wifiMetricsProto";
9071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
9081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager
9091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * at this time
9101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
9111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param fd unused
9121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param pw PrintWriter for writing dump to
9131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param args unused
9141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
9151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
9161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
9171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            pw.println("WifiMetrics:");
91811638f348ba45f9f417928e79b81186cef76c561Glen Kuhne            if (args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) {
9191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                //Dump serialized WifiLog proto
9201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                consolidateProto(true);
9211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
9221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (mCurrentConnectionEvent != event) {
9231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //indicate that automatic bug report has been taken for all valid
9241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //connection events
9251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
9261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
9271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
9281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto);
9291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT);
9301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println(metricsProtoDump);
9311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("EndWifiMetrics");
9322532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                clear();
9331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            } else {
9341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mConnectionEvents:");
9351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
9361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    String eventLine = event.toString();
9371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (event == mCurrentConnectionEvent) {
9381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        eventLine += "CURRENTLY OPEN EVENT";
9391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
9401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    pw.println(eventLine);
9411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
9421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks);
9431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks);
9441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworks="
9451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numPersonalNetworks);
9461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworks="
9471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworks);
94859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks);
94959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPasspointNetworks="
95059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPasspointNetworks);
9511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled);
9521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isScanningAlwaysEnabled="
9531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.isScanningAlwaysEnabled);
954c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByUser="
955c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByUser);
956c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByApps="
957c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByApps);
958c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNonEmptyScanResults="
959c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNonEmptyScanResults);
960c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numEmptyScanResults="
961c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numEmptyScanResults);
962c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numOneshotScans="
963c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numOneshotScans);
964c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numBackgroundScans="
965c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numBackgroundScans);
966c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
967c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mScanReturnEntries:");
968c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_UNKNOWN: " + getScanReturnEntry(
969c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_UNKNOWN));
970c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_SUCCESS: " + getScanReturnEntry(
971c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_SUCCESS));
972c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry(
973c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED));
974c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry(
975c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION));
976c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  FAILURE_WIFI_DISABLED: " + getScanReturnEntry(
977c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED));
978c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
979c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>");
980c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN       ON: "
981c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true));
982c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED      ON: "
983c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true));
984c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED  ON: "
985c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true));
986c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED    ON: "
987c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true));
988c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN      OFF: "
989c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false));
990c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED     OFF: "
991c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false));
992c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED OFF: "
993c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false));
994c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED   OFF: "
995c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false));
996ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood="
997ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoGood);
998ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad="
999ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoBad);
1000ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood="
1001ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundGood);
1002ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad="
1003ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundBad);
10045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggers="
10055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggers);
10065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal="
10075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal);
10085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal="
10095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal);
10105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal="
10115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal);
10125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal="
10135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal);
10145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal="
10155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal);
10165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation="
10175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation);
10185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication="
10195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication);
10205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp="
10215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp);
10225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther="
10235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther);
1024da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogSuccesses="
1025da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogSuccesses);
1026107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                pw.println("mWifiLogProto.recordDurationSec="
1027107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                        + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec));
10287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                pw.println("mWifiLogProto.rssiPollRssiCount: Printing counts for [" + MIN_RSSI_POLL
10297a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                        + ", " + MAX_RSSI_POLL + "]");
10307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                StringBuilder sb = new StringBuilder();
10317a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) {
10327a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                    sb.append(mRssiPollCounts.get(i) + " ");
10337a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                }
10347a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                pw.println("  " + sb.toString());
1035f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                pw.print("mWifiLogProto.alertReasonCounts=");
1036f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                sb.setLength(0);
1037f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN;
1038f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) {
1039f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    int count = mWifiAlertReasonCounts.get(i);
1040f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    if (count > 0) {
1041f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        sb.append("(" + i + "," + count + "),");
1042f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    }
1043f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
1044f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                if (sb.length() > 1) {
1045f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    sb.setLength(sb.length() - 1);  // strip trailing comma
1046f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println(sb.toString());
1047f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                } else {
1048f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println("()");
1049f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
105059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numTotalScanResults="
105159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numTotalScanResults);
105259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworkScanResults="
105359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numOpenNetworkScanResults);
105459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworkScanResults="
105559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPersonalNetworkScanResults);
105659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworkScanResults="
105759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworkScanResults);
105859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworkScanResults="
105959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHiddenNetworkScanResults);
106059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults="
106159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R1NetworkScanResults);
106259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults="
106359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R2NetworkScanResults);
106459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans);
10651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
10661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
10671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
10681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
10691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1070c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their
1071c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * respective lists within mWifiLogProto
10721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
10731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param incremental Only include ConnectionEvents created since last automatic bug report
10741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
10751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private void consolidateProto(boolean incremental) {
10761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>();
10777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>();
1078f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>();
10791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
10801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            for (ConnectionEvent event : mConnectionEventList) {
1081c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // If this is not incremental, dump full ConnectionEvent list
1082c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // Else Dump all un-dumped events except for the current one
10831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                if (!incremental || ((mCurrentConnectionEvent != event)
10841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        && !event.mConnectionEvent.automaticBugReportTaken)) {
10851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //Get all ConnectionEvents that haven not been dumped as a proto, also exclude
10861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //the current active un-ended connection event
10871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    events.add(event.mConnectionEvent);
1088c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    if (incremental) {
1089c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
1090c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    }
10911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
10921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
10931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            if (events.size() > 0) {
10941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent);
10951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
1096c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1097c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list
1098c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.scanReturnEntries =
1099c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()];
1100c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mScanReturnEntries.size(); i++) {
1101c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry();
1102c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i);
1103c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i);
1104c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
1105c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1106c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list
1107c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // This one is slightly more complex, as the Sparse are indexed with:
1108c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //     key: wifiState * 2 + isScreenOn, value: wifiStateCount
1109c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.wifiSystemStateEntries =
1110c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog
1111c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    .WifiSystemStateEntry[mWifiSystemStateEntries.size()];
1112c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mWifiSystemStateEntries.size(); i++) {
1113c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i] =
1114c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        new WifiMetricsProto.WifiLog.WifiSystemStateEntry();
1115c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiState =
1116c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.keyAt(i) / 2;
1117c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount =
1118c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.valueAt(i);
1119c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].isScreenOn =
1120c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        (mWifiSystemStateEntries.keyAt(i) % 2) > 0;
1121c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
1122107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000)
1123107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    - mRecordStartTimeSec);
11247a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
11257a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            /**
11267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             * Convert the SparseIntArray of RSSI poll rssi's and counts to the proto's repeated
11277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             * IntKeyVal array.
11287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             */
11297a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            for (int i = 0; i < mRssiPollCounts.size(); i++) {
11307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
11317a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                keyVal.rssi = mRssiPollCounts.keyAt(i);
11327a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                keyVal.count = mRssiPollCounts.valueAt(i);
11337a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                rssis.add(keyVal);
11347a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            }
11357a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount);
1136f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
1137f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            /**
1138f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * Convert the SparseIntArray of alert reasons and counts to the proto's repeated
1139f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * IntKeyVal array.
1140f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             */
1141f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) {
1142f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount();
1143f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.reason = mWifiAlertReasonCounts.keyAt(i);
1144f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.count = mWifiAlertReasonCounts.valueAt(i);
1145f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                alertReasons.add(keyVal);
1146f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            }
1147f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount);
1148ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        }
11491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
11502532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
11512532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
11522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * Clear all WifiMetrics, except for currentConnectionEvent.
11532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
11542532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private void clear() {
11552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        synchronized (mLock) {
11562532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEventList.clear();
11572532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
11582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mConnectionEventList.add(mCurrentConnectionEvent);
11592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
11602532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mScanReturnEntries.clear();
11612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiSystemStateEntries.clear();
1162107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
11637a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mRssiPollCounts.clear();
1164f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.clear();
11652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiLogProto.clear();
11662532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
11672532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
1168ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
1169ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
1170ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set screen state (On/Off)
1171ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
1172ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setScreenState(boolean screenOn) {
1173ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
1174ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = screenOn;
1175ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
1176ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
1177ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
1178ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
1179ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED)
1180ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
1181ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setWifiState(int wifiState) {
1182ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
1183ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = wifiState;
1184ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
1185ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
11861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne}
1187