WifiMetrics.java revision d582c6dfdbb3989b8b761a6cba608a0a3ce35df2
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
1946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaIfaceCallback;
204569ebc2277f35b9bd1baa98194f963388e0c4caSohani Raoimport android.net.NetworkAgent;
214dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhneimport android.net.wifi.ScanResult;
2246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.net.wifi.SupplicantState;
232532a24b254d724a9b6771d327dc410b32b18602Glen Kuhneimport android.net.wifi.WifiConfiguration;
2446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.net.wifi.WifiInfo;
2544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silbersteinimport android.net.wifi.WifiManager;
2646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.os.Handler;
2746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.os.Looper;
2846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.os.Message;
291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport android.util.Base64;
30c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.Log;
3108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport android.util.Pair;
32c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.SparseIntArray;
331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
34910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohenimport com.android.server.wifi.aware.WifiAwareMetrics;
35f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail;
3608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointManager;
3708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointMatch;
3808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointProvider;
39da94688198c864bb29be2e9603ebbe9ae6492a87Tamas Berghammerimport com.android.server.wifi.nano.WifiMetricsProto;
4046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent;
4146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent.ConfigInfo;
42f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil;
4359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport com.android.server.wifi.util.ScanResultUtil;
44f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor;
461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter;
471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList;
4846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.BitSet;
491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar;
5008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.HashSet;
5146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.LinkedList;
521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List;
5308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.Set;
541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/**
561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated.
571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include:
581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Aggregated connection stats (num of connections, num of failures, ...)
591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Discrete connection event stats (time, duration, failure codes, ...)
601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Router details (technology type, authentication type, ...)
611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Scan stats
621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */
631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics {
641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final String TAG = "WifiMetrics";
65c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final boolean DBG = false;
667a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
677a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL
687a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
697a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MAX_RSSI_POLL = 0;
707a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MIN_RSSI_POLL = -127;
715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final int MAX_RSSI_DELTA = 127;
725cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final int MIN_RSSI_DELTA = -127;
735cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Maximum time period between ScanResult and RSSI poll to generate rssi delta datapoint */
745cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final long TIMEOUT_RSSI_DELTA_MILLIS =  3000;
754569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private static final int MIN_WIFI_SCORE = 0;
764569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private static final int MAX_WIFI_SCORE = NetworkAgent.WIFI_BASE_SCORE;
771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private final Object mLock = new Object();
782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private static final int MAX_CONNECTION_EVENTS = 256;
7908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    // Largest bucket in the NumConnectableNetworkCount histogram,
8008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    // anything large will be stored in this bucket
8108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_CONNECTABLE_SSID_NETWORK_BUCKET = 20;
8208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_CONNECTABLE_BSSID_NETWORK_BUCKET = 50;
8308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET = 100;
8408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_TOTAL_SCAN_RESULTS_BUCKET = 250;
85107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private Clock mClock;
86ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private boolean mScreenOn;
87ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private int mWifiState;
88910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    private WifiAwareMetrics mWifiAwareMetrics;
8946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private Handler mHandler;
9008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiConfigManager mWifiConfigManager;
9108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiNetworkSelector mWifiNetworkSelector;
9208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private PasspointManager mPasspointManager;
931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Metrics are stored within an instance of the WifiLog proto during runtime,
951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during
961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced
971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * together at dump-time
981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
997a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog();
1001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Session information that gets logged for every Wifi connection attempt.
1021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1037a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>();
1041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The latest started (but un-ended) connection attempt
1061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private ConnectionEvent mCurrentConnectionEvent;
1081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode
1101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1117a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mScanReturnEntries = new SparseIntArray();
1121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Mapping of system state to the counts of scans requested in that wifi state * screenOn
1141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * combination. Indexed by WifiLog.WifiState * (1 + screenOn)
1151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1167a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray();
117f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of RSSI values to counts. */
118f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mRssiPollCounts = new SparseIntArray();
1195cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Mapping of RSSI scan-poll delta values to counts. */
1205cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private final SparseIntArray mRssiDeltaCounts = new SparseIntArray();
1215cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** RSSI of the scan result for the last connection event*/
1225cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private int mScanResultRssi = 0;
1235cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Boot-relative timestamp when the last candidate scanresult was received, used to calculate
1245cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        RSSI deltas. -1 designates no candidate scanResult being tracked */
1255cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private long mScanResultRssiTimestampMillis = -1;
126f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of alert reason to the respective alert count. */
127f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray();
128107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    /**
129107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data
130107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * capture for for this WifiMetricsProto
131107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     */
132107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private long mRecordStartTimeSec;
1334569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    /** Mapping of Wifi Scores to counts */
1344569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private final SparseIntArray mWifiScoreCounts = new SparseIntArray();
13544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    /** Mapping of SoftApManager start SoftAp return codes to counts */
13644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    private final SparseIntArray mSoftApManagerReturnCodeCounts = new SparseIntArray();
13708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
13808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mTotalSsidsInScanHistogram = new SparseIntArray();
13908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mTotalBssidsInScanHistogram = new SparseIntArray();
14008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenSsidsInScanHistogram = new SparseIntArray();
14108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenBssidsInScanHistogram = new SparseIntArray();
14208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedSsidsInScanHistogram = new SparseIntArray();
14308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedBssidsInScanHistogram = new SparseIntArray();
14408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenOrSavedSsidsInScanHistogram = new SparseIntArray();
14508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenOrSavedBssidsInScanHistogram = new SparseIntArray();
14608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedPasspointProviderProfilesInScanHistogram =
14708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            new SparseIntArray();
14808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedPasspointProviderBssidsInScanHistogram =
14908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            new SparseIntArray();
15008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
1511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class RouterFingerPrint {
1521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto;
1532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        RouterFingerPrint() {
1541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint();
1551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
1561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
1571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
1581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
1591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
1601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType);
1611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo);
1621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mDtim=" + mRouterFingerPrintProto.dtim);
1631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication);
1641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mHidden=" + mRouterFingerPrintProto.hidden);
1651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology);
1661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6);
1671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
1681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
1691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
1702532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        public void updateFromWifiConfiguration(WifiConfiguration config) {
171ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            synchronized (mLock) {
172ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (config != null) {
173ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Is this a hidden network
174ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mRouterFingerPrintProto.hidden = config.hiddenSSID;
175ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Config may not have a valid dtimInterval set yet, in which case dtim will be zero
176ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // (These are only populated from beacon frame scan results, which are returned as
177ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // scan results from the chip far less frequently than Probe-responses)
178ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.dtimInterval > 0) {
179ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mRouterFingerPrintProto.dtim = config.dtimInterval;
180ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
181ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mCurrentConnectionEvent.mConfigSsid = config.SSID;
182ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Get AuthType information from config (We do this again from ScanResult after
183ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // associating with BSSID)
184ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.allowedKeyManagement != null
185ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                            && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
186ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
187ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
188ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else if (config.isEnterprise()) {
189ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
190ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
191ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else {
192ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
193ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
194ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
19559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
19659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                            .passpoint = config.isPasspoint();
197ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // If there's a ScanResult candidate associated with this config already, get it and
198ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // log (more accurate) metrics from it
199ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
200ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (candidate != null) {
201ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        updateMetricsFromScanResult(candidate);
202ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
20396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
2042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
2052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
2061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
2071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
2091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Log event, tracking the start time, end time and result of a wireless connection attempt.
2101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
2111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class ConnectionEvent {
2121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        WifiMetricsProto.ConnectionEvent mConnectionEvent;
21396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field
21496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //covering more than just l2 failures. see b/27652362
21596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        /**
21696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot
21796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * more failures than just l2 though, since the proto does not have a place to log
21896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * framework failures)
21996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         */
2202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // Failure is unknown
22196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_UNKNOWN = 0;
2222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NONE
22396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NONE = 1;
2242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // ASSOCIATION_REJECTION_EVENT
22596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ASSOCIATION_REJECTION = 2;
2262532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // AUTHENTICATION_FAILURE_EVENT
22796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_AUTHENTICATION_FAILURE = 3;
2282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // SSID_TEMP_DISABLED (Also Auth failure)
22996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_SSID_TEMP_DISABLED = 4;
2304dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // reconnect() or reassociate() call to WifiNative failed
23196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_CONNECT_NETWORK_FAILED = 5;
2322532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NETWORK_DISCONNECTION_EVENT
23396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NETWORK_DISCONNECTION = 6;
2344dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // NEW_CONNECTION_ATTEMPT before previous finished
23596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7;
23696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // New connection attempt to the same network & bssid
23796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8;
23896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // Roam Watchdog timer triggered (Roaming timed out)
23996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ROAM_TIMEOUT = 9;
24096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // DHCP failure
24196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_DHCP = 10;
24296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne
2434dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        RouterFingerPrint mRouterFingerPrint;
2444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealStartTime;
2454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealEndTime;
2464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigSsid;
2474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigBssid;
248ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private int mWifiState;
249ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private boolean mScreenOn;
2502532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
2511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private ConnectionEvent() {
2521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mConnectionEvent = new WifiMetricsProto.ConnectionEvent();
253947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealEndTime = 0;
254947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealStartTime = 0;
2552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mRouterFingerPrint = new RouterFingerPrint();
2562532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto;
2574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigSsid = "<NULL>";
2584dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigBssid = "<NULL>";
259ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN;
260ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = false;
2611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
2641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
2651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            sb.append("startTime=");
2661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            Calendar c = Calendar.getInstance();
2671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
2681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                c.setTimeInMillis(mConnectionEvent.startTimeMillis);
2691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.startTimeMillis == 0 ? "            <null>" :
2701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
2714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", SSID=");
2724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigSsid);
2734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", BSSID=");
2744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigBssid);
2754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", durationMillis=");
2761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.durationTakenToConnectMillis);
2772532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                sb.append(", roamType=");
2784dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.roamType) {
2792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 1:
2802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_NONE");
2812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 2:
2832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_DBDC");
2842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2852532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 3:
2862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_ENTERPRISE");
2872532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2882532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 4:
2892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_USER_SELECTED");
2902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2912532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 5:
2922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNRELATED");
2932532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
2942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    default:
2952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNKNOWN");
2962532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                }
2974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", connectionResult=");
2984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.connectionResult);
2991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", level2FailureCode=");
3004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.level2FailureCode) {
30196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NONE:
3024dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
3034dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
30496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ASSOCIATION_REJECTION:
3054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("ASSOCIATION_REJECTION");
3064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
30796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_AUTHENTICATION_FAILURE:
3084dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("AUTHENTICATION_FAILURE");
3094dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
31096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_SSID_TEMP_DISABLED:
3114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("SSID_TEMP_DISABLED");
3124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
31396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_CONNECT_NETWORK_FAILED:
3144dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("CONNECT_NETWORK_FAILED");
3154dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
31696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NETWORK_DISCONNECTION:
3174dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NETWORK_DISCONNECTION");
3184dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
31996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NEW_CONNECTION_ATTEMPT:
3204dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NEW_CONNECTION_ATTEMPT");
3214dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
32296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_REDUNDANT_CONNECTION_ATTEMPT:
32396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("REDUNDANT_CONNECTION_ATTEMPT");
32496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
32596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ROAM_TIMEOUT:
32696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("ROAM_TIMEOUT");
32796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
32896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_DHCP:
32996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("DHCP");
3304dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
3314dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
3324dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3334dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
3341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", connectivityLevelFailureCode=");
3354dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.connectivityLevelFailureCode) {
3364dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NONE:
3374dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
3384dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3394dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_DHCP:
3404dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("DHCP");
3414dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3424dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET:
3434dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NO_INTERNET");
3444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED:
3464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNWANTED");
3474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
3494dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
3504dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
3524dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", signalStrength=");
3534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.signalStrength);
354ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", wifiState=");
355ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                switch(mWifiState) {
356ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISABLED:
357ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISABLED");
358ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
359ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
360ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISCONNECTED");
361ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
362ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
363ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_ASSOCIATED");
364ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
365ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    default:
366ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_UNKNOWN");
367ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
368ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                }
369ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", screenOn=");
370ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(mScreenOn);
371ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(". mRouterFingerprint: ");
3721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mRouterFingerPrint.toString());
3731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
3741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
3751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
3761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
378910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    public WifiMetrics(Clock clock, Looper looper, WifiAwareMetrics awareMetrics) {
379107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mClock = clock;
3801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mCurrentConnectionEvent = null;
381ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mScreenOn = true;
382ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED;
383107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
384910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen        mWifiAwareMetrics = awareMetrics;
38546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
38646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mHandler = new Handler(looper) {
38746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            public void handleMessage(Message msg) {
38846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                synchronized (mLock) {
38946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    processMessage(msg);
39046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
39146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            }
39246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        };
3931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
39508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal WifiConfigManager member */
39608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setWifiConfigManager(WifiConfigManager wifiConfigManager) {
39708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mWifiConfigManager = wifiConfigManager;
39808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
39908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
40008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal WifiNetworkSelector member */
40108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setWifiNetworkSelector(WifiNetworkSelector wifiNetworkSelector) {
40208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mWifiNetworkSelector = wifiNetworkSelector;
40308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
40408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
40508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal PasspointManager member */
40608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setPasspointManager(PasspointManager passpointManager) {
40708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mPasspointManager = passpointManager;
40808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
40908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
410c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    // Values used for indexing SystemStateEntries
411c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_ON = 1;
412c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_OFF = 0;
413c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
4141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
4151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Create a new connection event. Call when wifi attempts to make a new network connection
4161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity
4171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * failure code.
4181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Gathers and sets the RouterFingerPrint data as well
4191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
420947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne     * @param config WifiConfiguration of the config used for the current connection attempt
4211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X
4221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
42396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne    public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) {
4241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
42596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            // Check if this is overlapping another current connection event
42696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            if (mCurrentConnectionEvent != null) {
42796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                //Is this new Connection Event the same as the current one
42896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                if (mCurrentConnectionEvent.mConfigSsid != null
42996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigBssid != null
43096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && config != null
43196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID)
43296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && (mCurrentConnectionEvent.mConfigBssid.equals("any")
43396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) {
43496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    mCurrentConnectionEvent.mConfigBssid = targetBSSID;
43596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to the same network
43696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT,
43796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
43896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                } else {
43996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to different network
44096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT,
44196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
44296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
44396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            }
44496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            //If past maximum connection events, start removing the oldest
4454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) {
4464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                mConnectionEventList.remove(0);
4474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            }
4484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent = new ConnectionEvent();
4494dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.startTimeMillis =
450107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    mClock.getWallClockMillis();
45196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = targetBSSID;
4524dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
4534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config);
45496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = "any";
455107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis();
456ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mWifiState = mWifiState;
457ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mScreenOn = mScreenOn;
4584dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConnectionEventList.add(mCurrentConnectionEvent);
4595cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
4605cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            if (config != null) {
4615cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
4625cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (candidate != null) {
4635cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // Cache the RSSI of the candidate, as the connection event level is updated
4645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // from other sources (polls, bssid_associations) and delta requires the
4655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // scanResult rssi
4665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssi = candidate.level;
4675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssiTimestampMillis = mClock.getElapsedSinceBootMillis();
4685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
4695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
4701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
4731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
4742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * set the RoamType of the current ConnectionEvent (if any)
4752532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
4762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    public void setConnectionEventRoamType(int roamType) {
477ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
478ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null) {
479ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
480ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            }
4812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
4822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
483f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
484f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    /**
485f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Set AP related metrics from ScanDetail
486f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
487f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void setConnectionScanDetail(ScanDetail scanDetail) {
488ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
489ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null && scanDetail != null) {
490ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
491ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
492ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //Ensure that we have a networkDetail, and that it corresponds to the currently
493ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //tracked connection attempt
494ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (networkDetail != null && scanResult != null
495ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid != null
496ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid
497ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        .equals("\"" + networkDetail.getSSID() + "\"")) {
498ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromNetworkDetail(networkDetail);
499ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromScanResult(scanResult);
500ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                }
501f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne            }
502f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        }
503f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
504f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
5052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
5061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * End a Connection event record. Call when wifi connection attempt succeeds or fails.
5071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If a Connection event has not been started and is active when .end is called, a new one is
5081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * created with zero duration.
5091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
5101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param level2FailureCode Level 2 failure code returned by supplicant
5111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X
5121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
5131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) {
5141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
5162532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                boolean result = (level2FailureCode == 1)
5172532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE);
5182532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0;
519107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis();
5202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int)
5212532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        (mCurrentConnectionEvent.mRealEndTime
5222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        - mCurrentConnectionEvent.mRealStartTime);
5232532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode;
5242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode =
5252532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        connectivityFailureCode;
526f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                // ConnectionEvent already added to ConnectionEvents List. Safe to null current here
5272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent = null;
5285cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (!result) {
5295cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssiTimestampMillis = -1;
5305cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
5311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
5321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
5331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
5341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
5352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
5362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail
5372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
5382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) {
5392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int dtimInterval = networkDetail.getDtimInterval();
5402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (dtimInterval > 0) {
5412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim =
5422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                    dtimInterval;
5432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
5442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int connectionWifiMode;
5452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        switch (networkDetail.getWifiMode()) {
5462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_UNDEFINED:
5472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN;
5482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
5492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11A:
5502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A;
5512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
5522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11B:
5532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B;
5542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
5552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11G:
5562b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G;
5572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
5582b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11N:
5592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N;
5602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
5612b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11AC  :
5622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC;
5632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
5642b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            default:
5652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER;
5662b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
5672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
5682b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
5692b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                .routerTechnology = connectionWifiMode;
5702b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
5712b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
5722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
5732b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent RSSI and authentication type from ScanResult
5742b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
5752b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromScanResult(ScanResult scanResult) {
5762b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level;
5772b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
5782b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
57996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID;
5802b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (scanResult.capabilities != null) {
58159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
5822b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
5832b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
58459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) {
5852b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
5862b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
58759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
5882b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
5892b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
5902b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            }
5912b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
59296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo =
59396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                scanResult.frequency;
5942b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
5952b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
5961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsLocationEnabled(boolean enabled) {
5971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
5981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isLocationEnabled = enabled;
5991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsScanningAlwaysEnabled(boolean enabled) {
6031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
6041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isScanningAlwaysEnabled = enabled;
6051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
6091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Non Empty Scan Results count
6101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
6111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementNonEmptyScanResultCount() {
612c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount");
6131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
6141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNonEmptyScanResults++;
6151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
6191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Empty Scan Results count
6201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
6211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementEmptyScanResultCount() {
622c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementEmptyScanResultCount");
6231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
6241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numEmptyScanResults++;
6251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
629c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Increment background scan count
630c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
631c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementBackgroundScanCount() {
632c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementBackgroundScanCount");
633c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
634c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numBackgroundScans++;
635c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
636c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
637c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
638c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne   /**
639c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get Background scan count
640c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
641c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getBackgroundScanCount() {
642c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
643c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numBackgroundScans;
644c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
645c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
646c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
647c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
64870ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne     * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry
649c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
650c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementOneshotScanCount() {
651c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
652c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numOneshotScans++;
653c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
65470ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne        incrementWifiSystemScanStateCount(mWifiState, mScreenOn);
655c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
656c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
657c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
658c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get oneshot scan count
659c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
660c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getOneshotScanCount() {
661c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
662c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numOneshotScans;
663c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
664c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
665c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
666c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String returnCodeToString(int scanReturnCode) {
667c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(scanReturnCode){
668c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_UNKNOWN:
669c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_UNKNOWN";
670c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_SUCCESS:
671c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_SUCCESS";
672c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED:
673c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INTERRUPTED";
674c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION:
675c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INVALID_CONFIGURATION";
676c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED:
677c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "FAILURE_WIFI_DISABLED";
678c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
679c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "<UNKNOWN>";
680c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
681c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
682c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
683c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
6841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment count of scan return code occurrence
6851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
6861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X
6871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
688c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) {
6891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
690c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode));
691c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mScanReturnEntries.get(scanReturnCode);
692c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry += countToAdd;
6931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mScanReturnEntries.put(scanReturnCode, entry);
6941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
696c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
697c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this scanReturnCode
698c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * @param scanReturnCode that we are getting the count for
699c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
700c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getScanReturnEntry(int scanReturnCode) {
701c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
702c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mScanReturnEntries.get(scanReturnCode);
703c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
704c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
705c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
706c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String wifiSystemStateToString(int state) {
707c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(state){
708c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_UNKNOWN:
709c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_UNKNOWN";
710c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISABLED:
711c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISABLED";
712c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
713c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISCONNECTED";
714c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
715c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_ASSOCIATED";
716c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
717c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "default";
718c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
719c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
7201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
7221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off
7231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
7241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X
7251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param screenOn Is the screen on
7261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
7271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementWifiSystemScanStateCount(int state, boolean screenOn) {
7281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
729c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) {
730c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state)
731c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + " " + screenOn);
7321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
733c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF);
734c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mWifiSystemStateEntries.get(index);
735c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry++;
736c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiSystemStateEntries.put(index, entry);
737c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
738c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
739c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
740c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
741c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this system State Entry
742c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
743c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getSystemStateCount(int state, boolean screenOn) {
744c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
745c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF);
746c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiSystemStateEntries.get(index);
7471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
750ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
7515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack
7525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggers() {
7545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggers++;
7565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad association threshold when watchdog triggered
7605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7615f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) {
7625f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7635f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count;
7645f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7655f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7665f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7675f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad authentication threshold when watchdog triggered
7685f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7695f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) {
7705f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7715f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count;
7725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad dhcp threshold when watchdog triggered
7765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) {
7785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count;
7805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad other threshold when watchdog triggered
7845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) {
7865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count;
7885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks seen when watchdog triggered
7925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
7935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) {
7945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
7955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count;
7965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
7975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
7985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
7995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad association network
8005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
8015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAssociation() {
8025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
8035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++;
8045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
8055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
8065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
8075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad authentication network
8085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
8095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() {
8105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
8115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++;
8125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
8135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
8145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
8155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad dhcp network
8165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
8175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadDhcp() {
8185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
8195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++;
8205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
8215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
8225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
8235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad other network
8245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
8255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadOther() {
8265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
8275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++;
8285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
8295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
8305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
8315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
832ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed pno is working
833ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
834ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoGood() {
835ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
836ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoGood++;
837ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
838ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
839ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
840ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found pno not working
841ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
842ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoBad() {
843ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
844ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoBad++;
845ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
846ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
847ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
848ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed background scan is working
849ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
850ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundGood() {
851ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
852ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundGood++;
853ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
854ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
855ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
856ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found background scan not working
857ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
858ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundBad() {
859ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
860ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundBad++;
861ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
862ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
863ce003b812aead64dcb36647180991150021b24c1Glen Kuhne
8647a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
86546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Increment various poll related metrics, and cache performance data for StaEvent logging
86646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
86746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void handlePollResult(WifiInfo wifiInfo) {
86846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollRssi = wifiInfo.getRssi();
86946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollLinkSpeed = wifiInfo.getLinkSpeed();
87046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollFreq = wifiInfo.getFrequency();
87146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        incrementRssiPollRssiCount(mLastPollRssi);
87246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
87346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
87446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
8757a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Increment occurence count of RSSI level from RSSI poll.
8767a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Ignores rssi values outside the bounds of [MIN_RSSI_POLL, MAX_RSSI_POLL]
8777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
8787a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    public void incrementRssiPollRssiCount(int rssi) {
8797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) {
8807a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            return;
8817a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
8827a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        synchronized (mLock) {
8837a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            int count = mRssiPollCounts.get(rssi);
8847a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mRssiPollCounts.put(rssi, count + 1);
8855cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            maybeIncrementRssiDeltaCount(rssi - mScanResultRssi);
8865cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        }
8875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    }
8885cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne
8895cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /**
8905cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * Increment occurence count of difference between scan result RSSI and the first RSSI poll.
8915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * Ignores rssi values outside the bounds of [MIN_RSSI_DELTA, MAX_RSSI_DELTA]
8925cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * mLock must be held when calling this method.
8935cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     */
8945cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private void maybeIncrementRssiDeltaCount(int rssi) {
8955cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        // Check if this RSSI poll is close enough to a scan result RSSI to log a delta value
8965cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        if (mScanResultRssiTimestampMillis >= 0) {
8975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            long timeDelta = mClock.getElapsedSinceBootMillis() - mScanResultRssiTimestampMillis;
8985cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            if (timeDelta <= TIMEOUT_RSSI_DELTA_MILLIS) {
8995cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (rssi >= MIN_RSSI_DELTA && rssi <= MAX_RSSI_DELTA) {
9005cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    int count = mRssiDeltaCounts.get(rssi);
9015cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mRssiDeltaCounts.put(rssi, count + 1);
9025cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
9035cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
9045cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
9057a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
9067a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    }
9077a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
908da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne    /**
9091c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne     * Increment count of Watchdog successes.
9101c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne     */
9111c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    public void incrementNumLastResortWatchdogSuccesses() {
9121c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne        synchronized (mLock) {
9131c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne            mWifiLogProto.numLastResortWatchdogSuccesses++;
9141c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne        }
9151c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    }
9161c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne
9171c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    /**
918f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * Increments the count of alerts by alert reason.
919f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     *
920f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * @param reason The cause of the alert. The reason values are driver-specific.
921f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     */
922f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    public void incrementAlertReasonCount(int reason) {
923f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX
924f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) {
925f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED;
926f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
927f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        synchronized (mLock) {
928f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            int alertCount = mWifiAlertReasonCounts.get(reason);
929f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.put(reason, alertCount + 1);
930f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
931f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    }
932f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
933f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /**
93459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     * Counts all the different types of networks seen in a set of scan results
93559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     */
93659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    public void countScanResults(List<ScanDetail> scanDetails) {
93759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        if (scanDetails == null) {
93859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            return;
93959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
94059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int totalResults = 0;
94159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int openNetworks = 0;
94259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int personalNetworks = 0;
94359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int enterpriseNetworks = 0;
94459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hiddenNetworks = 0;
94559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r1Networks = 0;
94659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r2Networks = 0;
94759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        for (ScanDetail scanDetail : scanDetails) {
94859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            NetworkDetail networkDetail = scanDetail.getNetworkDetail();
94959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            ScanResult scanResult = scanDetail.getScanResult();
95059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            totalResults++;
95159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (networkDetail != null) {
95259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.isHiddenBeaconFrame()) {
95359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    hiddenNetworks++;
95459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
95559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.getHSRelease() != null) {
95659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
95759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r1Networks++;
95859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
95959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r2Networks++;
96059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    }
96159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
96259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
96359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (scanResult != null && scanResult.capabilities != null) {
96459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
96559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    enterpriseNetworks++;
96659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)
96759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        || ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
96859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    personalNetworks++;
96959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else {
97059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    openNetworks++;
97159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
97259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
97359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
97459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        synchronized (mLock) {
97559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numTotalScanResults += totalResults;
97659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numOpenNetworkScanResults += openNetworks;
97759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numPersonalNetworkScanResults += personalNetworks;
97859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks;
97959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks;
98059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks;
98159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks;
98259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numScans++;
98359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
98459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    }
98559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
98659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    /**
9874569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * Increments occurence of a particular wifi score calculated
9884569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * in WifiScoreReport by current connected network. Scores are bounded
9894569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * within  [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray
9904569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     */
9914569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    public void incrementWifiScoreCount(int score) {
9924569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        if (score < MIN_WIFI_SCORE || score > MAX_WIFI_SCORE) {
9934569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            return;
9944569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        }
9954569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        synchronized (mLock) {
9964569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            int count = mWifiScoreCounts.get(score);
9974569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiScoreCounts.put(score, count + 1);
9984569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        }
9994569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    }
100059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
100144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    /**
100244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * Increments occurence of the results from attempting to start SoftAp.
100344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * Maps the |result| and WifiManager |failureCode| constant to proto defined SoftApStartResult
100444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * codes.
100544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     */
100644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    public void incrementSoftApStartResult(boolean result, int failureCode) {
100744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein        synchronized (mLock) {
100844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            if (result) {
100944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
101044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY);
101144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
101244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY,
101344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
101444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                return;
101544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
101644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
101744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            // now increment failure modes - if not explicitly handled, dump into the general
101844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            // error bucket.
101944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            if (failureCode == WifiManager.SAP_START_FAILURE_NO_CHANNEL) {
102044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
102144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL);
102244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
102344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL,
102444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
102544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            } else {
102644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                // failure mode not tracked at this time...  count as a general error for now.
102744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
102844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR);
102944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
103044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR,
103144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
103244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
103344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein        }
103444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    }
103544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
1036bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1037bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the HAL crashed.
1038bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1039bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumHalCrashes() {
1040bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1041bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numHalCrashes++;
1042bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1043bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1044bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1045bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1046bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the Wificond crashed.
1047bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1048bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumWificondCrashes() {
1049bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1050bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numWificondCrashes++;
1051bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1052bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1053bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1054bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1055bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the wifi on failed due to an error in HAL.
1056bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1057bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumWifiOnFailureDueToHal() {
1058bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1059bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numWifiOnFailureDueToHal++;
1060bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1061bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1062bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1063bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1064bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the wifi on failed due to an error in wificond.
1065bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1066bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumWifiOnFailureDueToWificond() {
1067bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1068bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numWifiOnFailureDueToWificond++;
1069bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1070bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1071bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
107226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
107326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider being installed.
107426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
107526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderInstallation() {
107626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
107726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderInstallation++;
107826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
107926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
108026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
108126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
108226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider is installed successfully.
108326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
108426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderInstallSuccess() {
108526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
108626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderInstallSuccess++;
108726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
108826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
108926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
109026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
109126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider being uninstalled.
109226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
109326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderUninstallation() {
109426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
109526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderUninstallation++;
109626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
109726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
109826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
109926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
110026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider is uninstalled successfully.
110126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
110226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderUninstallSuccess() {
110326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
110426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderUninstallSuccess++;
110526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
110626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
1107bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
110808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /**
110908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Increment N-Way network selection decision histograms:
111008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Counts the size of various sets of scanDetails within a scan, and increment the occurrence
111108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * of that size for the associated histogram. There are ten histograms generated for each
111208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * combination of: {SSID, BSSID} *{Total, Saved, Open, Saved_or_Open, Passpoint}
111308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Only performs this count if isFullBand is true, otherwise, increments the partial scan count
111408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     */
111508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void incrementAvailableNetworksHistograms(List<ScanDetail> scanDetails,
111608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            boolean isFullBand) {
111708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        synchronized (mLock) {
111808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            if (mWifiConfigManager == null || mWifiNetworkSelector == null
111908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    || mPasspointManager == null) {
112008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                return;
112108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
112208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            if (!isFullBand) {
112308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                mWifiLogProto.partialAllSingleScanListenerResults++;
112408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                return;
112508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
112608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> ssids = new HashSet<ScanResultMatchInfo>();
112708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int bssids = 0;
112808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> openSsids = new HashSet<ScanResultMatchInfo>();
112908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int openBssids = 0;
113008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> savedSsids = new HashSet<ScanResultMatchInfo>();
113108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int savedBssids = 0;
113208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            // openOrSavedSsids calculated from union of savedSsids & openSsids
113308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int openOrSavedBssids = 0;
113408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<PasspointProvider> savedPasspointProviderProfiles =
113508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    new HashSet<PasspointProvider>();
113608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int savedPasspointProviderBssids = 0;
113708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            for (ScanDetail scanDetail : scanDetails) {
113808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
113908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
114008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (mWifiNetworkSelector.isSignalTooWeak(scanResult)) {
114108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    continue;
114208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
114308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ScanResultMatchInfo matchInfo = ScanResultMatchInfo.fromScanResult(scanResult);
114408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                Pair<PasspointProvider, PasspointMatch> providerMatch = null;
114508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                PasspointProvider passpointProvider = null;
114608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (networkDetail.isInterworking()) {
114708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    providerMatch =
114808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                            mPasspointManager.matchProvider(scanResult);
114908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    passpointProvider = providerMatch != null ? providerMatch.first : null;
115008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
115108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ssids.add(matchInfo);
115208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                bssids++;
115308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isOpen = matchInfo.networkType == ScanResultMatchInfo.NETWORK_TYPE_OPEN;
115408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                WifiConfiguration config =
115508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        mWifiConfigManager.getConfiguredNetworkForScanDetail(scanDetail);
115608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isSaved = (config != null) && !config.isEphemeral()
115708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        && !config.isPasspoint();
115808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isSavedPasspoint = passpointProvider != null;
115908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isOpen) {
116008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openSsids.add(matchInfo);
116108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openBssids++;
116208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
116308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isSaved) {
116408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedSsids.add(matchInfo);
116508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedBssids++;
116608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
116708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isOpen || isSaved) {
116808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openOrSavedBssids++;
116908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    // Calculate openOrSavedSsids union later
117008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
117108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isSavedPasspoint) {
117208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderProfiles.add(passpointProvider);
117308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderBssids++;
117408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
117508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
117608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.fullBandAllSingleScanListenerResults++;
117708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementTotalScanSsids(mTotalSsidsInScanHistogram, ssids.size());
117808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementTotalScanResults(mTotalBssidsInScanHistogram, bssids);
117908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableOpenSsidsInScanHistogram, openSsids.size());
118008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableOpenBssidsInScanHistogram, openBssids);
118108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableSavedSsidsInScanHistogram, savedSsids.size());
118208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableSavedBssidsInScanHistogram, savedBssids);
118308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            openSsids.addAll(savedSsids); // openSsids = Union(openSsids, savedSsids)
118408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableOpenOrSavedSsidsInScanHistogram, openSsids.size());
118508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableOpenOrSavedBssidsInScanHistogram, openOrSavedBssids);
118608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableSavedPasspointProviderProfilesInScanHistogram,
118708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderProfiles.size());
118808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableSavedPasspointProviderBssidsInScanHistogram,
118908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderBssids);
119008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        }
119108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
119208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
119311638f348ba45f9f417928e79b81186cef76c561Glen Kuhne    public static final String PROTO_DUMP_ARG = "wifiMetricsProto";
11949ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne    public static final String CLEAN_DUMP_ARG = "clean";
11959ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne
11961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
11971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager
11989ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne     * at this time.
11991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
12001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param fd unused
12011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param pw PrintWriter for writing dump to
12021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param args unused
12031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
12041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
12051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
1206031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne            if (args != null && args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) {
12079ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                // Dump serialized WifiLog proto
12081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                consolidateProto(true);
12091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
12101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (mCurrentConnectionEvent != event) {
12111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //indicate that automatic bug report has been taken for all valid
12121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //connection events
12131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
12141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
12151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
12161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto);
12171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT);
12189ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                if (args.length > 1 && CLEAN_DUMP_ARG.equals(args[1])) {
12199ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    // Output metrics proto bytes (base64) and nothing else
12209ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.print(metricsProtoDump);
12219ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                } else {
12229ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    // Tag the start and end of the metrics proto bytes
12239ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println("WifiMetrics:");
12249ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println(metricsProtoDump);
12259ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println("EndWifiMetrics");
12269ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                }
12272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                clear();
12281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            } else {
12299ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                pw.println("WifiMetrics:");
12301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mConnectionEvents:");
12311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
12321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    String eventLine = event.toString();
12331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (event == mCurrentConnectionEvent) {
12341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        eventLine += "CURRENTLY OPEN EVENT";
12351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
12361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    pw.println(eventLine);
12371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
12381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks);
12391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks);
12401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworks="
12411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numPersonalNetworks);
12421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworks="
12431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworks);
124459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks);
124559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPasspointNetworks="
124659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPasspointNetworks);
12471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled);
12481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isScanningAlwaysEnabled="
12491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.isScanningAlwaysEnabled);
1250c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByUser="
1251c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByUser);
1252c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByApps="
1253c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByApps);
1254c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNonEmptyScanResults="
1255c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNonEmptyScanResults);
1256c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numEmptyScanResults="
1257c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numEmptyScanResults);
1258c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numOneshotScans="
1259c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numOneshotScans);
1260c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numBackgroundScans="
1261c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numBackgroundScans);
1262c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1263c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mScanReturnEntries:");
1264c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_UNKNOWN: " + getScanReturnEntry(
1265c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_UNKNOWN));
1266c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_SUCCESS: " + getScanReturnEntry(
1267c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_SUCCESS));
1268c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry(
1269c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED));
1270c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry(
1271c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION));
1272c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  FAILURE_WIFI_DISABLED: " + getScanReturnEntry(
1273c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED));
1274c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1275c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>");
1276c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN       ON: "
1277c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true));
1278c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED      ON: "
1279c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true));
1280c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED  ON: "
1281c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true));
1282c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED    ON: "
1283c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true));
1284c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN      OFF: "
1285c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false));
1286c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED     OFF: "
1287c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false));
1288c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED OFF: "
1289c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false));
1290c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED   OFF: "
1291c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false));
1292ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood="
1293ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoGood);
1294ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad="
1295ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoBad);
1296ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood="
1297ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundGood);
1298ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad="
1299ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundBad);
13005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggers="
13015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggers);
13025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal="
13035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal);
13045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal="
13055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal);
13065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal="
13075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal);
13085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal="
13095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal);
13105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal="
13115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal);
13125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation="
13135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation);
13145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication="
13155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication);
13165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp="
13175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp);
13185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther="
13195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther);
1320da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogSuccesses="
1321da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogSuccesses);
1322107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                pw.println("mWifiLogProto.recordDurationSec="
1323107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                        + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec));
13247a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                pw.println("mWifiLogProto.rssiPollRssiCount: Printing counts for [" + MIN_RSSI_POLL
13257a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                        + ", " + MAX_RSSI_POLL + "]");
13267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                StringBuilder sb = new StringBuilder();
13277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) {
13287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                    sb.append(mRssiPollCounts.get(i) + " ");
13297a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                }
13307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                pw.println("  " + sb.toString());
13315cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                pw.println("mWifiLogProto.rssiPollDeltaCount: Printing counts for ["
13325cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                        + MIN_RSSI_DELTA + ", " + MAX_RSSI_DELTA + "]");
13335cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                sb.setLength(0);
13345cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                for (int i = MIN_RSSI_DELTA; i <= MAX_RSSI_DELTA; i++) {
13355cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    sb.append(mRssiDeltaCounts.get(i) + " ");
13365cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
13375cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                pw.println("  " + sb.toString());
1338f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                pw.print("mWifiLogProto.alertReasonCounts=");
1339f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                sb.setLength(0);
1340f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN;
1341f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) {
1342f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    int count = mWifiAlertReasonCounts.get(i);
1343f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    if (count > 0) {
1344f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        sb.append("(" + i + "," + count + "),");
1345f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    }
1346f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
1347f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                if (sb.length() > 1) {
1348f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    sb.setLength(sb.length() - 1);  // strip trailing comma
1349f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println(sb.toString());
1350f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                } else {
1351f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println("()");
1352f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
135359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numTotalScanResults="
135459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numTotalScanResults);
135559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworkScanResults="
135659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numOpenNetworkScanResults);
135759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworkScanResults="
135859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPersonalNetworkScanResults);
135959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworkScanResults="
136059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworkScanResults);
136159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworkScanResults="
136259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHiddenNetworkScanResults);
136359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults="
136459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R1NetworkScanResults);
136559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults="
136659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R2NetworkScanResults);
136759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans);
13684569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                pw.println("mWifiLogProto.WifiScoreCount: [" + MIN_WIFI_SCORE + ", "
13694569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                        + MAX_WIFI_SCORE + "]");
13704569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                for (int i = 0; i <= MAX_WIFI_SCORE; i++) {
13714569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                    pw.print(mWifiScoreCounts.get(i) + " ");
13724569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                }
137344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println(); // add a line after wifi scores
137444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("mWifiLogProto.SoftApManagerReturnCodeCounts:");
137544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  SUCCESS: " + mSoftApManagerReturnCodeCounts.get(
137644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY));
137744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  FAILED_GENERAL_ERROR: " + mSoftApManagerReturnCodeCounts.get(
137844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR));
137944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  FAILED_NO_CHANNEL: " + mSoftApManagerReturnCodeCounts.get(
138044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL));
13814569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                pw.print("\n");
1382bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numHalCrashes="
1383bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numHalCrashes);
1384bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numWificondCrashes="
1385bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numWificondCrashes);
1386bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numWifiOnFailureDueToHal="
1387bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numWifiOnFailureDueToHal);
1388bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numWifiOnFailureDueToWificond="
1389bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numWifiOnFailureDueToWificond);
139046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                pw.println("StaEventList:");
1391d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                for (StaEventWithTime event : mStaEventList) {
1392d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                    pw.println(event);
139346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
1394910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen
139526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviders="
139626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviders);
139726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderInstallation="
139826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderInstallation);
139926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderInstallSuccess="
140026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderInstallSuccess);
140126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderUninstallation="
140226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderUninstallation);
140326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderUninstallSuccess="
140426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderUninstallSuccess);
140526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProvidersSuccessfullyConnected="
140626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProvidersSuccessfullyConnected);
140708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mTotalSsidsInScanHistogram:"
140808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mTotalSsidsInScanHistogram.toString());
140908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mTotalBssidsInScanHistogram:"
141008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mTotalBssidsInScanHistogram.toString());
141108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenSsidsInScanHistogram:"
141208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenSsidsInScanHistogram.toString());
141308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenBssidsInScanHistogram:"
141408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenBssidsInScanHistogram.toString());
141508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedSsidsInScanHistogram:"
141608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedSsidsInScanHistogram.toString());
141708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedBssidsInScanHistogram:"
141808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedBssidsInScanHistogram.toString());
141908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenOrSavedSsidsInScanHistogram:"
142008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenOrSavedSsidsInScanHistogram.toString());
142108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenOrSavedBssidsInScanHistogram:"
142208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenOrSavedBssidsInScanHistogram.toString());
142308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedPasspointProviderProfilesInScanHistogram:"
142408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedPasspointProviderProfilesInScanHistogram.toString());
142508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedPasspointProviderBssidsInScanHistogram:"
142608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedPasspointProviderBssidsInScanHistogram.toString());
142708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mWifiLogProto.partialAllSingleScanListenerResults="
142808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mWifiLogProto.partialAllSingleScanListenerResults);
142908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mWifiLogProto.fullBandAllSingleScanListenerResults="
143008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mWifiLogProto.fullBandAllSingleScanListenerResults);
1431910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen                pw.println("mWifiAwareMetrics:");
1432910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen                mWifiAwareMetrics.dump(fd, pw, args);
14331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
14341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
14351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
14361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
14373c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    /**
14383c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     * Update various counts of saved network types
14393c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     * @param networks List of WifiConfigurations representing all saved networks, must not be null
14403c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     */
14413c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    public void updateSavedNetworks(List<WifiConfiguration> networks) {
14423c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne        synchronized (mLock) {
14433c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numSavedNetworks = networks.size();
14443c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numOpenNetworks = 0;
14453c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numPersonalNetworks = 0;
14463c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numEnterpriseNetworks = 0;
14473c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numNetworksAddedByUser = 0;
14483c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numNetworksAddedByApps = 0;
14493c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numHiddenNetworks = 0;
14503c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numPasspointNetworks = 0;
14513c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            for (WifiConfiguration config : networks) {
14523c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
14533c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numOpenNetworks++;
14543c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else if (config.isEnterprise()) {
14553c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numEnterpriseNetworks++;
14563c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else {
14573c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numPersonalNetworks++;
14583c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
14593c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.selfAdded) {
14603c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numNetworksAddedByUser++;
14613c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else {
14623c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numNetworksAddedByApps++;
14633c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
14643c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.hiddenSSID) {
14653c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numHiddenNetworks++;
14663c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
14673c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.isPasspoint()) {
14683c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numPasspointNetworks++;
14693c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
14703c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            }
14713c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne        }
14723c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    }
14733c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne
14741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
147549357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * Update metrics for saved Passpoint profiles.
147626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     *
147726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * @param numSavedProfiles The number of saved Passpoint profiles
147849357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * @param numConnectedProfiles The number of saved Passpoint profiles that have ever resulted
147949357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     *                             in a successful network connection
148026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
148149357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu    public void updateSavedPasspointProfiles(int numSavedProfiles, int numConnectedProfiles) {
148226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
148326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviders = numSavedProfiles;
148449357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu            mWifiLogProto.numPasspointProvidersSuccessfullyConnected = numConnectedProfiles;
148526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
148626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
148726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
148826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
1489c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their
1490c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * respective lists within mWifiLogProto
14911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
14921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param incremental Only include ConnectionEvents created since last automatic bug report
14931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
14941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private void consolidateProto(boolean incremental) {
14951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>();
14967a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>();
14975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        List<WifiMetricsProto.RssiPollCount> rssiDeltas = new ArrayList<>();
1498f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>();
14994569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        List<WifiMetricsProto.WifiScoreCount> scores = new ArrayList<>();
15001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
15011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            for (ConnectionEvent event : mConnectionEventList) {
1502c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // If this is not incremental, dump full ConnectionEvent list
1503c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // Else Dump all un-dumped events except for the current one
15041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                if (!incremental || ((mCurrentConnectionEvent != event)
15051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        && !event.mConnectionEvent.automaticBugReportTaken)) {
15061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //Get all ConnectionEvents that haven not been dumped as a proto, also exclude
15071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //the current active un-ended connection event
15081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    events.add(event.mConnectionEvent);
1509c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    if (incremental) {
1510c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
1511c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    }
15121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
15131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
15141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            if (events.size() > 0) {
15151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent);
15161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
1517c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1518c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list
1519c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.scanReturnEntries =
1520c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()];
1521c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mScanReturnEntries.size(); i++) {
1522c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry();
1523c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i);
1524c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i);
1525c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
1526c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1527c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list
1528c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // This one is slightly more complex, as the Sparse are indexed with:
1529c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //     key: wifiState * 2 + isScreenOn, value: wifiStateCount
1530c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.wifiSystemStateEntries =
1531c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog
1532c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    .WifiSystemStateEntry[mWifiSystemStateEntries.size()];
1533c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mWifiSystemStateEntries.size(); i++) {
1534c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i] =
1535c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        new WifiMetricsProto.WifiLog.WifiSystemStateEntry();
1536c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiState =
1537c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.keyAt(i) / 2;
1538c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount =
1539c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.valueAt(i);
1540c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].isScreenOn =
1541c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        (mWifiSystemStateEntries.keyAt(i) % 2) > 0;
1542c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
1543107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000)
1544107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    - mRecordStartTimeSec);
15457a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
15467a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            /**
15477a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             * Convert the SparseIntArray of RSSI poll rssi's and counts to the proto's repeated
15487a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             * IntKeyVal array.
15497a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             */
15507a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            for (int i = 0; i < mRssiPollCounts.size(); i++) {
15517a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
15527a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                keyVal.rssi = mRssiPollCounts.keyAt(i);
15537a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                keyVal.count = mRssiPollCounts.valueAt(i);
15547a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                rssis.add(keyVal);
15557a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            }
15567a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount);
1557f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
1558f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            /**
15595cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             * Convert the SparseIntArray of RSSI delta rssi's and counts to the proto's repeated
15605cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             * IntKeyVal array.
15615cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             */
15625cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            for (int i = 0; i < mRssiDeltaCounts.size(); i++) {
15635cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
15645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                keyVal.rssi = mRssiDeltaCounts.keyAt(i);
15655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                keyVal.count = mRssiDeltaCounts.valueAt(i);
15665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                rssiDeltas.add(keyVal);
15675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
15685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mWifiLogProto.rssiPollDeltaCount = rssiDeltas.toArray(mWifiLogProto.rssiPollDeltaCount);
15695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne
15705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            /**
1571f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * Convert the SparseIntArray of alert reasons and counts to the proto's repeated
1572f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * IntKeyVal array.
1573f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             */
1574f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) {
1575f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount();
1576f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.reason = mWifiAlertReasonCounts.keyAt(i);
1577f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.count = mWifiAlertReasonCounts.valueAt(i);
1578f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                alertReasons.add(keyVal);
1579f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            }
1580f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount);
15814569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao
15824569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            /**
15834569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            *  Convert the SparseIntArray of Wifi Score and counts to proto's repeated
15844569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            * IntKeyVal array.
15854569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            */
15864569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            for (int score = 0; score < mWifiScoreCounts.size(); score++) {
15874569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                WifiMetricsProto.WifiScoreCount keyVal = new WifiMetricsProto.WifiScoreCount();
15884569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                keyVal.score = mWifiScoreCounts.keyAt(score);
15894569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                keyVal.count = mWifiScoreCounts.valueAt(score);
15904569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                scores.add(keyVal);
15914569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            }
15924569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiLogProto.wifiScoreCount = scores.toArray(mWifiLogProto.wifiScoreCount);
159344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
159444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            /**
159544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             * Convert the SparseIntArray of SoftAp Return codes and counts to proto's repeated
159644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             * IntKeyVal array.
159744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             */
159844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            int codeCounts = mSoftApManagerReturnCodeCounts.size();
159944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            mWifiLogProto.softApReturnCode = new WifiMetricsProto.SoftApReturnCodeCount[codeCounts];
160044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            for (int sapCode = 0; sapCode < codeCounts; sapCode++) {
160144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode] =
160244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        new WifiMetricsProto.SoftApReturnCodeCount();
160344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode].startResult =
160444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        mSoftApManagerReturnCodeCounts.keyAt(sapCode);
160544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode].count =
160644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        mSoftApManagerReturnCodeCounts.valueAt(sapCode);
160744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
1608d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
1609d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            /**
1610d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne             * Convert StaEventList to array of StaEvents
1611d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne             */
1612d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            mWifiLogProto.staEventList = new StaEvent[mStaEventList.size()];
1613d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            for (int i = 0; i < mStaEventList.size(); i++) {
1614d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                mWifiLogProto.staEventList[i] = mStaEventList.get(i).staEvent;
1615d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            }
161608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.totalSsidsInScanHistogram =
161708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mTotalSsidsInScanHistogram);
161808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.totalBssidsInScanHistogram =
161908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mTotalBssidsInScanHistogram);
162008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenSsidsInScanHistogram =
162108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableOpenSsidsInScanHistogram);
162208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenBssidsInScanHistogram =
162308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableOpenBssidsInScanHistogram);
162408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedSsidsInScanHistogram =
162508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableSavedSsidsInScanHistogram);
162608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedBssidsInScanHistogram =
162708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableSavedBssidsInScanHistogram);
162808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenOrSavedSsidsInScanHistogram =
162908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
163008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableOpenOrSavedSsidsInScanHistogram);
163108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenOrSavedBssidsInScanHistogram =
163208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
163308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableOpenOrSavedBssidsInScanHistogram);
163408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedPasspointProviderProfilesInScanHistogram =
163508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
163608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableSavedPasspointProviderProfilesInScanHistogram);
163708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedPasspointProviderBssidsInScanHistogram =
163808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
163908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableSavedPasspointProviderBssidsInScanHistogram);
1640910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen            mWifiLogProto.wifiAwareLog = mWifiAwareMetrics.consolidateProto();
1641ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        }
16421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
16432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
164408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiMetricsProto.NumConnectableNetworksBucket[] makeNumConnectableNetworksBucketArray(
164508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            SparseIntArray sia) {
164608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        WifiMetricsProto.NumConnectableNetworksBucket[] array =
164708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                new WifiMetricsProto.NumConnectableNetworksBucket[sia.size()];
164808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        for (int i = 0; i < sia.size(); i++) {
164908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            WifiMetricsProto.NumConnectableNetworksBucket keyVal =
165008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    new WifiMetricsProto.NumConnectableNetworksBucket();
165108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            keyVal.numConnectableNetworks = sia.keyAt(i);
165208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            keyVal.count = sia.valueAt(i);
165308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            array[i] = keyVal;
165408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        }
165508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        return array;
165608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
165708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
16582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
16592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * Clear all WifiMetrics, except for currentConnectionEvent.
16602532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
16612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private void clear() {
16622532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        synchronized (mLock) {
16632532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEventList.clear();
16642532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
16652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mConnectionEventList.add(mCurrentConnectionEvent);
16662532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
16672532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mScanReturnEntries.clear();
16682532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiSystemStateEntries.clear();
1669107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
16707a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mRssiPollCounts.clear();
16715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mRssiDeltaCounts.clear();
1672f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.clear();
16734569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiScoreCounts.clear();
16742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiLogProto.clear();
16755cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
167644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            mSoftApManagerReturnCodeCounts.clear();
167746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            mStaEventList.clear();
1678910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen            mWifiAwareMetrics.clear();
167908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mTotalSsidsInScanHistogram.clear();
168008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mTotalBssidsInScanHistogram.clear();
168108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenSsidsInScanHistogram.clear();
168208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenBssidsInScanHistogram.clear();
168308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedSsidsInScanHistogram.clear();
168408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedBssidsInScanHistogram.clear();
168508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenOrSavedSsidsInScanHistogram.clear();
168608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenOrSavedBssidsInScanHistogram.clear();
168708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedPasspointProviderProfilesInScanHistogram.clear();
168808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedPasspointProviderBssidsInScanHistogram.clear();
16892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
16902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
1691ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
1692ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
1693ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set screen state (On/Off)
1694ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
1695ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setScreenState(boolean screenOn) {
1696ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
1697ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = screenOn;
1698ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
1699ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
1700ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
1701ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
1702ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED)
1703ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
1704ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setWifiState(int wifiState) {
1705ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
1706ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = wifiState;
1707ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
1708ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
170946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
171046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
171146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Message handler for interesting WifiMonitor messages. Generates StaEvents
171246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
171346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private void processMessage(Message msg) {
171446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StaEvent event = new StaEvent();
171546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        boolean logEvent = true;
171646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (msg.what) {
171746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.ASSOCIATION_REJECTION_EVENT:
171846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT;
171946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.associationTimedOut = msg.arg1 > 0 ? true : false;
172046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.status = msg.arg2;
172146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
172246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.AUTHENTICATION_FAILURE_EVENT:
172346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT;
172446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                switch (msg.arg2) {
172546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_NONE:
172646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_NONE;
172746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
172846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_TIMEOUT:
172946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_TIMEOUT;
173046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
173146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD:
173246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_WRONG_PSWD;
173346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
173446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE:
173546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_EAP_FAILURE;
173646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
173746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    default:
173846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
173946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
174046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
174146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.NETWORK_CONNECTION_EVENT:
174246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_NETWORK_CONNECTION_EVENT;
174346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
174446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.NETWORK_DISCONNECTION_EVENT:
174546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT;
174646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.reason = msg.arg2;
174746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.localGen = msg.arg1 == 0 ? false : true;
174846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
174946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT:
175046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                logEvent = false;
175146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                StateChangeResult stateChangeResult = (StateChangeResult) msg.obj;
175246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                mSupplicantStateChangeBitmask |= supplicantStateToBit(stateChangeResult.state);
175346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
175446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiStateMachine.CMD_ASSOCIATED_BSSID:
175546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_CMD_ASSOCIATED_BSSID;
175646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
175746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiStateMachine.CMD_TARGET_BSSID:
175846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_CMD_TARGET_BSSID;
175946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
176046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
176146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return;
176246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
176346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (logEvent) {
176446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            addStaEvent(event);
176546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
176646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
176746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
176846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
176946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
177046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
177146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
177246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type) {
177346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, null);
177446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
177546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
177646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
177746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
177846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
177946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param config WifiConfiguration for a framework initiated connection attempt
178046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
178146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, WifiConfiguration config) {
178246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, config);
178346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
178446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
178546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
178646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
178746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
178846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework
178946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     *                                  initiated a FRAMEWORK_DISCONNECT
179046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
179146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, int frameworkDisconnectReason) {
179246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, frameworkDisconnectReason, null);
179346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
179446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
179546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
179646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
179746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
179846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework
179946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     *                                  initiated a FRAMEWORK_DISCONNECT
180046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param config WifiConfiguration for a framework initiated connection attempt
180146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
180246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, int frameworkDisconnectReason, WifiConfiguration config) {
180346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (type) {
180446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL:
180546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST:
180646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST:
180746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_CONNECT:
180846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_ROAM:
180946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CONNECT_NETWORK:
181046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK:
181146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_FRAMEWORK_DISCONNECT:
181246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
181346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
181446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                Log.e(TAG, "Unknown StaEvent:" + type);
181546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return;
181646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
181746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StaEvent event = new StaEvent();
181846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        event.type = type;
181946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (frameworkDisconnectReason != StaEvent.DISCONNECT_UNKNOWN) {
182046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            event.frameworkDisconnectReason = frameworkDisconnectReason;
182146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
182246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        event.configInfo = createConfigInfo(config);
182346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        addStaEvent(event);
182446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
182546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
182646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private void addStaEvent(StaEvent staEvent) {
182746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.startTimeMillis = mClock.getElapsedSinceBootMillis();
182846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastRssi = mLastPollRssi;
182946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastFreq = mLastPollFreq;
183046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastLinkSpeed = mLastPollLinkSpeed;
183146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.supplicantStateChangesBitmask = mSupplicantStateChangeBitmask;
183246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mSupplicantStateChangeBitmask = 0;
183346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollRssi = -127;
183446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollFreq = -1;
183546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollLinkSpeed = -1;
1836d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        mStaEventList.add(new StaEventWithTime(staEvent, mClock.getWallClockMillis()));
183746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        // Prune StaEventList if it gets too long
183846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (mStaEventList.size() > MAX_STA_EVENTS) mStaEventList.remove();
183946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
184046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
184146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private ConfigInfo createConfigInfo(WifiConfiguration config) {
184246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (config == null) return null;
184346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        ConfigInfo info = new ConfigInfo();
184446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedKeyManagement = bitSetToInt(config.allowedKeyManagement);
184546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedProtocols = bitSetToInt(config.allowedProtocols);
184646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedAuthAlgorithms = bitSetToInt(config.allowedAuthAlgorithms);
184746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedPairwiseCiphers = bitSetToInt(config.allowedPairwiseCiphers);
184846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedGroupCiphers = bitSetToInt(config.allowedGroupCiphers);
184946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.hiddenSsid = config.hiddenSSID;
185046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.isPasspoint = config.isPasspoint();
185146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.isEphemeral = config.isEphemeral();
185246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.hasEverConnected = config.getNetworkSelectionStatus().getHasEverConnected();
185346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
185446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (candidate != null) {
185546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            info.scanRssi = candidate.level;
185646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            info.scanFreq = candidate.frequency;
185746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
185846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return info;
185946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
186046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
186146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public Handler getHandler() {
186246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return mHandler;
186346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
186446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
1865910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    public WifiAwareMetrics getWifiAwareMetrics() {
1866910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen        return mWifiAwareMetrics;
1867910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    }
1868910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen
186946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    // Rather than generate a StaEvent for each SUPPLICANT_STATE_CHANGE, cache these in a bitmask
187046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    // and attach it to the next event which is generated.
187146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mSupplicantStateChangeBitmask = 0;
187246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
187346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
187446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Converts a SupplicantState value to a single bit, with position defined by
187546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * {@code StaEvent.SupplicantState}
187646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
187746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static int supplicantStateToBit(SupplicantState state) {
187846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch(state) {
187946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case DISCONNECTED:
188046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_DISCONNECTED;
188146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INTERFACE_DISABLED:
188246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INTERFACE_DISABLED;
188346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INACTIVE:
188446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INACTIVE;
188546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case SCANNING:
188646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_SCANNING;
188746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case AUTHENTICATING:
188846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_AUTHENTICATING;
188946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case ASSOCIATING:
189046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_ASSOCIATING;
189146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case ASSOCIATED:
189246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_ASSOCIATED;
189346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case FOUR_WAY_HANDSHAKE:
189446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE;
189546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case GROUP_HANDSHAKE:
189646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_GROUP_HANDSHAKE;
189746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case COMPLETED:
189846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_COMPLETED;
189946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case DORMANT:
190046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_DORMANT;
190146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case UNINITIALIZED:
190246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_UNINITIALIZED;
190346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INVALID:
190446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INVALID;
190546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
190646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                Log.wtf(TAG, "Got unknown supplicant state: " + state.ordinal());
190746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 0;
190846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
190946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
191046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
191146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String supplicantStateChangesBitmaskToString(int mask) {
191246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
1913d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        sb.append("supplicantStateChangeEvents: {");
191446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_DISCONNECTED)) > 0) sb.append(" DISCONNECTED");
191546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INTERFACE_DISABLED)) > 0) sb.append(" INTERFACE_DISABLED");
191646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INACTIVE)) > 0) sb.append(" INACTIVE");
191746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_SCANNING)) > 0) sb.append(" SCANNING");
191846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_AUTHENTICATING)) > 0) sb.append(" AUTHENTICATING");
191946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_ASSOCIATING)) > 0) sb.append(" ASSOCIATING");
192046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_ASSOCIATED)) > 0) sb.append(" ASSOCIATED");
192146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE)) > 0) sb.append(" FOUR_WAY_HANDSHAKE");
192246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_GROUP_HANDSHAKE)) > 0) sb.append(" GROUP_HANDSHAKE");
192346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_COMPLETED)) > 0) sb.append(" COMPLETED");
192446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_DORMANT)) > 0) sb.append(" DORMANT");
192546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_UNINITIALIZED)) > 0) sb.append(" UNINITIALIZED");
192646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INVALID)) > 0) sb.append(" INVALID");
192746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        sb.append("}");
192846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
192946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
193046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
193146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
193246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Returns a human readable string from a Sta Event. Only adds information relevant to the event
193346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * type.
193446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
193546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static String staEventToString(StaEvent event) {
193646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event == null) return "<NULL>";
193746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
193846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (event.type) {
193946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT:
1940d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("ASSOCIATION_REJECTION_EVENT")
194146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" timedOut=").append(event.associationTimedOut)
194246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" status=").append(event.status).append(":")
194346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(ISupplicantStaIfaceCallback.StatusCode.toString(event.status));
194446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
194546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT:
1946d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("AUTHENTICATION_FAILURE_EVENT reason=").append(event.authFailureReason)
194746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(":").append(authFailureReasonToString(event.authFailureReason));
194846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
194946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_CONNECTION_EVENT:
1950d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_CONNECTION_EVENT");
195146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
195246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT:
1953d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_DISCONNECTION_EVENT")
195446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" local_gen=").append(event.localGen)
195546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" reason=").append(event.reason).append(":")
195646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(ISupplicantStaIfaceCallback.ReasonCode.toString(
195746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                                (event.reason >= 0 ? event.reason : -1 * event.reason)));
195846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
195946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_ASSOCIATED_BSSID:
1960d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_ASSOCIATED_BSSID");
196146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
196246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL:
1963d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_CONFIGURATION_SUCCESSFUL");
196446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
196546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST:
1966d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_CONFIGURATION_LOST");
196746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
196846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST:
1969d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_REACHABILITY_LOST");
197046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
197146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_TARGET_BSSID:
1972d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_TARGET_BSSID");
197346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
197446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_CONNECT:
1975d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_START_CONNECT");
197646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
197746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_ROAM:
1978d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_START_ROAM");
197946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
198046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CONNECT_NETWORK:
1981d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CONNECT_NETWORK");
198246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
198346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK:
1984d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_AGENT_VALID_NETWORK");
198546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
198646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_FRAMEWORK_DISCONNECT:
1987d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("FRAMEWORK_DISCONNECT")
198846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" reason=")
198946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(frameworkDisconnectReasonToString(event.frameworkDisconnectReason));
199046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
199146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
199246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                sb.append("UNKNOWN " + event.type + ":");
199346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
199446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
199546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastRssi != -127) sb.append(" lastRssi=").append(event.lastRssi);
199646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastFreq != -1) sb.append(" lastFreq=").append(event.lastFreq);
199746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastLinkSpeed != -1) sb.append(" lastLinkSpeed=").append(event.lastLinkSpeed);
199846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.supplicantStateChangesBitmask != 0) {
1999d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(", ").append(supplicantStateChangesBitmaskToString(
200046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    event.supplicantStateChangesBitmask));
200146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
200246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.configInfo != null) {
2003d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(", ").append(configInfoToString(event.configInfo));
200446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
200546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
200646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
200746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
200846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
200946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String authFailureReasonToString(int authFailureReason) {
201046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (authFailureReason) {
201146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_NONE:
201246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_NONE";
201346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_TIMEOUT:
201446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_TIMEOUT";
201546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_WRONG_PSWD:
201646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_WRONG_PSWD";
201746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_EAP_FAILURE:
201846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_EAP_FAILURE";
201946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
202046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "";
202146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
202246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
202346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
202446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String frameworkDisconnectReasonToString(int frameworkDisconnectReason) {
202546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (frameworkDisconnectReason) {
202646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_API:
202746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_API";
202846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_GENERIC:
202946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_GENERIC";
203046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_UNWANTED:
203146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_UNWANTED";
203246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_ROAM_WATCHDOG_TIMER:
203346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_ROAM_WATCHDOG_TIMER";
203446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST:
203546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST";
203646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_RESET_SIM_NETWORKS:
203746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_RESET_SIM_NETWORKS";
203846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
203946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_UNKNOWN=" + frameworkDisconnectReason;
204046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
204146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
204246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
204346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String configInfoToString(ConfigInfo info) {
204446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
204546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        sb.append("ConfigInfo:")
204646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_key_management=").append(info.allowedKeyManagement)
204746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_protocols=").append(info.allowedProtocols)
204846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_auth_algorithms=").append(info.allowedAuthAlgorithms)
204946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_pairwise_ciphers=").append(info.allowedPairwiseCiphers)
205046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_group_ciphers=").append(info.allowedGroupCiphers)
205146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" hidden_ssid=").append(info.hiddenSsid)
205246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" is_passpoint=").append(info.isPasspoint)
205346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" is_ephemeral=").append(info.isEphemeral)
205446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" has_ever_connected=").append(info.hasEverConnected)
205546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" scan_rssi=").append(info.scanRssi)
205646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" scan_freq=").append(info.scanFreq);
205746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
205846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
205946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
206046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static final int MAX_STA_EVENTS = 512;
2061d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    private LinkedList<StaEventWithTime> mStaEventList = new LinkedList<StaEventWithTime>();
206246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollRssi = -127;
206346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollLinkSpeed = -1;
206446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollFreq = -1;
206546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
206646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
206746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Converts the first 31 bits of a BitSet to a little endian int
206846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
206946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static int bitSetToInt(BitSet bits) {
207046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        int value = 0;
207146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        int nBits = bits.length() < 31 ? bits.length() : 31;
207246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        for (int i = 0; i < nBits; i++) {
207346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            value += bits.get(i) ? (1 << i) : 0;
207446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
207546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return value;
207646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
207708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementSsid(SparseIntArray sia, int element) {
207808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_CONNECTABLE_SSID_NETWORK_BUCKET));
207908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
208008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementBssid(SparseIntArray sia, int element) {
208108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_CONNECTABLE_BSSID_NETWORK_BUCKET));
208208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
208308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementTotalScanResults(SparseIntArray sia, int element) {
208408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULTS_BUCKET));
208508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
208608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementTotalScanSsids(SparseIntArray sia, int element) {
208708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET));
208808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
208908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void increment(SparseIntArray sia, int element) {
209008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        int count = sia.get(element);
209108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        sia.put(element, count + 1);
209208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
2093d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2094d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    private static class StaEventWithTime {
2095d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public StaEvent staEvent;
2096d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public long wallClockMillis;
2097d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2098d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        StaEventWithTime(StaEvent event, long wallClockMillis) {
2099d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            staEvent = event;
2100d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            this.wallClockMillis = wallClockMillis;
2101d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        }
2102d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2103d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public String toString() {
2104d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            StringBuilder sb = new StringBuilder();
2105d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            Calendar c = Calendar.getInstance();
2106d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            c.setTimeInMillis(wallClockMillis);
2107d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            if (wallClockMillis != 0) {
2108d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
2109d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            } else {
2110d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("                  ");
2111d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            }
2112d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(" ").append(staEventToString(staEvent));
2113d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            return sb.toString();
2114d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        }
2115d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    }
21161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne}
2117