WifiMetrics.java revision 28a6c752451084392a71b3c70d984ef9e066d4e2
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
34e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plassimport com.android.internal.annotations.VisibleForTesting;
35910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohenimport com.android.server.wifi.aware.WifiAwareMetrics;
369831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport com.android.server.wifi.hotspot2.ANQPNetworkKey;
37f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail;
3808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointManager;
3908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointMatch;
4008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointProvider;
419831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport com.android.server.wifi.hotspot2.Utils;
42da94688198c864bb29be2e9603ebbe9ae6492a87Tamas Berghammerimport com.android.server.wifi.nano.WifiMetricsProto;
43a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chenimport com.android.server.wifi.nano.WifiMetricsProto.ConnectToNetworkNotificationAndActionCount;
44a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadehimport com.android.server.wifi.nano.WifiMetricsProto.PnoScanMetrics;
4505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadehimport com.android.server.wifi.nano.WifiMetricsProto.SoftApConnectedClientsEvent;
4646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent;
4746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent.ConfigInfo;
4862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kimimport com.android.server.wifi.nano.WifiMetricsProto.WpsMetrics;
4902e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohenimport com.android.server.wifi.rtt.RttMetrics;
50f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil;
5159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport com.android.server.wifi.util.ScanResultUtil;
52f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor;
541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter;
551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList;
5646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.BitSet;
571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar;
589831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport java.util.HashMap;
5908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.HashSet;
6046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.LinkedList;
611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List;
629831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport java.util.Map;
6308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.Set;
641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/**
661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated.
671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include:
681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Aggregated connection stats (num of connections, num of failures, ...)
691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Discrete connection event stats (time, duration, failure codes, ...)
701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Router details (technology type, authentication type, ...)
711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Scan stats
721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */
731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics {
741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final String TAG = "WifiMetrics";
75c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final boolean DBG = false;
767a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL
787a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MAX_RSSI_POLL = 0;
807a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MIN_RSSI_POLL = -127;
815cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final int MAX_RSSI_DELTA = 127;
825cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final int MIN_RSSI_DELTA = -127;
835cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Maximum time period between ScanResult and RSSI poll to generate rssi delta datapoint */
845cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final long TIMEOUT_RSSI_DELTA_MILLIS =  3000;
854569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private static final int MIN_WIFI_SCORE = 0;
864569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private static final int MAX_WIFI_SCORE = NetworkAgent.WIFI_BASE_SCORE;
87e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    @VisibleForTesting
88e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    static final int LOW_WIFI_SCORE = 50; // Mobile data score
891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private final Object mLock = new Object();
902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private static final int MAX_CONNECTION_EVENTS = 256;
9108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    // Largest bucket in the NumConnectableNetworkCount histogram,
9208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    // anything large will be stored in this bucket
9308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_CONNECTABLE_SSID_NETWORK_BUCKET = 20;
9408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_CONNECTABLE_BSSID_NETWORK_BUCKET = 50;
9508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET = 100;
9608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_TOTAL_SCAN_RESULTS_BUCKET = 250;
979831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_TOTAL_PASSPOINT_APS_BUCKET = 50;
989831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET = 20;
999831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET = 50;
100973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    public static final int MAX_TOTAL_80211MC_APS_BUCKET = 20;
101a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private static final int CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER = 1000;
10205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    // Max limit for number of soft AP related events, extra events will be dropped.
10305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private static final int MAX_NUM_SOFT_AP_EVENTS = 256;
104107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private Clock mClock;
105ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private boolean mScreenOn;
106ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private int mWifiState;
107910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    private WifiAwareMetrics mWifiAwareMetrics;
10802e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen    private RttMetrics mRttMetrics;
109a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    private final PnoScanMetrics mPnoScanMetrics = new PnoScanMetrics();
11062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    private final WpsMetrics mWpsMetrics = new WpsMetrics();
11146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private Handler mHandler;
11208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiConfigManager mWifiConfigManager;
11308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiNetworkSelector mWifiNetworkSelector;
11408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private PasspointManager mPasspointManager;
1151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Metrics are stored within an instance of the WifiLog proto during runtime,
1171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during
1181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced
1191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * together at dump-time
1201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1217a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog();
1221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Session information that gets logged for every Wifi connection attempt.
1241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1257a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>();
1261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The latest started (but un-ended) connection attempt
1281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private ConnectionEvent mCurrentConnectionEvent;
1301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode
1321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1337a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mScanReturnEntries = new SparseIntArray();
1341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Mapping of system state to the counts of scans requested in that wifi state * screenOn
1361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * combination. Indexed by WifiLog.WifiState * (1 + screenOn)
1371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1387a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray();
139f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of RSSI values to counts. */
140f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mRssiPollCounts = new SparseIntArray();
1415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Mapping of RSSI scan-poll delta values to counts. */
1425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private final SparseIntArray mRssiDeltaCounts = new SparseIntArray();
1435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** RSSI of the scan result for the last connection event*/
1445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private int mScanResultRssi = 0;
1455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Boot-relative timestamp when the last candidate scanresult was received, used to calculate
1465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        RSSI deltas. -1 designates no candidate scanResult being tracked */
1475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private long mScanResultRssiTimestampMillis = -1;
148f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of alert reason to the respective alert count. */
149f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray();
150107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    /**
151107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data
152107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * capture for for this WifiMetricsProto
153107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     */
154107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private long mRecordStartTimeSec;
1554569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    /** Mapping of Wifi Scores to counts */
1564569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private final SparseIntArray mWifiScoreCounts = new SparseIntArray();
15744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    /** Mapping of SoftApManager start SoftAp return codes to counts */
15844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    private final SparseIntArray mSoftApManagerReturnCodeCounts = new SparseIntArray();
15908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
16008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mTotalSsidsInScanHistogram = new SparseIntArray();
16108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mTotalBssidsInScanHistogram = new SparseIntArray();
16208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenSsidsInScanHistogram = new SparseIntArray();
16308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenBssidsInScanHistogram = new SparseIntArray();
16408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedSsidsInScanHistogram = new SparseIntArray();
16508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedBssidsInScanHistogram = new SparseIntArray();
16608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenOrSavedSsidsInScanHistogram = new SparseIntArray();
16708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenOrSavedBssidsInScanHistogram = new SparseIntArray();
16808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedPasspointProviderProfilesInScanHistogram =
16908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            new SparseIntArray();
17008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedPasspointProviderBssidsInScanHistogram =
17108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            new SparseIntArray();
17208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
173a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Mapping of "Connect to Network" notifications to counts. */
174a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private final SparseIntArray mConnectToNetworkNotificationCount = new SparseIntArray();
175a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Mapping of "Connect to Network" notification user actions to counts. */
176a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private final SparseIntArray mConnectToNetworkNotificationActionCount = new SparseIntArray();
177a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mOpenNetworkRecommenderBlacklistSize = 0;
178a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private boolean mIsWifiNetworksAvailableNotificationOn = false;
179a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mNumOpenNetworkConnectMessageFailedToSend = 0;
180a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mNumOpenNetworkRecommendationUpdates = 0;
18105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /** List of soft AP events related to number of connected clients in tethered mode */
18205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private final List<SoftApConnectedClientsEvent> mSoftApEventListTethered = new ArrayList<>();
18305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /** List of soft AP events related to number of connected clients in local only mode */
18405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private final List<SoftApConnectedClientsEvent> mSoftApEventListLocalOnly = new ArrayList<>();
185a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1869831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1ApInScanHistogram = new SparseIntArray();
1879831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2ApInScanHistogram = new SparseIntArray();
1889831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1EssInScanHistogram = new SparseIntArray();
1899831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2EssInScanHistogram = new SparseIntArray();
1909831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1ApsPerEssInScanHistogram = new SparseIntArray();
1919831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2ApsPerEssInScanHistogram = new SparseIntArray();
1929831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
193973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    private final SparseIntArray mObserved80211mcApInScanHistogram = new SparseIntArray();
194973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
195fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray    /** Wifi power metrics*/
196fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray    private WifiPowerMetrics mWifiPowerMetrics = new WifiPowerMetrics();
197fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray
19812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    /** Wifi Wake metrics */
19912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    private final WifiWakeMetrics mWifiWakeMetrics = new WifiWakeMetrics();
20012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
20128a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim    private boolean mIsMacRandomizationOn = false;
20228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim
2031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class RouterFingerPrint {
2041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto;
2052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        RouterFingerPrint() {
2061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint();
2071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
2101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
2111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
2121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType);
2131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo);
2141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mDtim=" + mRouterFingerPrintProto.dtim);
2151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication);
2161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mHidden=" + mRouterFingerPrintProto.hidden);
2171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology);
2181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6);
2191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
2201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
2211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        public void updateFromWifiConfiguration(WifiConfiguration config) {
223ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            synchronized (mLock) {
224ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (config != null) {
225ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Is this a hidden network
226ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mRouterFingerPrintProto.hidden = config.hiddenSSID;
227ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Config may not have a valid dtimInterval set yet, in which case dtim will be zero
228ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // (These are only populated from beacon frame scan results, which are returned as
229ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // scan results from the chip far less frequently than Probe-responses)
230ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.dtimInterval > 0) {
231ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mRouterFingerPrintProto.dtim = config.dtimInterval;
232ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
233ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mCurrentConnectionEvent.mConfigSsid = config.SSID;
234ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Get AuthType information from config (We do this again from ScanResult after
235ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // associating with BSSID)
236ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.allowedKeyManagement != null
237ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                            && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
238ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
239ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
240ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else if (config.isEnterprise()) {
241ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
242ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
243ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else {
244ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
245ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
246ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
24759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
24859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                            .passpoint = config.isPasspoint();
249ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // If there's a ScanResult candidate associated with this config already, get it and
250ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // log (more accurate) metrics from it
251ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
252ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (candidate != null) {
253ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        updateMetricsFromScanResult(candidate);
254ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
25596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
2562532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
2572532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
2581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
2591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
2611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Log event, tracking the start time, end time and result of a wireless connection attempt.
2621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
2631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class ConnectionEvent {
2641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        WifiMetricsProto.ConnectionEvent mConnectionEvent;
26596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field
26696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //covering more than just l2 failures. see b/27652362
26796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        /**
26896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot
26996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * more failures than just l2 though, since the proto does not have a place to log
27096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * framework failures)
27196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         */
2722532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // Failure is unknown
27396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_UNKNOWN = 0;
2742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NONE
27596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NONE = 1;
2762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // ASSOCIATION_REJECTION_EVENT
27796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ASSOCIATION_REJECTION = 2;
2782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // AUTHENTICATION_FAILURE_EVENT
27996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_AUTHENTICATION_FAILURE = 3;
2802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // SSID_TEMP_DISABLED (Also Auth failure)
28196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_SSID_TEMP_DISABLED = 4;
2824dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // reconnect() or reassociate() call to WifiNative failed
28396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_CONNECT_NETWORK_FAILED = 5;
2842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NETWORK_DISCONNECTION_EVENT
28596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NETWORK_DISCONNECTION = 6;
2864dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // NEW_CONNECTION_ATTEMPT before previous finished
28796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7;
28896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // New connection attempt to the same network & bssid
28996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8;
29096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // Roam Watchdog timer triggered (Roaming timed out)
29196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ROAM_TIMEOUT = 9;
29296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // DHCP failure
29396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_DHCP = 10;
294b195838541edf2597659b217291079c52623d85cRoshan Pius        // ASSOCIATION_TIMED_OUT
295b195838541edf2597659b217291079c52623d85cRoshan Pius        public static final int FAILURE_ASSOCIATION_TIMED_OUT = 11;
29696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne
2974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        RouterFingerPrint mRouterFingerPrint;
2984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealStartTime;
2994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealEndTime;
3004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigSsid;
3014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigBssid;
302ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private int mWifiState;
303ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private boolean mScreenOn;
3042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
3051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private ConnectionEvent() {
3061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mConnectionEvent = new WifiMetricsProto.ConnectionEvent();
307947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealEndTime = 0;
308947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealStartTime = 0;
3092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mRouterFingerPrint = new RouterFingerPrint();
3102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto;
3114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigSsid = "<NULL>";
3124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigBssid = "<NULL>";
313ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN;
314ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = false;
3151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
3161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
3171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
3181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
3191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            sb.append("startTime=");
3201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            Calendar c = Calendar.getInstance();
3211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
3221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                c.setTimeInMillis(mConnectionEvent.startTimeMillis);
3231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.startTimeMillis == 0 ? "            <null>" :
3241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
3254dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", SSID=");
3264dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigSsid);
3274dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", BSSID=");
3284dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigBssid);
3294dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", durationMillis=");
3301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.durationTakenToConnectMillis);
3312532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                sb.append(", roamType=");
3324dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.roamType) {
3332532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 1:
3342532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_NONE");
3352532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3362532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 2:
3372532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_DBDC");
3382532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3392532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 3:
3402532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_ENTERPRISE");
3412532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3422532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 4:
3432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_USER_SELECTED");
3442532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3452532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 5:
3462532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNRELATED");
3472532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3482532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    default:
3492532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNKNOWN");
3502532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                }
3514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", connectionResult=");
3524dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.connectionResult);
3531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", level2FailureCode=");
3544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.level2FailureCode) {
35596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NONE:
3564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
3574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
35896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ASSOCIATION_REJECTION:
3594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("ASSOCIATION_REJECTION");
3604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_AUTHENTICATION_FAILURE:
3624dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("AUTHENTICATION_FAILURE");
3634dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_SSID_TEMP_DISABLED:
3654dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("SSID_TEMP_DISABLED");
3664dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_CONNECT_NETWORK_FAILED:
3684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("CONNECT_NETWORK_FAILED");
3694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
37096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NETWORK_DISCONNECTION:
3714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NETWORK_DISCONNECTION");
3724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
37396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NEW_CONNECTION_ATTEMPT:
3744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NEW_CONNECTION_ATTEMPT");
3754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
37696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_REDUNDANT_CONNECTION_ATTEMPT:
37796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("REDUNDANT_CONNECTION_ATTEMPT");
37896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
37996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ROAM_TIMEOUT:
38096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("ROAM_TIMEOUT");
38196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
38296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_DHCP:
38396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("DHCP");
384b195838541edf2597659b217291079c52623d85cRoshan Pius                        break;
385b195838541edf2597659b217291079c52623d85cRoshan Pius                    case FAILURE_ASSOCIATION_TIMED_OUT:
386b195838541edf2597659b217291079c52623d85cRoshan Pius                        sb.append("ASSOCIATION_TIMED_OUT");
387b195838541edf2597659b217291079c52623d85cRoshan Pius                        break;
3884dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
3894dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
3904dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3914dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
3921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", connectivityLevelFailureCode=");
3934dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.connectivityLevelFailureCode) {
3944dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NONE:
3954dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
3964dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_DHCP:
3984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("DHCP");
3994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET:
4014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NO_INTERNET");
4024dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4034dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED:
4044dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNWANTED");
4054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
4074dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
4084dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4094dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
4104dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", signalStrength=");
4114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.signalStrength);
412ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", wifiState=");
413ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                switch(mWifiState) {
414ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISABLED:
415ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISABLED");
416ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
417ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
418ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISCONNECTED");
419ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
420ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
421ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_ASSOCIATED");
422ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
423ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    default:
424ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_UNKNOWN");
425ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
426ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                }
427ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", screenOn=");
428ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(mScreenOn);
429ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(". mRouterFingerprint: ");
4301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mRouterFingerPrint.toString());
4311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
4321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
4331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
43602e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen    public WifiMetrics(Clock clock, Looper looper, WifiAwareMetrics awareMetrics,
43702e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen            RttMetrics rttMetrics) {
438107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mClock = clock;
4391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mCurrentConnectionEvent = null;
440ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mScreenOn = true;
441ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED;
442107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
443910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen        mWifiAwareMetrics = awareMetrics;
44402e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen        mRttMetrics = rttMetrics;
44546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
44646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mHandler = new Handler(looper) {
44746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            public void handleMessage(Message msg) {
44846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                synchronized (mLock) {
44946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    processMessage(msg);
45046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
45146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            }
45246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        };
4531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
45508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal WifiConfigManager member */
45608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setWifiConfigManager(WifiConfigManager wifiConfigManager) {
45708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mWifiConfigManager = wifiConfigManager;
45808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
45908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
46008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal WifiNetworkSelector member */
46108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setWifiNetworkSelector(WifiNetworkSelector wifiNetworkSelector) {
46208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mWifiNetworkSelector = wifiNetworkSelector;
46308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
46408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
46508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal PasspointManager member */
46608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setPasspointManager(PasspointManager passpointManager) {
46708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mPasspointManager = passpointManager;
46808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
46908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
470a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
471a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment total number of attempts to start a pno scan
472a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
473a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanStartAttempCount() {
474a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
475a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanAttempts++;
476a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
477a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
478a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
479a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
480a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment total number of attempts with pno scan failed
481a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
482a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanFailedCount() {
483a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
484a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanFailed++;
485a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
486a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
487a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
488a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
489a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of pno scans started successfully over offload
490a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
491a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanStartedOverOffloadCount() {
492a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
493a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanStartedOverOffload++;
494a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
495a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
496a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
497a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
498a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of pno scans failed over offload
499a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
500a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanFailedOverOffloadCount() {
501a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
502a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanFailedOverOffload++;
503a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
504a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
505a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
506a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
507a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of times pno scan found a result
508a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
509a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoFoundNetworkEventCount() {
510a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
511a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoFoundNetworkEvents++;
512a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
513a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
514a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
51562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
51662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps connection attempts
51762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
51862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsAttemptCount() {
51962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
52062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsAttempts++;
52162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
52262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
52362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
52462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
52562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps connection success
52662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
52762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsSuccessCount() {
52862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
52962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsSuccess++;
53062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
53162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
53262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
53362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
53462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps failure on start
53562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
53662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsStartFailureCount() {
53762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
53862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsStartFailure++;
53962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
54062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
54162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
54262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
54362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps overlap failure
54462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
54562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsOverlapFailureCount() {
54662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
54762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsOverlapFailure++;
54862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
54962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
55062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
55162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
55262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps timeout failure
55362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
55462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsTimeoutFailureCount() {
55562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
55662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsTimeoutFailure++;
55762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
55862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
55962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
56062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
56162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of other wps failure during connection
56262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
56362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsOtherConnectionFailureCount() {
56462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
56562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsOtherConnectionFailure++;
56662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
56762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
56862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
56962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
57062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of supplicant failure after wps
57162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
57262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsSupplicantFailureCount() {
57362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
57462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsSupplicantFailure++;
57562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
57662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
57762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
57862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
57962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps cancellation
58062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
58162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsCancellationCount() {
58262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
58362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsCancellation++;
58462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
58562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
58662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    // Values used for indexing SystemStateEntries
588c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_ON = 1;
589c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_OFF = 0;
590c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
5911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
5921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Create a new connection event. Call when wifi attempts to make a new network connection
5931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity
5941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * failure code.
5951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Gathers and sets the RouterFingerPrint data as well
5961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
597947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne     * @param config WifiConfiguration of the config used for the current connection attempt
5981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X
5991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
60096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne    public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) {
6011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
60296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            // Check if this is overlapping another current connection event
60396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            if (mCurrentConnectionEvent != null) {
60496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                //Is this new Connection Event the same as the current one
60596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                if (mCurrentConnectionEvent.mConfigSsid != null
60696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigBssid != null
60796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && config != null
60896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID)
60996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && (mCurrentConnectionEvent.mConfigBssid.equals("any")
61096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) {
61196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    mCurrentConnectionEvent.mConfigBssid = targetBSSID;
61296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to the same network
61396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT,
61496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
61596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                } else {
61696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to different network
61796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT,
61896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
61996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
62096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            }
62196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            //If past maximum connection events, start removing the oldest
6224dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) {
6234dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                mConnectionEventList.remove(0);
6244dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            }
6254dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent = new ConnectionEvent();
6264dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.startTimeMillis =
627107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    mClock.getWallClockMillis();
62896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = targetBSSID;
6294dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
6304dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config);
63196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = "any";
632107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis();
633ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mWifiState = mWifiState;
634ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mScreenOn = mScreenOn;
6354dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConnectionEventList.add(mCurrentConnectionEvent);
6365cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
6375cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            if (config != null) {
6385cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
6395cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (candidate != null) {
6405cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // Cache the RSSI of the candidate, as the connection event level is updated
6415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // from other sources (polls, bssid_associations) and delta requires the
6425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // scanResult rssi
6435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssi = candidate.level;
6445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssiTimestampMillis = mClock.getElapsedSinceBootMillis();
6455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
6465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
6471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
6512532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * set the RoamType of the current ConnectionEvent (if any)
6522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
6532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    public void setConnectionEventRoamType(int roamType) {
654ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
655ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null) {
656ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
657ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            }
6582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
6592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
660f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
661f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    /**
662f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Set AP related metrics from ScanDetail
663f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
664f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void setConnectionScanDetail(ScanDetail scanDetail) {
665ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
666ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null && scanDetail != null) {
667ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
668ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
669ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //Ensure that we have a networkDetail, and that it corresponds to the currently
670ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //tracked connection attempt
671ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (networkDetail != null && scanResult != null
672ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid != null
673ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid
674ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        .equals("\"" + networkDetail.getSSID() + "\"")) {
675ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromNetworkDetail(networkDetail);
676ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromScanResult(scanResult);
677ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                }
678f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne            }
679f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        }
680f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
681f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
6822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
6831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * End a Connection event record. Call when wifi connection attempt succeeds or fails.
6841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If a Connection event has not been started and is active when .end is called, a new one is
6851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * created with zero duration.
6861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
6871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param level2FailureCode Level 2 failure code returned by supplicant
6881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X
6891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
6901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) {
6911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
6922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
6932532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                boolean result = (level2FailureCode == 1)
6942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE);
6952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0;
696107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis();
6972532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int)
6982532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        (mCurrentConnectionEvent.mRealEndTime
6992532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        - mCurrentConnectionEvent.mRealStartTime);
7002532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode;
7012532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode =
7022532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        connectivityFailureCode;
703f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                // ConnectionEvent already added to ConnectionEvents List. Safe to null current here
7042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent = null;
7055cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (!result) {
7065cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssiTimestampMillis = -1;
7075cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
7081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
7091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7122b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
7132b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail
7142b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
7152b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) {
7162b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int dtimInterval = networkDetail.getDtimInterval();
7172b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (dtimInterval > 0) {
7182b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim =
7192b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                    dtimInterval;
7202b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
7212b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int connectionWifiMode;
7222b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        switch (networkDetail.getWifiMode()) {
7232b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_UNDEFINED:
7242b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN;
7252b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7262b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11A:
7272b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A;
7282b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7292b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11B:
7302b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B;
7312b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7322b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11G:
7332b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G;
7342b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11N:
7362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N;
7372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11AC  :
7392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC;
7402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            default:
7422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER;
7432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
7452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
7462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                .routerTechnology = connectionWifiMode;
7472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
7482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
7492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
7502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent RSSI and authentication type from ScanResult
7512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
7522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromScanResult(ScanResult scanResult) {
7532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level;
7542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
75696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID;
7572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (scanResult.capabilities != null) {
75859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
7592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
76159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) {
7622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
76459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
7652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7662b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
7672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            }
7682b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
76996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo =
77096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                scanResult.frequency;
7712b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
7722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
7731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsLocationEnabled(boolean enabled) {
7741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isLocationEnabled = enabled;
7761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsScanningAlwaysEnabled(boolean enabled) {
7801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isScanningAlwaysEnabled = enabled;
7821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
7861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Non Empty Scan Results count
7871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
7881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementNonEmptyScanResultCount() {
789c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount");
7901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNonEmptyScanResults++;
7921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
7961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Empty Scan Results count
7971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
7981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementEmptyScanResultCount() {
799c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementEmptyScanResultCount");
8001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
8011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numEmptyScanResults++;
8021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
8031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
8041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
8051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
806c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Increment background scan count
807c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
808c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementBackgroundScanCount() {
809c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementBackgroundScanCount");
810c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
811c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numBackgroundScans++;
812c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
813c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
814c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
815c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne   /**
816c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get Background scan count
817c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
818c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getBackgroundScanCount() {
819c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
820c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numBackgroundScans;
821c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
822c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
823c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
824c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
82570ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne     * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry
826c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
827c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementOneshotScanCount() {
828c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
829c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numOneshotScans++;
830c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
83170ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne        incrementWifiSystemScanStateCount(mWifiState, mScreenOn);
832c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
833c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
834c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
835424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     * Increment connectivity oneshot scan count.
836424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     */
837424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    public void incrementConnectivityOneshotScanCount() {
838424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        synchronized (mLock) {
839424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang            mWifiLogProto.numConnectivityOneshotScans++;
840424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        }
841424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    }
842424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang
843424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    /**
844c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get oneshot scan count
845c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
846c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getOneshotScanCount() {
847c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
848c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numOneshotScans;
849c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
850c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
851c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
852424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    /**
853424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     * Get connectivity oneshot scan count
854424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     */
855424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    public int getConnectivityOneshotScanCount() {
856424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        synchronized (mLock) {
857424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang            return mWifiLogProto.numConnectivityOneshotScans;
858424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        }
859424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    }
860424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang
86105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    /**
86205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     * Increment oneshot scan count for external apps.
86305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     */
86405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    public void incrementExternalAppOneshotScanRequestsCount() {
86505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        synchronized (mLock) {
86605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius            mWifiLogProto.numExternalAppOneshotScanRequests++;
86705a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        }
86805a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    }
86905a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    /**
87005a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     * Increment oneshot scan throttle count for external foreground apps.
87105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     */
87205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    public void incrementExternalForegroundAppOneshotScanRequestsThrottledCount() {
87305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        synchronized (mLock) {
87405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius            mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled++;
87505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        }
87605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    }
87705a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius
87805a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    /**
87905a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     * Increment oneshot scan throttle count for external background apps.
88005a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     */
88105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    public void incrementExternalBackgroundAppOneshotScanRequestsThrottledCount() {
88205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        synchronized (mLock) {
88305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius            mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled++;
88405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        }
88505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    }
88605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius
887c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String returnCodeToString(int scanReturnCode) {
888c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(scanReturnCode){
889c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_UNKNOWN:
890c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_UNKNOWN";
891c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_SUCCESS:
892c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_SUCCESS";
893c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED:
894c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INTERRUPTED";
895c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION:
896c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INVALID_CONFIGURATION";
897c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED:
898c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "FAILURE_WIFI_DISABLED";
899c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
900c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "<UNKNOWN>";
901c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
902c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
903c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
904c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
9051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment count of scan return code occurrence
9061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
9071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X
9081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
909c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) {
9101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
911c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode));
912c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mScanReturnEntries.get(scanReturnCode);
913c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry += countToAdd;
9141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mScanReturnEntries.put(scanReturnCode, entry);
9151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
9161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
917c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
918c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this scanReturnCode
919c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * @param scanReturnCode that we are getting the count for
920c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
921c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getScanReturnEntry(int scanReturnCode) {
922c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
923c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mScanReturnEntries.get(scanReturnCode);
924c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
925c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
926c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
927c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String wifiSystemStateToString(int state) {
928c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(state){
929c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_UNKNOWN:
930c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_UNKNOWN";
931c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISABLED:
932c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISABLED";
933c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
934c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISCONNECTED";
935c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
936c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_ASSOCIATED";
937c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
938c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "default";
939c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
940c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
9411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
9421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
9431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off
9441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
9451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X
9461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param screenOn Is the screen on
9471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
9481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementWifiSystemScanStateCount(int state, boolean screenOn) {
9491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
950c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) {
951c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state)
952c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + " " + screenOn);
9531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
954c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF);
955c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mWifiSystemStateEntries.get(index);
956c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry++;
957c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiSystemStateEntries.put(index, entry);
958c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
959c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
960c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
961c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
962c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this system State Entry
963c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
964c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getSystemStateCount(int state, boolean screenOn) {
965c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
966c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF);
967c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiSystemStateEntries.get(index);
9681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
9691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
9701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
971ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
9725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack
9735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggers() {
9755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggers++;
9775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad association threshold when watchdog triggered
9815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) {
9835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count;
9855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad authentication threshold when watchdog triggered
9895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) {
9915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count;
9935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad dhcp threshold when watchdog triggered
9975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) {
9995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count;
10015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad other threshold when watchdog triggered
10055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) {
10075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count;
10095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks seen when watchdog triggered
10135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) {
10155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count;
10175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad association network
10215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAssociation() {
10235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++;
10255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad authentication network
10295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() {
10315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++;
10335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad dhcp network
10375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadDhcp() {
10395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++;
10415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad other network
10455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadOther() {
10475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++;
10495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
10525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
1053ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed pno is working
1054ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1055ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoGood() {
1056ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1057ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoGood++;
1058ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1059ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1060ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1061ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found pno not working
1062ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1063ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoBad() {
1064ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1065ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoBad++;
1066ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1067ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1068ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1069ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed background scan is working
1070ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1071ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundGood() {
1072ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1073ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundGood++;
1074ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1075ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1076ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1077ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found background scan not working
1078ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1079ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundBad() {
1080ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1081ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundBad++;
1082ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1083ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1084ce003b812aead64dcb36647180991150021b24c1Glen Kuhne
10857a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
108646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Increment various poll related metrics, and cache performance data for StaEvent logging
108746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
108846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void handlePollResult(WifiInfo wifiInfo) {
108946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollRssi = wifiInfo.getRssi();
109046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollLinkSpeed = wifiInfo.getLinkSpeed();
109146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollFreq = wifiInfo.getFrequency();
109246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        incrementRssiPollRssiCount(mLastPollRssi);
109346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
109446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
109546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
10967a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Increment occurence count of RSSI level from RSSI poll.
10977a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Ignores rssi values outside the bounds of [MIN_RSSI_POLL, MAX_RSSI_POLL]
10987a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
10997a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    public void incrementRssiPollRssiCount(int rssi) {
11007a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) {
11017a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            return;
11027a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
11037a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        synchronized (mLock) {
11047a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            int count = mRssiPollCounts.get(rssi);
11057a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mRssiPollCounts.put(rssi, count + 1);
11065cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            maybeIncrementRssiDeltaCount(rssi - mScanResultRssi);
11075cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        }
11085cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    }
11095cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne
11105cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /**
11115cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * Increment occurence count of difference between scan result RSSI and the first RSSI poll.
11125cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * Ignores rssi values outside the bounds of [MIN_RSSI_DELTA, MAX_RSSI_DELTA]
11135cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * mLock must be held when calling this method.
11145cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     */
11155cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private void maybeIncrementRssiDeltaCount(int rssi) {
11165cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        // Check if this RSSI poll is close enough to a scan result RSSI to log a delta value
11175cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        if (mScanResultRssiTimestampMillis >= 0) {
11185cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            long timeDelta = mClock.getElapsedSinceBootMillis() - mScanResultRssiTimestampMillis;
11195cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            if (timeDelta <= TIMEOUT_RSSI_DELTA_MILLIS) {
11205cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (rssi >= MIN_RSSI_DELTA && rssi <= MAX_RSSI_DELTA) {
11215cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    int count = mRssiDeltaCounts.get(rssi);
11225cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mRssiDeltaCounts.put(rssi, count + 1);
11235cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
11245cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
11255cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
11267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
11277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    }
11287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
1129da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne    /**
11301c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne     * Increment count of Watchdog successes.
11311c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne     */
11321c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    public void incrementNumLastResortWatchdogSuccesses() {
11331c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne        synchronized (mLock) {
11341c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne            mWifiLogProto.numLastResortWatchdogSuccesses++;
11351c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne        }
11361c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    }
11371c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne
11381c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    /**
11391f2ef2776476457b3eb2df70e39d53770c6b2b77xshu     * Increment the count of network connection failures that happened after watchdog has been
11401f2ef2776476457b3eb2df70e39d53770c6b2b77xshu     * triggered.
11411f2ef2776476457b3eb2df70e39d53770c6b2b77xshu     */
11421f2ef2776476457b3eb2df70e39d53770c6b2b77xshu    public void incrementWatchdogTotalConnectionFailureCountAfterTrigger() {
11431f2ef2776476457b3eb2df70e39d53770c6b2b77xshu        synchronized (mLock) {
11441f2ef2776476457b3eb2df70e39d53770c6b2b77xshu            mWifiLogProto.watchdogTotalConnectionFailureCountAfterTrigger++;
11451f2ef2776476457b3eb2df70e39d53770c6b2b77xshu        }
11461f2ef2776476457b3eb2df70e39d53770c6b2b77xshu    }
11471f2ef2776476457b3eb2df70e39d53770c6b2b77xshu
11481f2ef2776476457b3eb2df70e39d53770c6b2b77xshu    /**
1149338d87ce46cf0766005f747bb82ac590ceaff54dxshu     * Sets the time taken for wifi to connect after a watchdog triggers a restart.
1150338d87ce46cf0766005f747bb82ac590ceaff54dxshu     * @param milliseconds
1151338d87ce46cf0766005f747bb82ac590ceaff54dxshu     */
1152338d87ce46cf0766005f747bb82ac590ceaff54dxshu    public void setWatchdogSuccessTimeDurationMs(long ms) {
1153338d87ce46cf0766005f747bb82ac590ceaff54dxshu        synchronized (mLock) {
1154338d87ce46cf0766005f747bb82ac590ceaff54dxshu            mWifiLogProto.watchdogTriggerToConnectionSuccessDurationMs = ms;
1155338d87ce46cf0766005f747bb82ac590ceaff54dxshu        }
1156338d87ce46cf0766005f747bb82ac590ceaff54dxshu    }
1157338d87ce46cf0766005f747bb82ac590ceaff54dxshu
1158338d87ce46cf0766005f747bb82ac590ceaff54dxshu    /**
1159f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * Increments the count of alerts by alert reason.
1160f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     *
1161f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * @param reason The cause of the alert. The reason values are driver-specific.
1162f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     */
1163f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    public void incrementAlertReasonCount(int reason) {
1164f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX
1165f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) {
1166f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED;
1167f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
1168f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        synchronized (mLock) {
1169f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            int alertCount = mWifiAlertReasonCounts.get(reason);
1170f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.put(reason, alertCount + 1);
1171f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
1172f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    }
1173f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
1174f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /**
117559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     * Counts all the different types of networks seen in a set of scan results
117659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     */
117759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    public void countScanResults(List<ScanDetail> scanDetails) {
117859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        if (scanDetails == null) {
117959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            return;
118059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
118159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int totalResults = 0;
118259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int openNetworks = 0;
118359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int personalNetworks = 0;
118459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int enterpriseNetworks = 0;
118559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hiddenNetworks = 0;
118659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r1Networks = 0;
118759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r2Networks = 0;
118859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        for (ScanDetail scanDetail : scanDetails) {
118959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            NetworkDetail networkDetail = scanDetail.getNetworkDetail();
119059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            ScanResult scanResult = scanDetail.getScanResult();
119159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            totalResults++;
119259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (networkDetail != null) {
119359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.isHiddenBeaconFrame()) {
119459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    hiddenNetworks++;
119559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
119659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.getHSRelease() != null) {
119759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
119859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r1Networks++;
119959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
120059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r2Networks++;
120159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    }
120259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
120359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
120459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (scanResult != null && scanResult.capabilities != null) {
120559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
120659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    enterpriseNetworks++;
120759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)
120859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        || ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
120959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    personalNetworks++;
121059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else {
121159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    openNetworks++;
121259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
121359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
121459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
121559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        synchronized (mLock) {
121659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numTotalScanResults += totalResults;
121759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numOpenNetworkScanResults += openNetworks;
121859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numPersonalNetworkScanResults += personalNetworks;
121959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks;
122059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks;
122159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks;
122259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks;
122359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numScans++;
122459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
122559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    }
122659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
1227e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    private boolean mWifiWins = false; // Based on scores, use wifi instead of mobile data?
1228e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass
122959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    /**
12304569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * Increments occurence of a particular wifi score calculated
12314569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * in WifiScoreReport by current connected network. Scores are bounded
1232e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     * within  [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray.
1233e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     *
1234e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     * Also records events when the current score breaches significant thresholds.
12354569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     */
12364569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    public void incrementWifiScoreCount(int score) {
12374569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        if (score < MIN_WIFI_SCORE || score > MAX_WIFI_SCORE) {
12384569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            return;
12394569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        }
12404569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        synchronized (mLock) {
12414569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            int count = mWifiScoreCounts.get(score);
12424569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiScoreCounts.put(score, count + 1);
1243e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass
1244e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            boolean wifiWins = mWifiWins;
1245e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            if (mWifiWins && score < LOW_WIFI_SCORE) {
1246e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                wifiWins = false;
1247e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            } else if (!mWifiWins && score > LOW_WIFI_SCORE) {
1248e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                wifiWins = true;
1249e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            }
1250e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            mLastScore = score;
1251e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            if (wifiWins != mWifiWins) {
1252e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                mWifiWins = wifiWins;
1253e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                StaEvent event = new StaEvent();
1254e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                event.type = StaEvent.TYPE_SCORE_BREACH;
1255e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                addStaEvent(event);
1256e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            }
12574569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        }
12584569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    }
125959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
126044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    /**
126144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * Increments occurence of the results from attempting to start SoftAp.
126244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * Maps the |result| and WifiManager |failureCode| constant to proto defined SoftApStartResult
126344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * codes.
126444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     */
126544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    public void incrementSoftApStartResult(boolean result, int failureCode) {
126644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein        synchronized (mLock) {
126744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            if (result) {
126844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
126944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY);
127044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
127144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY,
127244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
127344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                return;
127444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
127544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
127644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            // now increment failure modes - if not explicitly handled, dump into the general
127744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            // error bucket.
127844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            if (failureCode == WifiManager.SAP_START_FAILURE_NO_CHANNEL) {
127944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
128044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL);
128144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
128244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL,
128344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
128444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            } else {
128544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                // failure mode not tracked at this time...  count as a general error for now.
128644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
128744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR);
128844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
128944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR,
129044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
129144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
129244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein        }
129344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    }
129444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
1295bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
129605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record indicating the current up state of soft AP
129705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
129805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    public void addSoftApUpChangedEvent(boolean isUp, int mode) {
129905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        SoftApConnectedClientsEvent event = new SoftApConnectedClientsEvent();
130005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.eventType = isUp ? SoftApConnectedClientsEvent.SOFT_AP_UP :
130105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                SoftApConnectedClientsEvent.SOFT_AP_DOWN;
130205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.numConnectedClients = 0;
130305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        addSoftApConnectedClientsEvent(event, mode);
130405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
130505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
130605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
130705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record for current number of associated stations to soft AP
130805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
130905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    public void addSoftApNumAssociatedStationsChangedEvent(int numStations, int mode) {
131005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        SoftApConnectedClientsEvent event = new SoftApConnectedClientsEvent();
131105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.eventType = SoftApConnectedClientsEvent.NUM_CLIENTS_CHANGED;
131205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.numConnectedClients = numStations;
131305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        addSoftApConnectedClientsEvent(event, mode);
131405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
131505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
131605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
131705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record to the corresponding event list based on mode param
131805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
131905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private void addSoftApConnectedClientsEvent(SoftApConnectedClientsEvent event, int mode) {
132005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        synchronized (mLock) {
132105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            List<SoftApConnectedClientsEvent> softApEventList;
132205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            switch (mode) {
132305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_TETHERED:
132405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    softApEventList = mSoftApEventListTethered;
132505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    break;
132605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_LOCAL_ONLY:
132705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    softApEventList = mSoftApEventListLocalOnly;
132805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    break;
132905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                default:
133005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    return;
133105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
133205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
133305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (softApEventList.size() > MAX_NUM_SOFT_AP_EVENTS) {
133405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                return;
133505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
133605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
13374de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            event.timeStampMillis = mClock.getElapsedSinceBootMillis();
133805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            softApEventList.add(event);
133905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        }
134005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
134105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
134205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
13434de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh     * Updates current soft AP events with channel info
13444de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh     */
13454de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    public void addSoftApChannelSwitchedEvent(int frequency, int bandwidth, int mode) {
13464de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh        synchronized (mLock) {
13474de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            List<SoftApConnectedClientsEvent> softApEventList;
13484de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            switch (mode) {
13494de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_TETHERED:
13504de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    softApEventList = mSoftApEventListTethered;
13514de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
13524de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_LOCAL_ONLY:
13534de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    softApEventList = mSoftApEventListLocalOnly;
13544de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
13554de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                default:
13564de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    return;
13574de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            }
13584de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13594de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            for (int index = softApEventList.size() - 1; index >= 0; index--) {
13604de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                SoftApConnectedClientsEvent event = softApEventList.get(index);
13614de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13624de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                if (event != null && event.eventType == SoftApConnectedClientsEvent.SOFT_AP_UP) {
13634de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    event.channelFrequency = frequency;
13644de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    event.channelBandwidth = bandwidth;
13654de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
13664de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                }
13674de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            }
13684de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh        }
13694de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    }
13704de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13714de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    /**
1372bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the HAL crashed.
1373bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1374bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumHalCrashes() {
1375bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1376bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numHalCrashes++;
1377bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1378bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1379bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1380bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1381bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the Wificond crashed.
1382bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1383bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumWificondCrashes() {
1384bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1385bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numWificondCrashes++;
1386bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1387bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1388bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1389bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1390d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     * Increment number of times the supplicant crashed.
1391d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     */
1392d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    public void incrementNumSupplicantCrashes() {
1393d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        synchronized (mLock) {
139465a9143d6c93624837da3867f1cadf2daab62236Roshan Pius            mWifiLogProto.numSupplicantCrashes++;
1395d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        }
1396d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    }
1397d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius
1398d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    /**
139927c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius     * Increment number of times the hostapd crashed.
140027c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius     */
140127c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    public void incrementNumHostapdCrashes() {
140227c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius        synchronized (mLock) {
140365a9143d6c93624837da3867f1cadf2daab62236Roshan Pius            mWifiLogProto.numHostapdCrashes++;
140427c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius        }
140527c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    }
140627c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius
140727c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    /**
1408bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the wifi on failed due to an error in HAL.
1409bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
14105ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupClientInterfaceFailureDueToHal() {
1411bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
14125ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupClientInterfaceFailureDueToHal++;
1413bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1414bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1415bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1416bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1417bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the wifi on failed due to an error in wificond.
1418bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
14195ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupClientInterfaceFailureDueToWificond() {
1420bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
14215ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupClientInterfaceFailureDueToWificond++;
1422bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1423bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1424bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
142526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
142665a9143d6c93624837da3867f1cadf2daab62236Roshan Pius     * Increment number of times the wifi on failed due to an error in supplicant.
1427d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     */
14285ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupClientInterfaceFailureDueToSupplicant() {
1429d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        synchronized (mLock) {
14305ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant++;
14315ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        }
14325ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    }
14335ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius
14345ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    /**
14355ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     * Increment number of times the SoftAp on failed due to an error in HAL.
14365ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     */
14375ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupSoftApInterfaceFailureDueToHal() {
14385ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        synchronized (mLock) {
14395ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal++;
14405ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        }
14415ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    }
14425ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius
14435ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    /**
14445ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     * Increment number of times the SoftAp on failed due to an error in wificond.
14455ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     */
14465ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupSoftApInterfaceFailureDueToWificond() {
14475ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        synchronized (mLock) {
14485ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond++;
14495ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        }
14505ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    }
14515ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius
14525ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    /**
14535ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     * Increment number of times the SoftAp on failed due to an error in hostapd.
14545ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     */
14555ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupSoftApInterfaceFailureDueToHostapd() {
14565ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        synchronized (mLock) {
14575ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd++;
1458d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        }
1459d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    }
1460d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius
1461d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    /**
1462a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius     * Increment number of times we got client interface down.
1463a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius     */
1464a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    public void incrementNumClientInterfaceDown() {
1465a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius        synchronized (mLock) {
1466a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius            mWifiLogProto.numClientInterfaceDown++;
1467a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius        }
1468a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    }
1469a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius
1470a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    /**
1471a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius     * Increment number of times we got client interface down.
1472a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius     */
1473a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    public void incrementNumSoftApInterfaceDown() {
1474a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius        synchronized (mLock) {
1475a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius            mWifiLogProto.numSoftApInterfaceDown++;
1476a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius        }
1477a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    }
1478a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius
1479a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    /**
148026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider being installed.
148126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
148226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderInstallation() {
148326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
148426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderInstallation++;
148526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
148626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
148726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
148826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
148926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider is installed successfully.
149026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
149126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderInstallSuccess() {
149226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
149326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderInstallSuccess++;
149426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
149526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
149626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
149726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
149826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider being uninstalled.
149926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
150026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderUninstallation() {
150126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
150226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderUninstallation++;
150326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
150426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
150526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
150626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
150726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider is uninstalled successfully.
150826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
150926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderUninstallSuccess() {
151026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
151126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderUninstallSuccess++;
151226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
151326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
1514bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
151508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /**
151608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Increment N-Way network selection decision histograms:
151708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Counts the size of various sets of scanDetails within a scan, and increment the occurrence
151808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * of that size for the associated histogram. There are ten histograms generated for each
151908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * combination of: {SSID, BSSID} *{Total, Saved, Open, Saved_or_Open, Passpoint}
152008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Only performs this count if isFullBand is true, otherwise, increments the partial scan count
152108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     */
152208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void incrementAvailableNetworksHistograms(List<ScanDetail> scanDetails,
152308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            boolean isFullBand) {
152408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        synchronized (mLock) {
152508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            if (mWifiConfigManager == null || mWifiNetworkSelector == null
152608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    || mPasspointManager == null) {
152708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                return;
152808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
152908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            if (!isFullBand) {
153008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                mWifiLogProto.partialAllSingleScanListenerResults++;
153108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                return;
153208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
153308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> ssids = new HashSet<ScanResultMatchInfo>();
153408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int bssids = 0;
153508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> openSsids = new HashSet<ScanResultMatchInfo>();
153608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int openBssids = 0;
153708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> savedSsids = new HashSet<ScanResultMatchInfo>();
153808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int savedBssids = 0;
153908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            // openOrSavedSsids calculated from union of savedSsids & openSsids
154008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int openOrSavedBssids = 0;
154108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<PasspointProvider> savedPasspointProviderProfiles =
154208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    new HashSet<PasspointProvider>();
154308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int savedPasspointProviderBssids = 0;
15449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            int passpointR1Aps = 0;
15459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            int passpointR2Aps = 0;
15469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            Map<ANQPNetworkKey, Integer> passpointR1UniqueEss = new HashMap<>();
15479831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            Map<ANQPNetworkKey, Integer> passpointR2UniqueEss = new HashMap<>();
1548973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            int supporting80211mcAps = 0;
154908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            for (ScanDetail scanDetail : scanDetails) {
155008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
155108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
1552533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
1553533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                // statistics to be collected for ALL APs (irrespective of signal power)
1554533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                if (networkDetail.is80211McResponderSupport()) {
1555533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                    supporting80211mcAps++;
155608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
1557533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
155808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ScanResultMatchInfo matchInfo = ScanResultMatchInfo.fromScanResult(scanResult);
155908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                Pair<PasspointProvider, PasspointMatch> providerMatch = null;
156008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                PasspointProvider passpointProvider = null;
156108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (networkDetail.isInterworking()) {
156208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    providerMatch =
156308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                            mPasspointManager.matchProvider(scanResult);
156408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    passpointProvider = providerMatch != null ? providerMatch.first : null;
15659831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
15669831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
15679831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        passpointR1Aps++;
15689831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
15699831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        passpointR2Aps++;
15709831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
15719831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
15729831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    long bssid = 0;
15739831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    boolean validBssid = false;
15749831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    try {
15759831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        bssid = Utils.parseMac(scanResult.BSSID);
15769831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        validBssid = true;
15779831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    } catch (IllegalArgumentException e) {
15789831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        Log.e(TAG,
15799831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                                "Invalid BSSID provided in the scan result: " + scanResult.BSSID);
15809831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
15819831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    if (validBssid) {
15829831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        ANQPNetworkKey uniqueEss = ANQPNetworkKey.buildKey(scanResult.SSID, bssid,
15839831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                                scanResult.hessid, networkDetail.getAnqpDomainID());
15849831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
15859831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            Integer countObj = passpointR1UniqueEss.get(uniqueEss);
15869831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            int count = countObj == null ? 0 : countObj;
15879831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            passpointR1UniqueEss.put(uniqueEss, count + 1);
15889831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
15899831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            Integer countObj = passpointR2UniqueEss.get(uniqueEss);
15909831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            int count = countObj == null ? 0 : countObj;
15919831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            passpointR2UniqueEss.put(uniqueEss, count + 1);
15929831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        }
15939831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
15949831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
159508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
1596533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
1597533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                if (mWifiNetworkSelector.isSignalTooWeak(scanResult)) {
1598533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                    continue;
1599533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                }
1600533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
1601533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                // statistics to be collected ONLY for those APs with sufficient signal power
1602533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
160308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ssids.add(matchInfo);
160408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                bssids++;
160508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isOpen = matchInfo.networkType == ScanResultMatchInfo.NETWORK_TYPE_OPEN;
160608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                WifiConfiguration config =
160708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        mWifiConfigManager.getConfiguredNetworkForScanDetail(scanDetail);
160808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isSaved = (config != null) && !config.isEphemeral()
160908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        && !config.isPasspoint();
161008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isSavedPasspoint = passpointProvider != null;
161108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isOpen) {
161208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openSsids.add(matchInfo);
161308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openBssids++;
161408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
161508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isSaved) {
161608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedSsids.add(matchInfo);
161708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedBssids++;
161808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
161908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isOpen || isSaved) {
162008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openOrSavedBssids++;
162108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    // Calculate openOrSavedSsids union later
162208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
162308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isSavedPasspoint) {
162408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderProfiles.add(passpointProvider);
162508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderBssids++;
162608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
162708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
162808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.fullBandAllSingleScanListenerResults++;
162908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementTotalScanSsids(mTotalSsidsInScanHistogram, ssids.size());
163008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementTotalScanResults(mTotalBssidsInScanHistogram, bssids);
163108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableOpenSsidsInScanHistogram, openSsids.size());
163208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableOpenBssidsInScanHistogram, openBssids);
163308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableSavedSsidsInScanHistogram, savedSsids.size());
163408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableSavedBssidsInScanHistogram, savedBssids);
163508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            openSsids.addAll(savedSsids); // openSsids = Union(openSsids, savedSsids)
163608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableOpenOrSavedSsidsInScanHistogram, openSsids.size());
163708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableOpenOrSavedBssidsInScanHistogram, openOrSavedBssids);
163808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableSavedPasspointProviderProfilesInScanHistogram,
163908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderProfiles.size());
164008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableSavedPasspointProviderBssidsInScanHistogram,
164108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderBssids);
16429831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalPasspointAps(mObservedHotspotR1ApInScanHistogram, passpointR1Aps);
16439831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalPasspointAps(mObservedHotspotR2ApInScanHistogram, passpointR2Aps);
16449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalUniquePasspointEss(mObservedHotspotR1EssInScanHistogram,
16459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    passpointR1UniqueEss.size());
16469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalUniquePasspointEss(mObservedHotspotR2EssInScanHistogram,
16479831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    passpointR2UniqueEss.size());
16489831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            for (Integer count : passpointR1UniqueEss.values()) {
16499831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                incrementPasspointPerUniqueEss(mObservedHotspotR1ApsPerEssInScanHistogram, count);
16509831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            }
16519831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            for (Integer count : passpointR2UniqueEss.values()) {
16529831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                incrementPasspointPerUniqueEss(mObservedHotspotR2ApsPerEssInScanHistogram, count);
16539831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            }
1654973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            increment80211mcAps(mObserved80211mcApInScanHistogram, supporting80211mcAps);
165508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        }
165608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
165708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
1658054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    /**
1659054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     * TODO: (b/72443859) Use notifierTag param to separate metrics for OpenNetworkNotifier and
1660054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     * CarrierNetworkNotifier, for this method and all other related metrics.
1661054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     */
1662a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of a "Connect to Network" notification. */
1663054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementConnectToNetworkNotification(String notifierTag, int notificationType) {
1664a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1665a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int count = mConnectToNetworkNotificationCount.get(notificationType);
1666a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationCount.put(notificationType, count + 1);
1667a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1668a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1669a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1670a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of an "Connect to Network" notification user action. */
1671054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementConnectToNetworkNotificationAction(String notifierTag,
1672054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh            int notificationType, int actionType) {
1673a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1674a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int key = notificationType * CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER
1675a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    + actionType;
1676a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int count = mConnectToNetworkNotificationActionCount.get(key);
1677a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationActionCount.put(key, count + 1);
1678a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1679a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1680a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1681a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /**
1682a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * Sets the number of SSIDs blacklisted from recommendation by the open network notification
1683a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * recommender.
1684a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     */
1685054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void setNetworkRecommenderBlacklistSize(String notifierTag, int size) {
1686a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1687a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mOpenNetworkRecommenderBlacklistSize = size;
1688a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1689a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1690a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1691a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Sets if the available network notification feature is enabled. */
1692054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void setIsWifiNetworksAvailableNotificationEnabled(String notifierTag, boolean enabled) {
1693a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1694a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mIsWifiNetworksAvailableNotificationOn = enabled;
1695a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1696a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1697a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1698a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of connection attempts that were initiated unsuccessfully */
1699054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementNumNetworkRecommendationUpdates(String notifierTag) {
1700a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1701a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkRecommendationUpdates++;
1702a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1703a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1704a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1705a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of connection attempts that were initiated unsuccessfully */
1706054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementNumNetworkConnectMessageFailedToSend(String notifierTag) {
1707a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1708a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkConnectMessageFailedToSend++;
1709a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1710a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1711a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
171228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim    /** Sets if Connected MAC Randomization feature is enabled */
171328a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim    public void setIsMacRandomizationOn(boolean enabled) {
171428a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim        synchronized (mLock) {
171528a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim            mIsMacRandomizationOn = enabled;
171628a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim        }
171728a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim    }
171828a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim
171911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne    public static final String PROTO_DUMP_ARG = "wifiMetricsProto";
17209ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne    public static final String CLEAN_DUMP_ARG = "clean";
17219ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne
17221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
17231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager
17249ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne     * at this time.
17251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
17261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param fd unused
17271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param pw PrintWriter for writing dump to
17281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param args unused
17291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
17301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
17311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
1732031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne            if (args != null && args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) {
17339ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                // Dump serialized WifiLog proto
17341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                consolidateProto(true);
17351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
17361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (mCurrentConnectionEvent != event) {
17371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //indicate that automatic bug report has been taken for all valid
17381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //connection events
17391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
17401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
17411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
17421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto);
17431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT);
17449ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                if (args.length > 1 && CLEAN_DUMP_ARG.equals(args[1])) {
17459ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    // Output metrics proto bytes (base64) and nothing else
17469ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.print(metricsProtoDump);
17479ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                } else {
17489ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    // Tag the start and end of the metrics proto bytes
17499ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println("WifiMetrics:");
17509ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println(metricsProtoDump);
17519ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println("EndWifiMetrics");
17529ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                }
17532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                clear();
17541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            } else {
17559ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                pw.println("WifiMetrics:");
17561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mConnectionEvents:");
17571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
17581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    String eventLine = event.toString();
17591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (event == mCurrentConnectionEvent) {
17601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        eventLine += "CURRENTLY OPEN EVENT";
17611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
17621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    pw.println(eventLine);
17631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
17641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks);
17651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks);
17661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworks="
17671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numPersonalNetworks);
17681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworks="
17691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworks);
177059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks);
177159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPasspointNetworks="
177259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPasspointNetworks);
17731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled);
17741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isScanningAlwaysEnabled="
17751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.isScanningAlwaysEnabled);
1776c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByUser="
1777c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByUser);
1778c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByApps="
1779c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByApps);
1780c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNonEmptyScanResults="
1781c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNonEmptyScanResults);
1782c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numEmptyScanResults="
1783c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numEmptyScanResults);
1784424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang                pw.println("mWifiLogProto.numConnecitvityOneshotScans="
1785424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang                        + mWifiLogProto.numConnectivityOneshotScans);
1786c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numOneshotScans="
1787c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numOneshotScans);
1788c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numBackgroundScans="
1789c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numBackgroundScans);
179005a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                pw.println("mWifiLogProto.numExternalAppOneshotScanRequests="
179105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                        + mWifiLogProto.numExternalAppOneshotScanRequests);
179205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                pw.println("mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled="
179305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                        + mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled);
179405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                pw.println("mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled="
179505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                        + mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled);
1796c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1797c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mScanReturnEntries:");
1798c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_UNKNOWN: " + getScanReturnEntry(
1799c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_UNKNOWN));
1800c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_SUCCESS: " + getScanReturnEntry(
1801c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_SUCCESS));
1802c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry(
1803c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED));
1804c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry(
1805c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION));
1806c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  FAILURE_WIFI_DISABLED: " + getScanReturnEntry(
1807c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED));
1808c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1809c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>");
1810c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN       ON: "
1811c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true));
1812c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED      ON: "
1813c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true));
1814c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED  ON: "
1815c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true));
1816c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED    ON: "
1817c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true));
1818c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN      OFF: "
1819c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false));
1820c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED     OFF: "
1821c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false));
1822c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED OFF: "
1823c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false));
1824c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED   OFF: "
1825c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false));
1826ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood="
1827ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoGood);
1828ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad="
1829ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoBad);
1830ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood="
1831ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundGood);
1832ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad="
1833ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundBad);
18345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggers="
18355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggers);
18365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal="
18375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal);
18385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal="
18395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal);
18405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal="
18415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal);
18425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal="
18435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal);
18445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal="
18455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal);
18465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation="
18475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation);
18485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication="
18495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication);
18505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp="
18515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp);
18525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther="
18535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther);
1854da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogSuccesses="
1855da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogSuccesses);
1856107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                pw.println("mWifiLogProto.recordDurationSec="
1857107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                        + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec));
18587a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                pw.println("mWifiLogProto.rssiPollRssiCount: Printing counts for [" + MIN_RSSI_POLL
18597a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                        + ", " + MAX_RSSI_POLL + "]");
18607a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                StringBuilder sb = new StringBuilder();
18617a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) {
18627a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                    sb.append(mRssiPollCounts.get(i) + " ");
18637a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                }
18647a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                pw.println("  " + sb.toString());
18655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                pw.println("mWifiLogProto.rssiPollDeltaCount: Printing counts for ["
18665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                        + MIN_RSSI_DELTA + ", " + MAX_RSSI_DELTA + "]");
18675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                sb.setLength(0);
18685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                for (int i = MIN_RSSI_DELTA; i <= MAX_RSSI_DELTA; i++) {
18695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    sb.append(mRssiDeltaCounts.get(i) + " ");
18705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
18715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                pw.println("  " + sb.toString());
1872f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                pw.print("mWifiLogProto.alertReasonCounts=");
1873f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                sb.setLength(0);
1874f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN;
1875f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) {
1876f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    int count = mWifiAlertReasonCounts.get(i);
1877f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    if (count > 0) {
1878f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        sb.append("(" + i + "," + count + "),");
1879f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    }
1880f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
1881f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                if (sb.length() > 1) {
1882f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    sb.setLength(sb.length() - 1);  // strip trailing comma
1883f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println(sb.toString());
1884f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                } else {
1885f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println("()");
1886f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
188759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numTotalScanResults="
188859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numTotalScanResults);
188959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworkScanResults="
189059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numOpenNetworkScanResults);
189159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworkScanResults="
189259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPersonalNetworkScanResults);
189359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworkScanResults="
189459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworkScanResults);
189559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworkScanResults="
189659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHiddenNetworkScanResults);
189759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults="
189859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R1NetworkScanResults);
189959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults="
190059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R2NetworkScanResults);
190159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans);
19024569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                pw.println("mWifiLogProto.WifiScoreCount: [" + MIN_WIFI_SCORE + ", "
19034569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                        + MAX_WIFI_SCORE + "]");
19044569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                for (int i = 0; i <= MAX_WIFI_SCORE; i++) {
19054569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                    pw.print(mWifiScoreCounts.get(i) + " ");
19064569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                }
190744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println(); // add a line after wifi scores
190844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("mWifiLogProto.SoftApManagerReturnCodeCounts:");
190944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  SUCCESS: " + mSoftApManagerReturnCodeCounts.get(
191044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY));
191144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  FAILED_GENERAL_ERROR: " + mSoftApManagerReturnCodeCounts.get(
191244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR));
191344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  FAILED_NO_CHANNEL: " + mSoftApManagerReturnCodeCounts.get(
191444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL));
19154569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                pw.print("\n");
1916bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numHalCrashes="
1917bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numHalCrashes);
1918bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numWificondCrashes="
1919bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numWificondCrashes);
192065a9143d6c93624837da3867f1cadf2daab62236Roshan Pius                pw.println("mWifiLogProto.numSupplicantCrashes="
192165a9143d6c93624837da3867f1cadf2daab62236Roshan Pius                        + mWifiLogProto.numSupplicantCrashes);
192265a9143d6c93624837da3867f1cadf2daab62236Roshan Pius                pw.println("mWifiLogProto.numHostapdCrashes="
192365a9143d6c93624837da3867f1cadf2daab62236Roshan Pius                        + mWifiLogProto.numHostapdCrashes);
19245ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToHal="
19255ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupClientInterfaceFailureDueToHal);
19265ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToWificond="
19275ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupClientInterfaceFailureDueToWificond);
19285ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant="
19295ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant);
19305ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal="
19315ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal);
19325ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond="
19335ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond);
19345ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd="
19355ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd);
193646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                pw.println("StaEventList:");
1937d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                for (StaEventWithTime event : mStaEventList) {
1938d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                    pw.println(event);
193946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
1940910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen
194126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviders="
194226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviders);
194326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderInstallation="
194426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderInstallation);
194526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderInstallSuccess="
194626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderInstallSuccess);
194726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderUninstallation="
194826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderUninstallation);
194926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderUninstallSuccess="
195026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderUninstallSuccess);
195126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProvidersSuccessfullyConnected="
195226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProvidersSuccessfullyConnected);
195308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mTotalSsidsInScanHistogram:"
195408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mTotalSsidsInScanHistogram.toString());
195508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mTotalBssidsInScanHistogram:"
195608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mTotalBssidsInScanHistogram.toString());
195708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenSsidsInScanHistogram:"
195808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenSsidsInScanHistogram.toString());
195908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenBssidsInScanHistogram:"
196008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenBssidsInScanHistogram.toString());
196108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedSsidsInScanHistogram:"
196208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedSsidsInScanHistogram.toString());
196308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedBssidsInScanHistogram:"
196408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedBssidsInScanHistogram.toString());
196508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenOrSavedSsidsInScanHistogram:"
196608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenOrSavedSsidsInScanHistogram.toString());
196708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenOrSavedBssidsInScanHistogram:"
196808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenOrSavedBssidsInScanHistogram.toString());
196908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedPasspointProviderProfilesInScanHistogram:"
197008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedPasspointProviderProfilesInScanHistogram.toString());
197108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedPasspointProviderBssidsInScanHistogram:"
197208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedPasspointProviderBssidsInScanHistogram.toString());
197308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mWifiLogProto.partialAllSingleScanListenerResults="
197408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mWifiLogProto.partialAllSingleScanListenerResults);
197508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mWifiLogProto.fullBandAllSingleScanListenerResults="
197608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mWifiLogProto.fullBandAllSingleScanListenerResults);
1977910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen                pw.println("mWifiAwareMetrics:");
1978910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen                mWifiAwareMetrics.dump(fd, pw, args);
197902e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen                pw.println("mRttMetrics:");
198002e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen                mRttMetrics.dump(fd, pw, args);
1981a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
1982a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanAttempts="
1983a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanAttempts);
1984a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanFailed="
1985a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanFailed);
1986a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanStartedOverOffload="
1987a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanStartedOverOffload);
1988a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanFailedOverOffload="
1989a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanFailedOverOffload);
1990a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoFoundNetworkEvents="
1991a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoFoundNetworkEvents);
1992a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1993a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.connectToNetworkNotificationCount="
1994a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mConnectToNetworkNotificationCount.toString());
1995a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.connectToNetworkNotificationActionCount="
1996a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mConnectToNetworkNotificationActionCount.toString());
1997a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.openNetworkRecommenderBlacklistSize="
1998a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mOpenNetworkRecommenderBlacklistSize);
1999a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.isWifiNetworksAvailableNotificationOn="
2000a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mIsWifiNetworksAvailableNotificationOn);
2001a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.numOpenNetworkRecommendationUpdates="
2002a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mNumOpenNetworkRecommendationUpdates);
2003a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.numOpenNetworkConnectMessageFailedToSend="
2004a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mNumOpenNetworkConnectMessageFailedToSend);
20059831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
20069831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1ApInScanHistogram="
20079831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1ApInScanHistogram);
20089831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2ApInScanHistogram="
20099831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2ApInScanHistogram);
20109831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1EssInScanHistogram="
20119831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1EssInScanHistogram);
20129831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2EssInScanHistogram="
20139831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2EssInScanHistogram);
20149831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram="
20159831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1ApsPerEssInScanHistogram);
20169831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram="
20179831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2ApsPerEssInScanHistogram);
201805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
2019973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                pw.println("mWifiLogProto.observed80211mcSupportingApsInScanHistogram"
2020973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                        + mObserved80211mcApInScanHistogram);
2021973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
202205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                pw.println("mSoftApTetheredEvents:");
202305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                for (SoftApConnectedClientsEvent event : mSoftApEventListTethered) {
202405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    StringBuilder eventLine = new StringBuilder();
202505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append("event_type=" + event.eventType);
202605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",time_stamp_millis=" + event.timeStampMillis);
202705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",num_connected_clients=" + event.numConnectedClients);
20284de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_frequency=" + event.channelFrequency);
20294de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_bandwidth=" + event.channelBandwidth);
203005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    pw.println(eventLine.toString());
203105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                }
203205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                pw.println("mSoftApLocalOnlyEvents:");
203305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                for (SoftApConnectedClientsEvent event : mSoftApEventListLocalOnly) {
203405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    StringBuilder eventLine = new StringBuilder();
203505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append("event_type=" + event.eventType);
203605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",time_stamp_millis=" + event.timeStampMillis);
203705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",num_connected_clients=" + event.numConnectedClients);
20384de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_frequency=" + event.channelFrequency);
20394de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_bandwidth=" + event.channelBandwidth);
204005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    pw.println(eventLine.toString());
204105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                }
204262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
204362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsAttempts="
204462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsAttempts);
204562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsSuccess="
204662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsSuccess);
204762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsStartFailure="
204862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsStartFailure);
204962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsOverlapFailure="
205062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsOverlapFailure);
205162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsTimeoutFailure="
205262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsTimeoutFailure);
205362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsOtherConnectionFailure="
205462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsOtherConnectionFailure);
205562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsSupplicantFailure="
205662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsSupplicantFailure);
205762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsCancellation="
205862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsCancellation);
2059fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray
2060fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray                mWifiPowerMetrics.dump(pw);
206112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                mWifiWakeMetrics.dump(pw);
206228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim
206328a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim                pw.println("mWifiLogProto.isMacRandomizationOn=" + mIsMacRandomizationOn);
20641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
20651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
20661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
20671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
20683c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    /**
20693c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     * Update various counts of saved network types
20703c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     * @param networks List of WifiConfigurations representing all saved networks, must not be null
20713c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     */
20723c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    public void updateSavedNetworks(List<WifiConfiguration> networks) {
20733c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne        synchronized (mLock) {
20743c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numSavedNetworks = networks.size();
20753c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numOpenNetworks = 0;
20763c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numPersonalNetworks = 0;
20773c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numEnterpriseNetworks = 0;
20783c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numNetworksAddedByUser = 0;
20793c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numNetworksAddedByApps = 0;
20803c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numHiddenNetworks = 0;
20813c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numPasspointNetworks = 0;
20823c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            for (WifiConfiguration config : networks) {
20833c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
20843c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numOpenNetworks++;
20853c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else if (config.isEnterprise()) {
20863c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numEnterpriseNetworks++;
20873c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else {
20883c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numPersonalNetworks++;
20893c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
20903c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.selfAdded) {
20913c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numNetworksAddedByUser++;
20923c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else {
20933c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numNetworksAddedByApps++;
20943c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
20953c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.hiddenSSID) {
20963c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numHiddenNetworks++;
20973c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
20983c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.isPasspoint()) {
20993c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numPasspointNetworks++;
21003c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
21013c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            }
21023c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne        }
21033c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    }
21043c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne
21051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
210649357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * Update metrics for saved Passpoint profiles.
210726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     *
210826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * @param numSavedProfiles The number of saved Passpoint profiles
210949357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * @param numConnectedProfiles The number of saved Passpoint profiles that have ever resulted
211049357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     *                             in a successful network connection
211126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
211249357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu    public void updateSavedPasspointProfiles(int numSavedProfiles, int numConnectedProfiles) {
211326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
211426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviders = numSavedProfiles;
211549357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu            mWifiLogProto.numPasspointProvidersSuccessfullyConnected = numConnectedProfiles;
211626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
211726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
211826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
211926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
2120c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their
2121c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * respective lists within mWifiLogProto
21221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
21231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param incremental Only include ConnectionEvents created since last automatic bug report
21241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
21251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private void consolidateProto(boolean incremental) {
21261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>();
21277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>();
21285cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        List<WifiMetricsProto.RssiPollCount> rssiDeltas = new ArrayList<>();
2129f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>();
21304569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        List<WifiMetricsProto.WifiScoreCount> scores = new ArrayList<>();
21311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
21321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            for (ConnectionEvent event : mConnectionEventList) {
2133c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // If this is not incremental, dump full ConnectionEvent list
2134c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // Else Dump all un-dumped events except for the current one
21351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                if (!incremental || ((mCurrentConnectionEvent != event)
21361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        && !event.mConnectionEvent.automaticBugReportTaken)) {
21371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //Get all ConnectionEvents that haven not been dumped as a proto, also exclude
21381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //the current active un-ended connection event
21391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    events.add(event.mConnectionEvent);
2140c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    if (incremental) {
2141c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
2142c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    }
21431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
21441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
21451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            if (events.size() > 0) {
21461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent);
21471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
2148c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
2149c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list
2150c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.scanReturnEntries =
2151c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()];
2152c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mScanReturnEntries.size(); i++) {
2153c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry();
2154c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i);
2155c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i);
2156c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
2157c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
2158c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list
2159c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // This one is slightly more complex, as the Sparse are indexed with:
2160c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //     key: wifiState * 2 + isScreenOn, value: wifiStateCount
2161c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.wifiSystemStateEntries =
2162c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog
2163c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    .WifiSystemStateEntry[mWifiSystemStateEntries.size()];
2164c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mWifiSystemStateEntries.size(); i++) {
2165c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i] =
2166c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        new WifiMetricsProto.WifiLog.WifiSystemStateEntry();
2167c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiState =
2168c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.keyAt(i) / 2;
2169c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount =
2170c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.valueAt(i);
2171c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].isScreenOn =
2172c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        (mWifiSystemStateEntries.keyAt(i) % 2) > 0;
2173c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
2174107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000)
2175107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    - mRecordStartTimeSec);
21767a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
21777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            /**
21787a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             * Convert the SparseIntArray of RSSI poll rssi's and counts to the proto's repeated
21797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             * IntKeyVal array.
21807a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             */
21817a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            for (int i = 0; i < mRssiPollCounts.size(); i++) {
21827a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
21837a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                keyVal.rssi = mRssiPollCounts.keyAt(i);
21847a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                keyVal.count = mRssiPollCounts.valueAt(i);
21857a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                rssis.add(keyVal);
21867a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            }
21877a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount);
2188f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
2189f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            /**
21905cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             * Convert the SparseIntArray of RSSI delta rssi's and counts to the proto's repeated
21915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             * IntKeyVal array.
21925cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             */
21935cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            for (int i = 0; i < mRssiDeltaCounts.size(); i++) {
21945cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
21955cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                keyVal.rssi = mRssiDeltaCounts.keyAt(i);
21965cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                keyVal.count = mRssiDeltaCounts.valueAt(i);
21975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                rssiDeltas.add(keyVal);
21985cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
21995cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mWifiLogProto.rssiPollDeltaCount = rssiDeltas.toArray(mWifiLogProto.rssiPollDeltaCount);
22005cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne
22015cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            /**
2202f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * Convert the SparseIntArray of alert reasons and counts to the proto's repeated
2203f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * IntKeyVal array.
2204f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             */
2205f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) {
2206f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount();
2207f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.reason = mWifiAlertReasonCounts.keyAt(i);
2208f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.count = mWifiAlertReasonCounts.valueAt(i);
2209f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                alertReasons.add(keyVal);
2210f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            }
2211f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount);
22124569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao
22134569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            /**
22144569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            *  Convert the SparseIntArray of Wifi Score and counts to proto's repeated
22154569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            * IntKeyVal array.
22164569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            */
22174569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            for (int score = 0; score < mWifiScoreCounts.size(); score++) {
22184569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                WifiMetricsProto.WifiScoreCount keyVal = new WifiMetricsProto.WifiScoreCount();
22194569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                keyVal.score = mWifiScoreCounts.keyAt(score);
22204569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                keyVal.count = mWifiScoreCounts.valueAt(score);
22214569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                scores.add(keyVal);
22224569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            }
22234569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiLogProto.wifiScoreCount = scores.toArray(mWifiLogProto.wifiScoreCount);
222444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
222544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            /**
222644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             * Convert the SparseIntArray of SoftAp Return codes and counts to proto's repeated
222744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             * IntKeyVal array.
222844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             */
222944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            int codeCounts = mSoftApManagerReturnCodeCounts.size();
223044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            mWifiLogProto.softApReturnCode = new WifiMetricsProto.SoftApReturnCodeCount[codeCounts];
223144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            for (int sapCode = 0; sapCode < codeCounts; sapCode++) {
223244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode] =
223344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        new WifiMetricsProto.SoftApReturnCodeCount();
223444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode].startResult =
223544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        mSoftApManagerReturnCodeCounts.keyAt(sapCode);
223644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode].count =
223744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        mSoftApManagerReturnCodeCounts.valueAt(sapCode);
223844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
2239d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2240d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            /**
2241d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne             * Convert StaEventList to array of StaEvents
2242d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne             */
2243d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            mWifiLogProto.staEventList = new StaEvent[mStaEventList.size()];
2244d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            for (int i = 0; i < mStaEventList.size(); i++) {
2245d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                mWifiLogProto.staEventList[i] = mStaEventList.get(i).staEvent;
2246d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            }
224708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.totalSsidsInScanHistogram =
224808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mTotalSsidsInScanHistogram);
224908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.totalBssidsInScanHistogram =
225008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mTotalBssidsInScanHistogram);
225108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenSsidsInScanHistogram =
225208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableOpenSsidsInScanHistogram);
225308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenBssidsInScanHistogram =
225408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableOpenBssidsInScanHistogram);
225508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedSsidsInScanHistogram =
225608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableSavedSsidsInScanHistogram);
225708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedBssidsInScanHistogram =
225808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableSavedBssidsInScanHistogram);
225908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenOrSavedSsidsInScanHistogram =
226008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
226108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableOpenOrSavedSsidsInScanHistogram);
226208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenOrSavedBssidsInScanHistogram =
226308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
226408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableOpenOrSavedBssidsInScanHistogram);
226508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedPasspointProviderProfilesInScanHistogram =
226608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
226708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableSavedPasspointProviderProfilesInScanHistogram);
226808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedPasspointProviderBssidsInScanHistogram =
226908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
227008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableSavedPasspointProviderBssidsInScanHistogram);
2271910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen            mWifiLogProto.wifiAwareLog = mWifiAwareMetrics.consolidateProto();
227202e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen            mWifiLogProto.wifiRttLog = mRttMetrics.consolidateProto();
2273a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
2274a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mWifiLogProto.pnoScanMetrics = mPnoScanMetrics;
2275a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2276a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            /**
2277a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * Convert the SparseIntArray of "Connect to Network" notification types and counts to
2278a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * proto's repeated IntKeyVal array.
2279a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             */
2280a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            ConnectToNetworkNotificationAndActionCount[] notificationCountArray =
2281a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    new ConnectToNetworkNotificationAndActionCount[
2282a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                            mConnectToNetworkNotificationCount.size()];
2283a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            for (int i = 0; i < mConnectToNetworkNotificationCount.size(); i++) {
2284a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                ConnectToNetworkNotificationAndActionCount keyVal =
2285a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        new ConnectToNetworkNotificationAndActionCount();
2286a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.notification = mConnectToNetworkNotificationCount.keyAt(i);
2287a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.recommender =
2288a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN;
2289a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.count = mConnectToNetworkNotificationCount.valueAt(i);
2290a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                notificationCountArray[i] = keyVal;
2291a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            }
2292a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.connectToNetworkNotificationCount = notificationCountArray;
2293a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2294a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            /**
2295a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * Convert the SparseIntArray of "Connect to Network" notification types and counts to
2296a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * proto's repeated IntKeyVal array.
2297a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             */
2298a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            ConnectToNetworkNotificationAndActionCount[] notificationActionCountArray =
2299a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    new ConnectToNetworkNotificationAndActionCount[
2300a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                            mConnectToNetworkNotificationActionCount.size()];
2301a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            for (int i = 0; i < mConnectToNetworkNotificationActionCount.size(); i++) {
2302a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                ConnectToNetworkNotificationAndActionCount keyVal =
2303a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        new ConnectToNetworkNotificationAndActionCount();
2304a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                int key = mConnectToNetworkNotificationActionCount.keyAt(i);
2305a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.notification = key / CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER;
2306a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.action = key % CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER;
2307a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.recommender =
2308a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN;
2309a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.count = mConnectToNetworkNotificationActionCount.valueAt(i);
2310a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                notificationActionCountArray[i] = keyVal;
2311a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            }
2312a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.connectToNetworkNotificationActionCount = notificationActionCountArray;
2313a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2314a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.openNetworkRecommenderBlacklistSize =
2315a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mOpenNetworkRecommenderBlacklistSize;
2316a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.isWifiNetworksAvailableNotificationOn =
2317a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mIsWifiNetworksAvailableNotificationOn;
2318a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.numOpenNetworkRecommendationUpdates =
2319a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mNumOpenNetworkRecommendationUpdates;
2320a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.numOpenNetworkConnectMessageFailedToSend =
2321a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mNumOpenNetworkConnectMessageFailedToSend;
23229831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
23239831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1ApsInScanHistogram =
23249831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR1ApInScanHistogram);
23259831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2ApsInScanHistogram =
23269831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR2ApInScanHistogram);
23279831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1EssInScanHistogram =
23289831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR1EssInScanHistogram);
23299831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2EssInScanHistogram =
23309831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR2EssInScanHistogram);
23319831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram =
23329831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(
23339831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            mObservedHotspotR1ApsPerEssInScanHistogram);
23349831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram =
23359831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(
23369831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            mObservedHotspotR2ApsPerEssInScanHistogram);
233705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
2338973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            mWifiLogProto.observed80211McSupportingApsInScanHistogram =
2339973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                    makeNumConnectableNetworksBucketArray(mObserved80211mcApInScanHistogram);
2340973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
234105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (mSoftApEventListTethered.size() > 0) {
234205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                mWifiLogProto.softApConnectedClientsEventsTethered =
234305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mSoftApEventListTethered.toArray(
234405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mWifiLogProto.softApConnectedClientsEventsTethered);
234505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
234605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (mSoftApEventListLocalOnly.size() > 0) {
234705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                mWifiLogProto.softApConnectedClientsEventsLocalOnly =
234805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mSoftApEventListLocalOnly.toArray(
234905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mWifiLogProto.softApConnectedClientsEventsLocalOnly);
235005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
235162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
235262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWifiLogProto.wpsMetrics = mWpsMetrics;
2353fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray            mWifiLogProto.wifiPowerStats = mWifiPowerMetrics.buildProto();
235412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach            mWifiLogProto.wifiWakeStats = mWifiWakeMetrics.buildProto();
235528a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim            mWifiLogProto.isMacRandomizationOn = mIsMacRandomizationOn;
2356ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        }
23571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
23582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
235908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiMetricsProto.NumConnectableNetworksBucket[] makeNumConnectableNetworksBucketArray(
236008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            SparseIntArray sia) {
236108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        WifiMetricsProto.NumConnectableNetworksBucket[] array =
236208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                new WifiMetricsProto.NumConnectableNetworksBucket[sia.size()];
236308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        for (int i = 0; i < sia.size(); i++) {
236408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            WifiMetricsProto.NumConnectableNetworksBucket keyVal =
236508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    new WifiMetricsProto.NumConnectableNetworksBucket();
236608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            keyVal.numConnectableNetworks = sia.keyAt(i);
236708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            keyVal.count = sia.valueAt(i);
236808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            array[i] = keyVal;
236908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        }
237008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        return array;
237108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
237208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
23732532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
2374a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * Clear all WifiMetrics, except for currentConnectionEvent and Open Network Notification
2375a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * feature enabled state, blacklist size.
23762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
23772532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private void clear() {
23782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        synchronized (mLock) {
23792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEventList.clear();
23802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
23812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mConnectionEventList.add(mCurrentConnectionEvent);
23822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
23832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mScanReturnEntries.clear();
23842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiSystemStateEntries.clear();
2385107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
23867a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mRssiPollCounts.clear();
23875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mRssiDeltaCounts.clear();
2388f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.clear();
23894569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiScoreCounts.clear();
23902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiLogProto.clear();
23915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
239244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            mSoftApManagerReturnCodeCounts.clear();
239346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            mStaEventList.clear();
2394910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen            mWifiAwareMetrics.clear();
239502e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen            mRttMetrics.clear();
239608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mTotalSsidsInScanHistogram.clear();
239708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mTotalBssidsInScanHistogram.clear();
239808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenSsidsInScanHistogram.clear();
239908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenBssidsInScanHistogram.clear();
240008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedSsidsInScanHistogram.clear();
240108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedBssidsInScanHistogram.clear();
240208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenOrSavedSsidsInScanHistogram.clear();
240308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenOrSavedBssidsInScanHistogram.clear();
240408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedPasspointProviderProfilesInScanHistogram.clear();
240508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedPasspointProviderBssidsInScanHistogram.clear();
2406a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.clear();
2407a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationCount.clear();
2408a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationActionCount.clear();
2409a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkRecommendationUpdates = 0;
2410a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkConnectMessageFailedToSend = 0;
24119831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1ApInScanHistogram.clear();
24129831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2ApInScanHistogram.clear();
24139831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1EssInScanHistogram.clear();
24149831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2EssInScanHistogram.clear();
24159831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1ApsPerEssInScanHistogram.clear();
24169831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2ApsPerEssInScanHistogram.clear();
241705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            mSoftApEventListTethered.clear();
241805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            mSoftApEventListLocalOnly.clear();
241962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.clear();
242012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach            mWifiWakeMetrics.clear();
2421973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            mObserved80211mcApInScanHistogram.clear();
24222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
24232532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
2424ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
2425ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
2426ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set screen state (On/Off)
2427ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
2428ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setScreenState(boolean screenOn) {
2429ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
2430ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = screenOn;
2431ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
2432ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
2433ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
2434ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
2435ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED)
2436ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
2437ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setWifiState(int wifiState) {
2438ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
2439ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = wifiState;
2440e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            mWifiWins = (wifiState == WifiMetricsProto.WifiLog.WIFI_ASSOCIATED);
2441ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
2442ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
244346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
244446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
244546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Message handler for interesting WifiMonitor messages. Generates StaEvents
244646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
244746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private void processMessage(Message msg) {
244846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StaEvent event = new StaEvent();
244946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        boolean logEvent = true;
245046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (msg.what) {
245146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.ASSOCIATION_REJECTION_EVENT:
245246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT;
245346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.associationTimedOut = msg.arg1 > 0 ? true : false;
245446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.status = msg.arg2;
245546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
245646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.AUTHENTICATION_FAILURE_EVENT:
245746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT;
2458b6a730ce63a9a864adaea6ba1bee827444be52a5Ahmed ElArabawy                switch (msg.arg1) {
245946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_NONE:
246046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_NONE;
246146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
246246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_TIMEOUT:
246346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_TIMEOUT;
246446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
246546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD:
246646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_WRONG_PSWD;
246746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
246846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE:
246946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_EAP_FAILURE;
247046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
247146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    default:
247246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
247346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
247446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
247546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.NETWORK_CONNECTION_EVENT:
247646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_NETWORK_CONNECTION_EVENT;
247746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
247846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.NETWORK_DISCONNECTION_EVENT:
247946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT;
248046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.reason = msg.arg2;
248146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.localGen = msg.arg1 == 0 ? false : true;
248246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
248346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT:
248446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                logEvent = false;
248546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                StateChangeResult stateChangeResult = (StateChangeResult) msg.obj;
248646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                mSupplicantStateChangeBitmask |= supplicantStateToBit(stateChangeResult.state);
248746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
248846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiStateMachine.CMD_ASSOCIATED_BSSID:
248946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_CMD_ASSOCIATED_BSSID;
249046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
249146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiStateMachine.CMD_TARGET_BSSID:
249246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_CMD_TARGET_BSSID;
249346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
249446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
249546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return;
249646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
249746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (logEvent) {
249846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            addStaEvent(event);
249946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
250046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
250146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
250246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
250346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
250446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
250546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
250646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type) {
250746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, null);
250846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
250946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
251046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
251146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
251246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
251346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param config WifiConfiguration for a framework initiated connection attempt
251446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
251546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, WifiConfiguration config) {
251646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, config);
251746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
251846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
251946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
252046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
252146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
252246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework
252346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     *                                  initiated a FRAMEWORK_DISCONNECT
252446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
252546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, int frameworkDisconnectReason) {
252646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, frameworkDisconnectReason, null);
252746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
252846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
252946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
253046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
253146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
253246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework
253346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     *                                  initiated a FRAMEWORK_DISCONNECT
253446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param config WifiConfiguration for a framework initiated connection attempt
253546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
253646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, int frameworkDisconnectReason, WifiConfiguration config) {
253746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (type) {
253846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL:
253946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST:
254046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST:
254146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_CONNECT:
254246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_ROAM:
254346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CONNECT_NETWORK:
254446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK:
254546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_FRAMEWORK_DISCONNECT:
2546e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            case StaEvent.TYPE_SCORE_BREACH:
254728a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim            case StaEvent.TYPE_MAC_CHANGE:
254846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
254946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
255046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                Log.e(TAG, "Unknown StaEvent:" + type);
255146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return;
255246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
255346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StaEvent event = new StaEvent();
255446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        event.type = type;
255546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (frameworkDisconnectReason != StaEvent.DISCONNECT_UNKNOWN) {
255646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            event.frameworkDisconnectReason = frameworkDisconnectReason;
255746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
255846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        event.configInfo = createConfigInfo(config);
255946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        addStaEvent(event);
256046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
256146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
256246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private void addStaEvent(StaEvent staEvent) {
256346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.startTimeMillis = mClock.getElapsedSinceBootMillis();
256446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastRssi = mLastPollRssi;
256546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastFreq = mLastPollFreq;
256646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastLinkSpeed = mLastPollLinkSpeed;
256746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.supplicantStateChangesBitmask = mSupplicantStateChangeBitmask;
2568e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        staEvent.lastScore = mLastScore;
256946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mSupplicantStateChangeBitmask = 0;
257046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollRssi = -127;
257146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollFreq = -1;
257246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollLinkSpeed = -1;
2573e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        mLastScore = -1;
2574d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        mStaEventList.add(new StaEventWithTime(staEvent, mClock.getWallClockMillis()));
257546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        // Prune StaEventList if it gets too long
257646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (mStaEventList.size() > MAX_STA_EVENTS) mStaEventList.remove();
257746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
257846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
257946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private ConfigInfo createConfigInfo(WifiConfiguration config) {
258046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (config == null) return null;
258146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        ConfigInfo info = new ConfigInfo();
258246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedKeyManagement = bitSetToInt(config.allowedKeyManagement);
258346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedProtocols = bitSetToInt(config.allowedProtocols);
258446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedAuthAlgorithms = bitSetToInt(config.allowedAuthAlgorithms);
258546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedPairwiseCiphers = bitSetToInt(config.allowedPairwiseCiphers);
258646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedGroupCiphers = bitSetToInt(config.allowedGroupCiphers);
258746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.hiddenSsid = config.hiddenSSID;
258846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.isPasspoint = config.isPasspoint();
258946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.isEphemeral = config.isEphemeral();
259046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.hasEverConnected = config.getNetworkSelectionStatus().getHasEverConnected();
259146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
259246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (candidate != null) {
259346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            info.scanRssi = candidate.level;
259446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            info.scanFreq = candidate.frequency;
259546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
259646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return info;
259746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
259846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
259946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public Handler getHandler() {
260046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return mHandler;
260146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
260246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
2603910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    public WifiAwareMetrics getWifiAwareMetrics() {
2604910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen        return mWifiAwareMetrics;
2605910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    }
2606910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen
260712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    public WifiWakeMetrics getWakeupMetrics() {
260812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        return mWifiWakeMetrics;
260912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    }
261012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
261102e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen    public RttMetrics getRttMetrics() {
261202e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen        return mRttMetrics;
261302e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen    }
261402e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen
261546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    // Rather than generate a StaEvent for each SUPPLICANT_STATE_CHANGE, cache these in a bitmask
261646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    // and attach it to the next event which is generated.
261746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mSupplicantStateChangeBitmask = 0;
261846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
261946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
262046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Converts a SupplicantState value to a single bit, with position defined by
262146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * {@code StaEvent.SupplicantState}
262246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
262346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static int supplicantStateToBit(SupplicantState state) {
262446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch(state) {
262546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case DISCONNECTED:
262646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_DISCONNECTED;
262746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INTERFACE_DISABLED:
262846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INTERFACE_DISABLED;
262946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INACTIVE:
263046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INACTIVE;
263146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case SCANNING:
263246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_SCANNING;
263346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case AUTHENTICATING:
263446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_AUTHENTICATING;
263546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case ASSOCIATING:
263646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_ASSOCIATING;
263746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case ASSOCIATED:
263846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_ASSOCIATED;
263946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case FOUR_WAY_HANDSHAKE:
264046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE;
264146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case GROUP_HANDSHAKE:
264246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_GROUP_HANDSHAKE;
264346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case COMPLETED:
264446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_COMPLETED;
264546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case DORMANT:
264646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_DORMANT;
264746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case UNINITIALIZED:
264846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_UNINITIALIZED;
264946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INVALID:
265046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INVALID;
265146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
265246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                Log.wtf(TAG, "Got unknown supplicant state: " + state.ordinal());
265346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 0;
265446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
265546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
265646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
265746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String supplicantStateChangesBitmaskToString(int mask) {
265846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
2659d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        sb.append("supplicantStateChangeEvents: {");
266046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_DISCONNECTED)) > 0) sb.append(" DISCONNECTED");
266146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INTERFACE_DISABLED)) > 0) sb.append(" INTERFACE_DISABLED");
266246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INACTIVE)) > 0) sb.append(" INACTIVE");
266346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_SCANNING)) > 0) sb.append(" SCANNING");
266446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_AUTHENTICATING)) > 0) sb.append(" AUTHENTICATING");
266546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_ASSOCIATING)) > 0) sb.append(" ASSOCIATING");
266646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_ASSOCIATED)) > 0) sb.append(" ASSOCIATED");
266746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE)) > 0) sb.append(" FOUR_WAY_HANDSHAKE");
266846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_GROUP_HANDSHAKE)) > 0) sb.append(" GROUP_HANDSHAKE");
266946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_COMPLETED)) > 0) sb.append(" COMPLETED");
267046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_DORMANT)) > 0) sb.append(" DORMANT");
267146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_UNINITIALIZED)) > 0) sb.append(" UNINITIALIZED");
267246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INVALID)) > 0) sb.append(" INVALID");
267346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        sb.append("}");
267446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
267546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
267646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
267746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
267846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Returns a human readable string from a Sta Event. Only adds information relevant to the event
267946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * type.
268046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
268146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static String staEventToString(StaEvent event) {
268246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event == null) return "<NULL>";
268346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
268446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (event.type) {
268546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT:
2686d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("ASSOCIATION_REJECTION_EVENT")
268746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" timedOut=").append(event.associationTimedOut)
268846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" status=").append(event.status).append(":")
268946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(ISupplicantStaIfaceCallback.StatusCode.toString(event.status));
269046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
269146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT:
2692d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("AUTHENTICATION_FAILURE_EVENT reason=").append(event.authFailureReason)
269346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(":").append(authFailureReasonToString(event.authFailureReason));
269446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
269546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_CONNECTION_EVENT:
2696d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_CONNECTION_EVENT");
269746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
269846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT:
2699d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_DISCONNECTION_EVENT")
270046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" local_gen=").append(event.localGen)
270146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" reason=").append(event.reason).append(":")
270246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(ISupplicantStaIfaceCallback.ReasonCode.toString(
270346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                                (event.reason >= 0 ? event.reason : -1 * event.reason)));
270446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
270546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_ASSOCIATED_BSSID:
2706d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_ASSOCIATED_BSSID");
270746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
270846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL:
2709d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_CONFIGURATION_SUCCESSFUL");
271046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
271146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST:
2712d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_CONFIGURATION_LOST");
271346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
271446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST:
2715d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_REACHABILITY_LOST");
271646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
271746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_TARGET_BSSID:
2718d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_TARGET_BSSID");
271946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
272046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_CONNECT:
2721d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_START_CONNECT");
272246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
272346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_ROAM:
2724d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_START_ROAM");
272546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
272646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CONNECT_NETWORK:
2727d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CONNECT_NETWORK");
272846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
272946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK:
2730d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_AGENT_VALID_NETWORK");
273146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
273246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_FRAMEWORK_DISCONNECT:
2733d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("FRAMEWORK_DISCONNECT")
273446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" reason=")
273546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(frameworkDisconnectReasonToString(event.frameworkDisconnectReason));
273646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
2737e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            case StaEvent.TYPE_SCORE_BREACH:
2738e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                sb.append("SCORE_BREACH");
2739e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                break;
274028a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim            case StaEvent.TYPE_MAC_CHANGE:
274128a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim                sb.append("MAC_CHANGE");
274228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim                break;
274346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
274446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                sb.append("UNKNOWN " + event.type + ":");
274546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
274646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
274746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastRssi != -127) sb.append(" lastRssi=").append(event.lastRssi);
274846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastFreq != -1) sb.append(" lastFreq=").append(event.lastFreq);
274946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastLinkSpeed != -1) sb.append(" lastLinkSpeed=").append(event.lastLinkSpeed);
2750e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        if (event.lastScore != -1) sb.append(" lastScore=").append(event.lastScore);
275146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.supplicantStateChangesBitmask != 0) {
2752d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(", ").append(supplicantStateChangesBitmaskToString(
275346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    event.supplicantStateChangesBitmask));
275446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
275546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.configInfo != null) {
2756d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(", ").append(configInfoToString(event.configInfo));
275746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
275846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
275946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
276046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
276146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
276246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String authFailureReasonToString(int authFailureReason) {
276346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (authFailureReason) {
276446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_NONE:
276546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_NONE";
276646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_TIMEOUT:
276746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_TIMEOUT";
276846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_WRONG_PSWD:
276946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_WRONG_PSWD";
277046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_EAP_FAILURE:
277146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_EAP_FAILURE";
277246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
277346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "";
277446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
277546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
277646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
277746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String frameworkDisconnectReasonToString(int frameworkDisconnectReason) {
277846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (frameworkDisconnectReason) {
277946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_API:
278046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_API";
278146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_GENERIC:
278246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_GENERIC";
278346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_UNWANTED:
278446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_UNWANTED";
278546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_ROAM_WATCHDOG_TIMER:
278646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_ROAM_WATCHDOG_TIMER";
278746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST:
278846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST";
278946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_RESET_SIM_NETWORKS:
279046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_RESET_SIM_NETWORKS";
279146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
279246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_UNKNOWN=" + frameworkDisconnectReason;
279346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
279446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
279546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
279646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String configInfoToString(ConfigInfo info) {
279746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
279846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        sb.append("ConfigInfo:")
279946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_key_management=").append(info.allowedKeyManagement)
280046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_protocols=").append(info.allowedProtocols)
280146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_auth_algorithms=").append(info.allowedAuthAlgorithms)
280246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_pairwise_ciphers=").append(info.allowedPairwiseCiphers)
280346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_group_ciphers=").append(info.allowedGroupCiphers)
280446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" hidden_ssid=").append(info.hiddenSsid)
280546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" is_passpoint=").append(info.isPasspoint)
280646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" is_ephemeral=").append(info.isEphemeral)
280746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" has_ever_connected=").append(info.hasEverConnected)
280846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" scan_rssi=").append(info.scanRssi)
280946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" scan_freq=").append(info.scanFreq);
281046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
281146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
281246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
2813e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    public static final int MAX_STA_EVENTS = 768;
2814d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    private LinkedList<StaEventWithTime> mStaEventList = new LinkedList<StaEventWithTime>();
281546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollRssi = -127;
281646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollLinkSpeed = -1;
281746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollFreq = -1;
2818e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    private int mLastScore = -1;
281946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
282046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
282146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Converts the first 31 bits of a BitSet to a little endian int
282246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
282346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static int bitSetToInt(BitSet bits) {
282446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        int value = 0;
282546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        int nBits = bits.length() < 31 ? bits.length() : 31;
282646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        for (int i = 0; i < nBits; i++) {
282746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            value += bits.get(i) ? (1 << i) : 0;
282846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
282946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return value;
283046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
283108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementSsid(SparseIntArray sia, int element) {
283208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_CONNECTABLE_SSID_NETWORK_BUCKET));
283308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
283408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementBssid(SparseIntArray sia, int element) {
283508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_CONNECTABLE_BSSID_NETWORK_BUCKET));
283608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
283708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementTotalScanResults(SparseIntArray sia, int element) {
283808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULTS_BUCKET));
283908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
284008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementTotalScanSsids(SparseIntArray sia, int element) {
284108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET));
284208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
28439831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementTotalPasspointAps(SparseIntArray sia, int element) {
28449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_APS_BUCKET));
28459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
28469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementTotalUniquePasspointEss(SparseIntArray sia, int element) {
28479831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET));
28489831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
28499831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementPasspointPerUniqueEss(SparseIntArray sia, int element) {
28509831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET));
28519831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
2852973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    private void increment80211mcAps(SparseIntArray sia, int element) {
2853973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_80211MC_APS_BUCKET));
2854973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    }
285508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void increment(SparseIntArray sia, int element) {
285608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        int count = sia.get(element);
285708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        sia.put(element, count + 1);
285808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
2859d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2860d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    private static class StaEventWithTime {
2861d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public StaEvent staEvent;
2862d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public long wallClockMillis;
2863d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2864d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        StaEventWithTime(StaEvent event, long wallClockMillis) {
2865d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            staEvent = event;
2866d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            this.wallClockMillis = wallClockMillis;
2867d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        }
2868d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2869d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public String toString() {
2870d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            StringBuilder sb = new StringBuilder();
2871d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            Calendar c = Calendar.getInstance();
2872d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            c.setTimeInMillis(wallClockMillis);
2873d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            if (wallClockMillis != 0) {
2874d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
2875d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            } else {
2876d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("                  ");
2877d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            }
2878d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(" ").append(staEventToString(staEvent));
2879d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            return sb.toString();
2880d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        }
2881d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    }
28821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne}
2883