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
5304012eb3e692202b25095f7afc1eda40b63e3e0fxshuimport org.json.JSONArray;
5404012eb3e692202b25095f7afc1eda40b63e3e0fxshuimport org.json.JSONException;
5504012eb3e692202b25095f7afc1eda40b63e3e0fxshuimport org.json.JSONObject;
5604012eb3e692202b25095f7afc1eda40b63e3e0fxshu
571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor;
581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter;
591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList;
6046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.BitSet;
611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar;
629831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport java.util.HashMap;
6308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.HashSet;
6446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.LinkedList;
651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List;
669831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport java.util.Map;
6708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.Set;
681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/**
701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated.
711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include:
721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Aggregated connection stats (num of connections, num of failures, ...)
731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Discrete connection event stats (time, duration, failure codes, ...)
741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Router details (technology type, authentication type, ...)
751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Scan stats
761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */
771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics {
781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final String TAG = "WifiMetrics";
79c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final boolean DBG = false;
807a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
817a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL
827a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
837a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MAX_RSSI_POLL = 0;
847a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MIN_RSSI_POLL = -127;
855cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final int MAX_RSSI_DELTA = 127;
865cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final int MIN_RSSI_DELTA = -127;
875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Maximum time period between ScanResult and RSSI poll to generate rssi delta datapoint */
885cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final long TIMEOUT_RSSI_DELTA_MILLIS =  3000;
894569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private static final int MIN_WIFI_SCORE = 0;
904569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private static final int MAX_WIFI_SCORE = NetworkAgent.WIFI_BASE_SCORE;
91e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    @VisibleForTesting
92e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    static final int LOW_WIFI_SCORE = 50; // Mobile data score
931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private final Object mLock = new Object();
942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private static final int MAX_CONNECTION_EVENTS = 256;
9508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    // Largest bucket in the NumConnectableNetworkCount histogram,
9608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    // anything large will be stored in this bucket
9708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_CONNECTABLE_SSID_NETWORK_BUCKET = 20;
9808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_CONNECTABLE_BSSID_NETWORK_BUCKET = 50;
9908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET = 100;
10008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_TOTAL_SCAN_RESULTS_BUCKET = 250;
1019831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_TOTAL_PASSPOINT_APS_BUCKET = 50;
1029831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET = 20;
1039831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET = 50;
104973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    public static final int MAX_TOTAL_80211MC_APS_BUCKET = 20;
105a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private static final int CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER = 1000;
10605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    // Max limit for number of soft AP related events, extra events will be dropped.
10705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private static final int MAX_NUM_SOFT_AP_EVENTS = 256;
108107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private Clock mClock;
109ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private boolean mScreenOn;
110ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private int mWifiState;
111910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    private WifiAwareMetrics mWifiAwareMetrics;
11202e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen    private RttMetrics mRttMetrics;
113a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    private final PnoScanMetrics mPnoScanMetrics = new PnoScanMetrics();
11462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    private final WpsMetrics mWpsMetrics = new WpsMetrics();
11546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private Handler mHandler;
116a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass    private ScoringParams mScoringParams;
11708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiConfigManager mWifiConfigManager;
11808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiNetworkSelector mWifiNetworkSelector;
11908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private PasspointManager mPasspointManager;
1201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Metrics are stored within an instance of the WifiLog proto during runtime,
1221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during
1231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced
1241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * together at dump-time
1251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog();
1271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Session information that gets logged for every Wifi connection attempt.
1291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>();
1311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The latest started (but un-ended) connection attempt
1331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private ConnectionEvent mCurrentConnectionEvent;
1351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode
1371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1387a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mScanReturnEntries = new SparseIntArray();
1391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Mapping of system state to the counts of scans requested in that wifi state * screenOn
1411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * combination. Indexed by WifiLog.WifiState * (1 + screenOn)
1421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1437a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray();
14404012eb3e692202b25095f7afc1eda40b63e3e0fxshu    /** Mapping of channel frequency to its RSSI distribution histogram **/
14504012eb3e692202b25095f7afc1eda40b63e3e0fxshu    private final Map<Integer, SparseIntArray> mRssiPollCountsMap = new HashMap<>();
1465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Mapping of RSSI scan-poll delta values to counts. */
1475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private final SparseIntArray mRssiDeltaCounts = new SparseIntArray();
1485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** RSSI of the scan result for the last connection event*/
1495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private int mScanResultRssi = 0;
1505cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Boot-relative timestamp when the last candidate scanresult was received, used to calculate
1515cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        RSSI deltas. -1 designates no candidate scanResult being tracked */
1525cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private long mScanResultRssiTimestampMillis = -1;
153f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of alert reason to the respective alert count. */
154f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray();
155107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    /**
156107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data
157107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * capture for for this WifiMetricsProto
158107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     */
159107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private long mRecordStartTimeSec;
1604569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    /** Mapping of Wifi Scores to counts */
1614569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private final SparseIntArray mWifiScoreCounts = new SparseIntArray();
16244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    /** Mapping of SoftApManager start SoftAp return codes to counts */
16344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    private final SparseIntArray mSoftApManagerReturnCodeCounts = new SparseIntArray();
16408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
16508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mTotalSsidsInScanHistogram = new SparseIntArray();
16608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mTotalBssidsInScanHistogram = new SparseIntArray();
16708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenSsidsInScanHistogram = new SparseIntArray();
16808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenBssidsInScanHistogram = new SparseIntArray();
16908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedSsidsInScanHistogram = new SparseIntArray();
17008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedBssidsInScanHistogram = new SparseIntArray();
17108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenOrSavedSsidsInScanHistogram = new SparseIntArray();
17208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenOrSavedBssidsInScanHistogram = new SparseIntArray();
17308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedPasspointProviderProfilesInScanHistogram =
17408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            new SparseIntArray();
17508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedPasspointProviderBssidsInScanHistogram =
17608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            new SparseIntArray();
17708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
178a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Mapping of "Connect to Network" notifications to counts. */
179a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private final SparseIntArray mConnectToNetworkNotificationCount = new SparseIntArray();
180a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Mapping of "Connect to Network" notification user actions to counts. */
181a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private final SparseIntArray mConnectToNetworkNotificationActionCount = new SparseIntArray();
182a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mOpenNetworkRecommenderBlacklistSize = 0;
183a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private boolean mIsWifiNetworksAvailableNotificationOn = false;
184a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mNumOpenNetworkConnectMessageFailedToSend = 0;
185a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mNumOpenNetworkRecommendationUpdates = 0;
18605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /** List of soft AP events related to number of connected clients in tethered mode */
18705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private final List<SoftApConnectedClientsEvent> mSoftApEventListTethered = new ArrayList<>();
18805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /** List of soft AP events related to number of connected clients in local only mode */
18905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private final List<SoftApConnectedClientsEvent> mSoftApEventListLocalOnly = new ArrayList<>();
190a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1919831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1ApInScanHistogram = new SparseIntArray();
1929831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2ApInScanHistogram = new SparseIntArray();
1939831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1EssInScanHistogram = new SparseIntArray();
1949831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2EssInScanHistogram = new SparseIntArray();
1959831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1ApsPerEssInScanHistogram = new SparseIntArray();
1969831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2ApsPerEssInScanHistogram = new SparseIntArray();
1979831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
198973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    private final SparseIntArray mObserved80211mcApInScanHistogram = new SparseIntArray();
199973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
200fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray    /** Wifi power metrics*/
201fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray    private WifiPowerMetrics mWifiPowerMetrics = new WifiPowerMetrics();
202fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray
20312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    /** Wifi Wake metrics */
20412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    private final WifiWakeMetrics mWifiWakeMetrics = new WifiWakeMetrics();
20512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
20628a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim    private boolean mIsMacRandomizationOn = false;
20728a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim
2081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class RouterFingerPrint {
2091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto;
2102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        RouterFingerPrint() {
2111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint();
2121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
2151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
2161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
2171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType);
2181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo);
2191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mDtim=" + mRouterFingerPrintProto.dtim);
2201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication);
2211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mHidden=" + mRouterFingerPrintProto.hidden);
2221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology);
2231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6);
2241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
2251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
2261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        public void updateFromWifiConfiguration(WifiConfiguration config) {
228ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            synchronized (mLock) {
229ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (config != null) {
230ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Is this a hidden network
231ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mRouterFingerPrintProto.hidden = config.hiddenSSID;
232ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Config may not have a valid dtimInterval set yet, in which case dtim will be zero
233ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // (These are only populated from beacon frame scan results, which are returned as
234ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // scan results from the chip far less frequently than Probe-responses)
235ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.dtimInterval > 0) {
236ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mRouterFingerPrintProto.dtim = config.dtimInterval;
237ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
238ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mCurrentConnectionEvent.mConfigSsid = config.SSID;
239ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Get AuthType information from config (We do this again from ScanResult after
240ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // associating with BSSID)
241ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.allowedKeyManagement != null
242ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                            && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
243ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
244ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
245ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else if (config.isEnterprise()) {
246ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
247ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
248ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else {
249ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
250ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
251ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
25259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
25359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                            .passpoint = config.isPasspoint();
254ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // If there's a ScanResult candidate associated with this config already, get it and
255ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // log (more accurate) metrics from it
256ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
257ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (candidate != null) {
258ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        updateMetricsFromScanResult(candidate);
259ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
26096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
2612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
2622532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
2631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
2641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
2661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Log event, tracking the start time, end time and result of a wireless connection attempt.
2671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
2681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class ConnectionEvent {
2691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        WifiMetricsProto.ConnectionEvent mConnectionEvent;
27096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field
27196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //covering more than just l2 failures. see b/27652362
27296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        /**
27396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot
27496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * more failures than just l2 though, since the proto does not have a place to log
27596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * framework failures)
27696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         */
2772532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // Failure is unknown
27896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_UNKNOWN = 0;
2792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NONE
28096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NONE = 1;
2812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // ASSOCIATION_REJECTION_EVENT
28296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ASSOCIATION_REJECTION = 2;
2832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // AUTHENTICATION_FAILURE_EVENT
28496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_AUTHENTICATION_FAILURE = 3;
2852532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // SSID_TEMP_DISABLED (Also Auth failure)
28696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_SSID_TEMP_DISABLED = 4;
2874dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // reconnect() or reassociate() call to WifiNative failed
28896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_CONNECT_NETWORK_FAILED = 5;
2892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NETWORK_DISCONNECTION_EVENT
29096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NETWORK_DISCONNECTION = 6;
2914dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // NEW_CONNECTION_ATTEMPT before previous finished
29296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7;
29396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // New connection attempt to the same network & bssid
29496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8;
29596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // Roam Watchdog timer triggered (Roaming timed out)
29696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ROAM_TIMEOUT = 9;
29796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // DHCP failure
29896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_DHCP = 10;
299b195838541edf2597659b217291079c52623d85cRoshan Pius        // ASSOCIATION_TIMED_OUT
300b195838541edf2597659b217291079c52623d85cRoshan Pius        public static final int FAILURE_ASSOCIATION_TIMED_OUT = 11;
30196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne
3024dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        RouterFingerPrint mRouterFingerPrint;
3034dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealStartTime;
3044dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealEndTime;
3054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigSsid;
3064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigBssid;
307ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private int mWifiState;
308ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private boolean mScreenOn;
3092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
3101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private ConnectionEvent() {
3111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mConnectionEvent = new WifiMetricsProto.ConnectionEvent();
312947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealEndTime = 0;
313947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealStartTime = 0;
3142532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mRouterFingerPrint = new RouterFingerPrint();
3152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto;
3164dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigSsid = "<NULL>";
3174dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigBssid = "<NULL>";
318ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN;
319ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = false;
3201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
3211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
3221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
3231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
3241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            sb.append("startTime=");
3251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            Calendar c = Calendar.getInstance();
3261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
3271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                c.setTimeInMillis(mConnectionEvent.startTimeMillis);
3281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.startTimeMillis == 0 ? "            <null>" :
3291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
3304dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", SSID=");
3314dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigSsid);
3324dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", BSSID=");
3334dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigBssid);
3344dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", durationMillis=");
3351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.durationTakenToConnectMillis);
3362532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                sb.append(", roamType=");
3374dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.roamType) {
3382532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 1:
3392532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_NONE");
3402532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3412532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 2:
3422532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_DBDC");
3432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3442532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 3:
3452532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_ENTERPRISE");
3462532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3472532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 4:
3482532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_USER_SELECTED");
3492532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3502532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 5:
3512532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNRELATED");
3522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    default:
3542532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNKNOWN");
3552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                }
3564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", connectionResult=");
3574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.connectionResult);
3581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", level2FailureCode=");
3594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.level2FailureCode) {
36096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NONE:
3614dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
3624dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ASSOCIATION_REJECTION:
3644dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("ASSOCIATION_REJECTION");
3654dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_AUTHENTICATION_FAILURE:
3674dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("AUTHENTICATION_FAILURE");
3684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_SSID_TEMP_DISABLED:
3704dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("SSID_TEMP_DISABLED");
3714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
37296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_CONNECT_NETWORK_FAILED:
3734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("CONNECT_NETWORK_FAILED");
3744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
37596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NETWORK_DISCONNECTION:
3764dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NETWORK_DISCONNECTION");
3774dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
37896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NEW_CONNECTION_ATTEMPT:
3794dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NEW_CONNECTION_ATTEMPT");
3804dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
38196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_REDUNDANT_CONNECTION_ATTEMPT:
38296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("REDUNDANT_CONNECTION_ATTEMPT");
38396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
38496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ROAM_TIMEOUT:
38596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("ROAM_TIMEOUT");
38696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
38796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_DHCP:
38896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("DHCP");
389b195838541edf2597659b217291079c52623d85cRoshan Pius                        break;
390b195838541edf2597659b217291079c52623d85cRoshan Pius                    case FAILURE_ASSOCIATION_TIMED_OUT:
391b195838541edf2597659b217291079c52623d85cRoshan Pius                        sb.append("ASSOCIATION_TIMED_OUT");
392b195838541edf2597659b217291079c52623d85cRoshan Pius                        break;
3934dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
3944dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
3954dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3964dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
3971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", connectivityLevelFailureCode=");
3984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.connectivityLevelFailureCode) {
3994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NONE:
4004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
4014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4024dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_DHCP:
4034dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("DHCP");
4044dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET:
4064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NO_INTERNET");
4074dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4084dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED:
4094dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNWANTED");
4104dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
4124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
4134dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
4144dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
4154dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", signalStrength=");
4164dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.signalStrength);
417ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", wifiState=");
418ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                switch(mWifiState) {
419ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISABLED:
420ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISABLED");
421ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
422ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
423ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISCONNECTED");
424ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
425ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
426ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_ASSOCIATED");
427ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
428ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    default:
429ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_UNKNOWN");
430ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
431ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                }
432ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", screenOn=");
433ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(mScreenOn);
434ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(". mRouterFingerprint: ");
4351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mRouterFingerPrint.toString());
4361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
4371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
4381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
44102e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen    public WifiMetrics(Clock clock, Looper looper, WifiAwareMetrics awareMetrics,
44202e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen            RttMetrics rttMetrics) {
443107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mClock = clock;
4441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mCurrentConnectionEvent = null;
445ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mScreenOn = true;
446ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED;
447107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
448910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen        mWifiAwareMetrics = awareMetrics;
44902e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen        mRttMetrics = rttMetrics;
45046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
45146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mHandler = new Handler(looper) {
45246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            public void handleMessage(Message msg) {
45346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                synchronized (mLock) {
45446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    processMessage(msg);
45546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
45646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            }
45746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        };
4581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
460a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass    /** Sets internal ScoringParams member */
461a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass    public void setScoringParams(ScoringParams scoringParams) {
462a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass        mScoringParams = scoringParams;
463a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass    }
464a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass
46508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal WifiConfigManager member */
46608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setWifiConfigManager(WifiConfigManager wifiConfigManager) {
46708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mWifiConfigManager = wifiConfigManager;
46808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
46908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
47008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal WifiNetworkSelector member */
47108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setWifiNetworkSelector(WifiNetworkSelector wifiNetworkSelector) {
47208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mWifiNetworkSelector = wifiNetworkSelector;
47308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
47408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
47508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal PasspointManager member */
47608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setPasspointManager(PasspointManager passpointManager) {
47708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mPasspointManager = passpointManager;
47808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
47908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
480a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
481a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment total number of attempts to start a pno scan
482a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
483a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanStartAttempCount() {
484a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
485a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanAttempts++;
486a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
487a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
488a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
489a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
490a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment total number of attempts with pno scan failed
491a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
492a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanFailedCount() {
493a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
494a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanFailed++;
495a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
496a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
497a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
498a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
499a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of pno scans started successfully over offload
500a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
501a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanStartedOverOffloadCount() {
502a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
503a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanStartedOverOffload++;
504a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
505a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
506a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
507a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
508a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of pno scans failed over offload
509a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
510a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanFailedOverOffloadCount() {
511a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
512a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanFailedOverOffload++;
513a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
514a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
515a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
516a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
517a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of times pno scan found a result
518a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
519a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoFoundNetworkEventCount() {
520a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
521a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoFoundNetworkEvents++;
522a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
523a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
524a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
52562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
52662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps connection attempts
52762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
52862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsAttemptCount() {
52962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
53062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsAttempts++;
53162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
53262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
53362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
53462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
53562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps connection success
53662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
53762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsSuccessCount() {
53862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
53962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsSuccess++;
54062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
54162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
54262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
54362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
54462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps failure on start
54562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
54662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsStartFailureCount() {
54762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
54862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsStartFailure++;
54962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
55062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
55162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
55262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
55362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps overlap failure
55462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
55562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsOverlapFailureCount() {
55662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
55762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsOverlapFailure++;
55862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
55962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
56062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
56162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
56262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps timeout failure
56362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
56462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsTimeoutFailureCount() {
56562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
56662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsTimeoutFailure++;
56762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
56862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
56962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
57062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
57162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of other wps failure during connection
57262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
57362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsOtherConnectionFailureCount() {
57462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
57562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsOtherConnectionFailure++;
57662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
57762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
57862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
57962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
58062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of supplicant failure after wps
58162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
58262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsSupplicantFailureCount() {
58362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
58462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsSupplicantFailure++;
58562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
58662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
58762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
58862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
58962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps cancellation
59062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
59162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsCancellationCount() {
59262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
59362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsCancellation++;
59462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
59562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
59662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
597c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    // Values used for indexing SystemStateEntries
598c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_ON = 1;
599c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_OFF = 0;
600c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
6011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
6021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Create a new connection event. Call when wifi attempts to make a new network connection
6031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity
6041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * failure code.
6051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Gathers and sets the RouterFingerPrint data as well
6061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
607947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne     * @param config WifiConfiguration of the config used for the current connection attempt
6081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X
6091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
61096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne    public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) {
6111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
61296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            // Check if this is overlapping another current connection event
61396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            if (mCurrentConnectionEvent != null) {
61496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                //Is this new Connection Event the same as the current one
61596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                if (mCurrentConnectionEvent.mConfigSsid != null
61696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigBssid != null
61796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && config != null
61896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID)
61996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && (mCurrentConnectionEvent.mConfigBssid.equals("any")
62096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) {
62196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    mCurrentConnectionEvent.mConfigBssid = targetBSSID;
62296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to the same network
62396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT,
62496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
62596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                } else {
62696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to different network
62796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT,
62896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
62996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
63096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            }
63196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            //If past maximum connection events, start removing the oldest
6324dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) {
6334dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                mConnectionEventList.remove(0);
6344dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            }
6354dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent = new ConnectionEvent();
6364dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.startTimeMillis =
637107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    mClock.getWallClockMillis();
63896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = targetBSSID;
6394dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
6404dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config);
64196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = "any";
642107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis();
643ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mWifiState = mWifiState;
644ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mScreenOn = mScreenOn;
6454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConnectionEventList.add(mCurrentConnectionEvent);
6465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
6475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            if (config != null) {
6485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
6495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (candidate != null) {
6505cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // Cache the RSSI of the candidate, as the connection event level is updated
6515cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // from other sources (polls, bssid_associations) and delta requires the
6525cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // scanResult rssi
6535cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssi = candidate.level;
6545cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssiTimestampMillis = mClock.getElapsedSinceBootMillis();
6555cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
6565cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
6571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
6612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * set the RoamType of the current ConnectionEvent (if any)
6622532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
6632532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    public void setConnectionEventRoamType(int roamType) {
664ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
665ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null) {
666ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
667ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            }
6682532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
6692532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
670f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
671f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    /**
672f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Set AP related metrics from ScanDetail
673f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
674f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void setConnectionScanDetail(ScanDetail scanDetail) {
675ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
676ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null && scanDetail != null) {
677ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
678ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
679ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //Ensure that we have a networkDetail, and that it corresponds to the currently
680ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //tracked connection attempt
681ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (networkDetail != null && scanResult != null
682ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid != null
683ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid
684ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        .equals("\"" + networkDetail.getSSID() + "\"")) {
685ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromNetworkDetail(networkDetail);
686ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromScanResult(scanResult);
687ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                }
688f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne            }
689f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        }
690f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
691f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
6922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
6931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * End a Connection event record. Call when wifi connection attempt succeeds or fails.
6941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If a Connection event has not been started and is active when .end is called, a new one is
6951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * created with zero duration.
6961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
6971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param level2FailureCode Level 2 failure code returned by supplicant
6981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X
6991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
7001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) {
7011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7022532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
7032532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                boolean result = (level2FailureCode == 1)
7042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE);
7052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0;
706107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis();
7072532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int)
7082532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        (mCurrentConnectionEvent.mRealEndTime
7092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        - mCurrentConnectionEvent.mRealStartTime);
7102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode;
7112532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode =
7122532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        connectivityFailureCode;
713f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                // ConnectionEvent already added to ConnectionEvents List. Safe to null current here
7142532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent = null;
7155cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (!result) {
7165cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssiTimestampMillis = -1;
7175cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
7181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
7191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7222b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
7232b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail
7242b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
7252b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) {
7262b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int dtimInterval = networkDetail.getDtimInterval();
7272b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (dtimInterval > 0) {
7282b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim =
7292b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                    dtimInterval;
7302b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
7312b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int connectionWifiMode;
7322b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        switch (networkDetail.getWifiMode()) {
7332b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_UNDEFINED:
7342b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN;
7352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11A:
7372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A;
7382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11B:
7402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B;
7412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11G:
7432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G;
7442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11N:
7462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N;
7472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11AC  :
7492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC;
7502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            default:
7522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER;
7532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
7552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
7562b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                .routerTechnology = connectionWifiMode;
7572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
7582b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
7592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
7602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent RSSI and authentication type from ScanResult
7612b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
7622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromScanResult(ScanResult scanResult) {
7632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level;
7642b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
76696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID;
7672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (scanResult.capabilities != null) {
76859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
7692b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7702b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
77159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) {
7722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7732b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
77459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
7752b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7762b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
7772b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            }
7782b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
77996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo =
78096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                scanResult.frequency;
7812b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
7822b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
7831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsLocationEnabled(boolean enabled) {
7841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isLocationEnabled = enabled;
7861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsScanningAlwaysEnabled(boolean enabled) {
7901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isScanningAlwaysEnabled = enabled;
7921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
7961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Non Empty Scan Results count
7971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
7981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementNonEmptyScanResultCount() {
799c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount");
8001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
8011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNonEmptyScanResults++;
8021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
8031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
8041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
8051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
8061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Empty Scan Results count
8071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
8081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementEmptyScanResultCount() {
809c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementEmptyScanResultCount");
8101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
8111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numEmptyScanResults++;
8121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
8131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
8141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
8151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
816c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Increment background scan count
817c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
818c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementBackgroundScanCount() {
819c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementBackgroundScanCount");
820c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
821c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numBackgroundScans++;
822c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
823c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
824c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
825c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne   /**
826c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get Background scan count
827c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
828c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getBackgroundScanCount() {
829c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
830c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numBackgroundScans;
831c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
832c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
833c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
834c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
83570ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne     * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry
836c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
837c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementOneshotScanCount() {
838c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
839c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numOneshotScans++;
840c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
84170ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne        incrementWifiSystemScanStateCount(mWifiState, mScreenOn);
842c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
843c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
844c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
845424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     * Increment connectivity oneshot scan count.
846424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     */
847424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    public void incrementConnectivityOneshotScanCount() {
848424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        synchronized (mLock) {
849424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang            mWifiLogProto.numConnectivityOneshotScans++;
850424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        }
851424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    }
852424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang
853424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    /**
854c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get oneshot scan count
855c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
856c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getOneshotScanCount() {
857c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
858c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numOneshotScans;
859c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
860c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
861c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
862424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    /**
863424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     * Get connectivity oneshot scan count
864424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     */
865424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    public int getConnectivityOneshotScanCount() {
866424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        synchronized (mLock) {
867424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang            return mWifiLogProto.numConnectivityOneshotScans;
868424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        }
869424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    }
870424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang
87105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    /**
87205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     * Increment oneshot scan count for external apps.
87305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     */
87405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    public void incrementExternalAppOneshotScanRequestsCount() {
87505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        synchronized (mLock) {
87605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius            mWifiLogProto.numExternalAppOneshotScanRequests++;
87705a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        }
87805a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    }
87905a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    /**
88005a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     * Increment oneshot scan throttle count for external foreground apps.
88105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     */
88205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    public void incrementExternalForegroundAppOneshotScanRequestsThrottledCount() {
88305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        synchronized (mLock) {
88405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius            mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled++;
88505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        }
88605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    }
88705a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius
88805a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    /**
88905a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     * Increment oneshot scan throttle count for external background apps.
89005a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius     */
89105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    public void incrementExternalBackgroundAppOneshotScanRequestsThrottledCount() {
89205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        synchronized (mLock) {
89305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius            mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled++;
89405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius        }
89505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius    }
89605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius
897c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String returnCodeToString(int scanReturnCode) {
898c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(scanReturnCode){
899c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_UNKNOWN:
900c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_UNKNOWN";
901c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_SUCCESS:
902c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_SUCCESS";
903c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED:
904c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INTERRUPTED";
905c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION:
906c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INVALID_CONFIGURATION";
907c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED:
908c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "FAILURE_WIFI_DISABLED";
909c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
910c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "<UNKNOWN>";
911c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
912c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
913c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
914c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
9151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment count of scan return code occurrence
9161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
9171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X
9181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
919c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) {
9201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
921c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode));
922c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mScanReturnEntries.get(scanReturnCode);
923c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry += countToAdd;
9241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mScanReturnEntries.put(scanReturnCode, entry);
9251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
9261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
927c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
928c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this scanReturnCode
929c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * @param scanReturnCode that we are getting the count for
930c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
931c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getScanReturnEntry(int scanReturnCode) {
932c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
933c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mScanReturnEntries.get(scanReturnCode);
934c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
935c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
936c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
937c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String wifiSystemStateToString(int state) {
938c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(state){
939c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_UNKNOWN:
940c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_UNKNOWN";
941c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISABLED:
942c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISABLED";
943c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
944c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISCONNECTED";
945c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
946c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_ASSOCIATED";
947c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
948c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "default";
949c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
950c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
9511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
9521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
9531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off
9541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
9551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X
9561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param screenOn Is the screen on
9571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
9581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementWifiSystemScanStateCount(int state, boolean screenOn) {
9591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
960c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) {
961c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state)
962c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + " " + screenOn);
9631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
964c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF);
965c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mWifiSystemStateEntries.get(index);
966c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry++;
967c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiSystemStateEntries.put(index, entry);
968c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
969c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
970c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
971c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
972c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this system State Entry
973c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
974c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getSystemStateCount(int state, boolean screenOn) {
975c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
976c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF);
977c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiSystemStateEntries.get(index);
9781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
9791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
9801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
981ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
9825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack
9835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggers() {
9855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggers++;
9875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad association threshold when watchdog triggered
9915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) {
9935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count;
9955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad authentication threshold when watchdog triggered
9995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) {
10015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count;
10035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad dhcp threshold when watchdog triggered
10075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) {
10095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count;
10115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad other threshold when watchdog triggered
10155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) {
10175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count;
10195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks seen when watchdog triggered
10235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) {
10255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count;
10275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad association network
10315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAssociation() {
10335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++;
10355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad authentication network
10395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() {
10415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++;
10435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad dhcp network
10475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadDhcp() {
10495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++;
10515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad other network
10555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadOther() {
10575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++;
10595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10615f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
10625f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
1063ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed pno is working
1064ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1065ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoGood() {
1066ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1067ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoGood++;
1068ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1069ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1070ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1071ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found pno not working
1072ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1073ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoBad() {
1074ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1075ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoBad++;
1076ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1077ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1078ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1079ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed background scan is working
1080ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1081ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundGood() {
1082ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1083ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundGood++;
1084ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1085ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1086ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1087ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found background scan not working
1088ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1089ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundBad() {
1090ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1091ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundBad++;
1092ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1093ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1094ce003b812aead64dcb36647180991150021b24c1Glen Kuhne
10957a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
109646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Increment various poll related metrics, and cache performance data for StaEvent logging
109746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
109846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void handlePollResult(WifiInfo wifiInfo) {
109946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollRssi = wifiInfo.getRssi();
110046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollLinkSpeed = wifiInfo.getLinkSpeed();
110146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollFreq = wifiInfo.getFrequency();
110204012eb3e692202b25095f7afc1eda40b63e3e0fxshu        incrementRssiPollRssiCount(mLastPollFreq, mLastPollRssi);
110346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
110446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
110546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
110604012eb3e692202b25095f7afc1eda40b63e3e0fxshu     * Increment occurence count of RSSI level from RSSI poll for the given frequency.
110704012eb3e692202b25095f7afc1eda40b63e3e0fxshu     * @param frequency (MHz)
110804012eb3e692202b25095f7afc1eda40b63e3e0fxshu     * @param rssi
11097a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
111004012eb3e692202b25095f7afc1eda40b63e3e0fxshu    @VisibleForTesting
111104012eb3e692202b25095f7afc1eda40b63e3e0fxshu    public void incrementRssiPollRssiCount(int frequency, int rssi) {
11127a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) {
11137a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            return;
11147a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
11157a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        synchronized (mLock) {
111604012eb3e692202b25095f7afc1eda40b63e3e0fxshu            if (!mRssiPollCountsMap.containsKey(frequency)) {
111704012eb3e692202b25095f7afc1eda40b63e3e0fxshu                mRssiPollCountsMap.put(frequency, new SparseIntArray());
111804012eb3e692202b25095f7afc1eda40b63e3e0fxshu            }
111904012eb3e692202b25095f7afc1eda40b63e3e0fxshu            SparseIntArray sparseIntArray = mRssiPollCountsMap.get(frequency);
112004012eb3e692202b25095f7afc1eda40b63e3e0fxshu            int count = sparseIntArray.get(rssi);
112104012eb3e692202b25095f7afc1eda40b63e3e0fxshu            sparseIntArray.put(rssi, count + 1);
11225cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            maybeIncrementRssiDeltaCount(rssi - mScanResultRssi);
11235cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        }
11245cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    }
11255cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne
11265cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /**
11275cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * Increment occurence count of difference between scan result RSSI and the first RSSI poll.
11285cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * Ignores rssi values outside the bounds of [MIN_RSSI_DELTA, MAX_RSSI_DELTA]
11295cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * mLock must be held when calling this method.
11305cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     */
11315cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private void maybeIncrementRssiDeltaCount(int rssi) {
11325cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        // Check if this RSSI poll is close enough to a scan result RSSI to log a delta value
11335cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        if (mScanResultRssiTimestampMillis >= 0) {
11345cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            long timeDelta = mClock.getElapsedSinceBootMillis() - mScanResultRssiTimestampMillis;
11355cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            if (timeDelta <= TIMEOUT_RSSI_DELTA_MILLIS) {
11365cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (rssi >= MIN_RSSI_DELTA && rssi <= MAX_RSSI_DELTA) {
11375cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    int count = mRssiDeltaCounts.get(rssi);
11385cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mRssiDeltaCounts.put(rssi, count + 1);
11395cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
11405cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
11415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
11427a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
11437a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    }
11447a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
1145da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne    /**
11461c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne     * Increment count of Watchdog successes.
11471c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne     */
11481c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    public void incrementNumLastResortWatchdogSuccesses() {
11491c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne        synchronized (mLock) {
11501c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne            mWifiLogProto.numLastResortWatchdogSuccesses++;
11511c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne        }
11521c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    }
11531c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne
11541c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    /**
11551f2ef2776476457b3eb2df70e39d53770c6b2b77xshu     * Increment the count of network connection failures that happened after watchdog has been
11561f2ef2776476457b3eb2df70e39d53770c6b2b77xshu     * triggered.
11571f2ef2776476457b3eb2df70e39d53770c6b2b77xshu     */
11581f2ef2776476457b3eb2df70e39d53770c6b2b77xshu    public void incrementWatchdogTotalConnectionFailureCountAfterTrigger() {
11591f2ef2776476457b3eb2df70e39d53770c6b2b77xshu        synchronized (mLock) {
11601f2ef2776476457b3eb2df70e39d53770c6b2b77xshu            mWifiLogProto.watchdogTotalConnectionFailureCountAfterTrigger++;
11611f2ef2776476457b3eb2df70e39d53770c6b2b77xshu        }
11621f2ef2776476457b3eb2df70e39d53770c6b2b77xshu    }
11631f2ef2776476457b3eb2df70e39d53770c6b2b77xshu
11641f2ef2776476457b3eb2df70e39d53770c6b2b77xshu    /**
1165338d87ce46cf0766005f747bb82ac590ceaff54dxshu     * Sets the time taken for wifi to connect after a watchdog triggers a restart.
1166338d87ce46cf0766005f747bb82ac590ceaff54dxshu     * @param milliseconds
1167338d87ce46cf0766005f747bb82ac590ceaff54dxshu     */
1168338d87ce46cf0766005f747bb82ac590ceaff54dxshu    public void setWatchdogSuccessTimeDurationMs(long ms) {
1169338d87ce46cf0766005f747bb82ac590ceaff54dxshu        synchronized (mLock) {
1170338d87ce46cf0766005f747bb82ac590ceaff54dxshu            mWifiLogProto.watchdogTriggerToConnectionSuccessDurationMs = ms;
1171338d87ce46cf0766005f747bb82ac590ceaff54dxshu        }
1172338d87ce46cf0766005f747bb82ac590ceaff54dxshu    }
1173338d87ce46cf0766005f747bb82ac590ceaff54dxshu
1174338d87ce46cf0766005f747bb82ac590ceaff54dxshu    /**
1175f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * Increments the count of alerts by alert reason.
1176f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     *
1177f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * @param reason The cause of the alert. The reason values are driver-specific.
1178f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     */
1179f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    public void incrementAlertReasonCount(int reason) {
1180f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX
1181f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) {
1182f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED;
1183f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
1184f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        synchronized (mLock) {
1185f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            int alertCount = mWifiAlertReasonCounts.get(reason);
1186f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.put(reason, alertCount + 1);
1187f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
1188f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    }
1189f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
1190f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /**
119159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     * Counts all the different types of networks seen in a set of scan results
119259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     */
119359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    public void countScanResults(List<ScanDetail> scanDetails) {
119459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        if (scanDetails == null) {
119559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            return;
119659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
119759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int totalResults = 0;
119859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int openNetworks = 0;
119959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int personalNetworks = 0;
120059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int enterpriseNetworks = 0;
120159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hiddenNetworks = 0;
120259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r1Networks = 0;
120359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r2Networks = 0;
120459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        for (ScanDetail scanDetail : scanDetails) {
120559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            NetworkDetail networkDetail = scanDetail.getNetworkDetail();
120659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            ScanResult scanResult = scanDetail.getScanResult();
120759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            totalResults++;
120859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (networkDetail != null) {
120959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.isHiddenBeaconFrame()) {
121059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    hiddenNetworks++;
121159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
121259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.getHSRelease() != null) {
121359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
121459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r1Networks++;
121559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
121659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r2Networks++;
121759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    }
121859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
121959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
122059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (scanResult != null && scanResult.capabilities != null) {
122159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
122259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    enterpriseNetworks++;
122359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)
122459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        || ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
122559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    personalNetworks++;
122659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else {
122759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    openNetworks++;
122859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
122959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
123059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
123159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        synchronized (mLock) {
123259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numTotalScanResults += totalResults;
123359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numOpenNetworkScanResults += openNetworks;
123459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numPersonalNetworkScanResults += personalNetworks;
123559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks;
123659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks;
123759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks;
123859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks;
123959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numScans++;
124059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
124159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    }
124259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
1243e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    private boolean mWifiWins = false; // Based on scores, use wifi instead of mobile data?
1244e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass
124559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    /**
12464569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * Increments occurence of a particular wifi score calculated
12474569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * in WifiScoreReport by current connected network. Scores are bounded
1248e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     * within  [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray.
1249e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     *
1250e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     * Also records events when the current score breaches significant thresholds.
12514569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     */
12524569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    public void incrementWifiScoreCount(int score) {
12534569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        if (score < MIN_WIFI_SCORE || score > MAX_WIFI_SCORE) {
12544569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            return;
12554569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        }
12564569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        synchronized (mLock) {
12574569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            int count = mWifiScoreCounts.get(score);
12584569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiScoreCounts.put(score, count + 1);
1259e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass
1260e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            boolean wifiWins = mWifiWins;
1261e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            if (mWifiWins && score < LOW_WIFI_SCORE) {
1262e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                wifiWins = false;
1263e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            } else if (!mWifiWins && score > LOW_WIFI_SCORE) {
1264e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                wifiWins = true;
1265e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            }
1266e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            mLastScore = score;
1267e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            if (wifiWins != mWifiWins) {
1268e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                mWifiWins = wifiWins;
1269e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                StaEvent event = new StaEvent();
1270e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                event.type = StaEvent.TYPE_SCORE_BREACH;
1271e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                addStaEvent(event);
1272e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            }
12734569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        }
12744569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    }
127559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
127644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    /**
127744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * Increments occurence of the results from attempting to start SoftAp.
127844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * Maps the |result| and WifiManager |failureCode| constant to proto defined SoftApStartResult
127944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * codes.
128044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     */
128144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    public void incrementSoftApStartResult(boolean result, int failureCode) {
128244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein        synchronized (mLock) {
128344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            if (result) {
128444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
128544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY);
128644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
128744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY,
128844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
128944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                return;
129044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
129144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
129244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            // now increment failure modes - if not explicitly handled, dump into the general
129344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            // error bucket.
129444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            if (failureCode == WifiManager.SAP_START_FAILURE_NO_CHANNEL) {
129544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
129644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL);
129744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
129844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL,
129944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
130044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            } else {
130144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                // failure mode not tracked at this time...  count as a general error for now.
130244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
130344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR);
130444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
130544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR,
130644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
130744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
130844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein        }
130944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    }
131044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
1311bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
131205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record indicating the current up state of soft AP
131305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
131405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    public void addSoftApUpChangedEvent(boolean isUp, int mode) {
131505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        SoftApConnectedClientsEvent event = new SoftApConnectedClientsEvent();
131605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.eventType = isUp ? SoftApConnectedClientsEvent.SOFT_AP_UP :
131705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                SoftApConnectedClientsEvent.SOFT_AP_DOWN;
131805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.numConnectedClients = 0;
131905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        addSoftApConnectedClientsEvent(event, mode);
132005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
132105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
132205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
132305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record for current number of associated stations to soft AP
132405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
132505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    public void addSoftApNumAssociatedStationsChangedEvent(int numStations, int mode) {
132605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        SoftApConnectedClientsEvent event = new SoftApConnectedClientsEvent();
132705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.eventType = SoftApConnectedClientsEvent.NUM_CLIENTS_CHANGED;
132805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.numConnectedClients = numStations;
132905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        addSoftApConnectedClientsEvent(event, mode);
133005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
133105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
133205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
133305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record to the corresponding event list based on mode param
133405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
133505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private void addSoftApConnectedClientsEvent(SoftApConnectedClientsEvent event, int mode) {
133605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        synchronized (mLock) {
133705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            List<SoftApConnectedClientsEvent> softApEventList;
133805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            switch (mode) {
133905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_TETHERED:
134005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    softApEventList = mSoftApEventListTethered;
134105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    break;
134205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_LOCAL_ONLY:
134305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    softApEventList = mSoftApEventListLocalOnly;
134405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    break;
134505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                default:
134605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    return;
134705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
134805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
134905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (softApEventList.size() > MAX_NUM_SOFT_AP_EVENTS) {
135005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                return;
135105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
135205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
13534de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            event.timeStampMillis = mClock.getElapsedSinceBootMillis();
135405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            softApEventList.add(event);
135505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        }
135605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
135705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
135805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
13594de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh     * Updates current soft AP events with channel info
13604de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh     */
13614de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    public void addSoftApChannelSwitchedEvent(int frequency, int bandwidth, int mode) {
13624de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh        synchronized (mLock) {
13634de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            List<SoftApConnectedClientsEvent> softApEventList;
13644de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            switch (mode) {
13654de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_TETHERED:
13664de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    softApEventList = mSoftApEventListTethered;
13674de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
13684de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_LOCAL_ONLY:
13694de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    softApEventList = mSoftApEventListLocalOnly;
13704de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
13714de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                default:
13724de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    return;
13734de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            }
13744de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13754de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            for (int index = softApEventList.size() - 1; index >= 0; index--) {
13764de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                SoftApConnectedClientsEvent event = softApEventList.get(index);
13774de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13784de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                if (event != null && event.eventType == SoftApConnectedClientsEvent.SOFT_AP_UP) {
13794de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    event.channelFrequency = frequency;
13804de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    event.channelBandwidth = bandwidth;
13814de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
13824de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                }
13834de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            }
13844de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh        }
13854de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    }
13864de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13874de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    /**
1388bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the HAL crashed.
1389bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1390bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumHalCrashes() {
1391bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1392bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numHalCrashes++;
1393bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1394bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1395bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1396bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1397bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the Wificond crashed.
1398bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1399bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumWificondCrashes() {
1400bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1401bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numWificondCrashes++;
1402bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1403bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1404bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1405bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1406d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     * Increment number of times the supplicant crashed.
1407d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     */
1408d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    public void incrementNumSupplicantCrashes() {
1409d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        synchronized (mLock) {
141065a9143d6c93624837da3867f1cadf2daab62236Roshan Pius            mWifiLogProto.numSupplicantCrashes++;
1411d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        }
1412d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    }
1413d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius
1414d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    /**
141527c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius     * Increment number of times the hostapd crashed.
141627c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius     */
141727c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    public void incrementNumHostapdCrashes() {
141827c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius        synchronized (mLock) {
141965a9143d6c93624837da3867f1cadf2daab62236Roshan Pius            mWifiLogProto.numHostapdCrashes++;
142027c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius        }
142127c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    }
142227c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius
142327c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    /**
1424bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the wifi on failed due to an error in HAL.
1425bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
14265ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupClientInterfaceFailureDueToHal() {
1427bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
14285ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupClientInterfaceFailureDueToHal++;
1429bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1430bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1431bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1432bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1433bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the wifi on failed due to an error in wificond.
1434bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
14355ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupClientInterfaceFailureDueToWificond() {
1436bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
14375ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupClientInterfaceFailureDueToWificond++;
1438bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1439bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1440bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
144126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
144265a9143d6c93624837da3867f1cadf2daab62236Roshan Pius     * Increment number of times the wifi on failed due to an error in supplicant.
1443d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     */
14445ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupClientInterfaceFailureDueToSupplicant() {
1445d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        synchronized (mLock) {
14465ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant++;
14475ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        }
14485ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    }
14495ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius
14505ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    /**
14515ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     * Increment number of times the SoftAp on failed due to an error in HAL.
14525ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     */
14535ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupSoftApInterfaceFailureDueToHal() {
14545ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        synchronized (mLock) {
14555ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal++;
14565ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        }
14575ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    }
14585ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius
14595ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    /**
14605ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     * Increment number of times the SoftAp on failed due to an error in wificond.
14615ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     */
14625ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupSoftApInterfaceFailureDueToWificond() {
14635ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        synchronized (mLock) {
14645ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond++;
14655ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        }
14665ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    }
14675ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius
14685ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    /**
14695ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     * Increment number of times the SoftAp on failed due to an error in hostapd.
14705ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius     */
14715ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius    public void incrementNumSetupSoftApInterfaceFailureDueToHostapd() {
14725ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius        synchronized (mLock) {
14735ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius            mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd++;
1474d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        }
1475d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    }
1476d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius
1477d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    /**
1478a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius     * Increment number of times we got client interface down.
1479a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius     */
1480a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    public void incrementNumClientInterfaceDown() {
1481a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius        synchronized (mLock) {
1482a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius            mWifiLogProto.numClientInterfaceDown++;
1483a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius        }
1484a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    }
1485a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius
1486a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    /**
1487a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius     * Increment number of times we got client interface down.
1488a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius     */
1489a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    public void incrementNumSoftApInterfaceDown() {
1490a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius        synchronized (mLock) {
1491a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius            mWifiLogProto.numSoftApInterfaceDown++;
1492a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius        }
1493a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    }
1494a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius
1495a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius    /**
149626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider being installed.
149726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
149826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderInstallation() {
149926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
150026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderInstallation++;
150126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
150226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
150326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
150426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
150526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider is installed successfully.
150626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
150726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderInstallSuccess() {
150826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
150926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderInstallSuccess++;
151026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
151126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
151226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
151326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
151426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider being uninstalled.
151526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
151626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderUninstallation() {
151726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
151826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderUninstallation++;
151926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
152026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
152126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
152226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
152326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider is uninstalled successfully.
152426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
152526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderUninstallSuccess() {
152626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
152726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderUninstallSuccess++;
152826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
152926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
1530bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
153108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /**
153280512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius     * Increment number of times we detected a radio mode change to MCC.
153380512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius     */
153480512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    public void incrementNumRadioModeChangeToMcc() {
153580512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius        synchronized (mLock) {
15365d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius            mWifiLogProto.numRadioModeChangeToMcc++;
153780512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius        }
153880512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    }
153980512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius
154080512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    /**
154180512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius     * Increment number of times we detected a radio mode change to SCC.
154280512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius     */
154380512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    public void incrementNumRadioModeChangeToScc() {
154480512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius        synchronized (mLock) {
15455d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius            mWifiLogProto.numRadioModeChangeToScc++;
154680512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius        }
154780512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    }
154880512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius
154980512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    /**
155080512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius     * Increment number of times we detected a radio mode change to SBS.
155180512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius     */
155280512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    public void incrementNumRadioModeChangeToSbs() {
155380512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius        synchronized (mLock) {
15545d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius            mWifiLogProto.numRadioModeChangeToSbs++;
155580512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius        }
155680512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    }
155780512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius
155880512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    /**
155980512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius     * Increment number of times we detected a radio mode change to DBS.
156080512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius     */
156180512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    public void incrementNumRadioModeChangeToDbs() {
156280512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius        synchronized (mLock) {
15635d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius            mWifiLogProto.numRadioModeChangeToDbs++;
156480512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius        }
156580512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    }
156680512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius
156780512c6070e4c2c84a2d7c58ad56d4f1ca3258edRoshan Pius    /**
1568b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius     * Increment number of times we detected a channel did not satisfy user band preference.
1569b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius     */
1570b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius    public void incrementNumSoftApUserBandPreferenceUnsatisfied() {
1571b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius        synchronized (mLock) {
1572b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius            mWifiLogProto.numSoftApUserBandPreferenceUnsatisfied++;
1573b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius        }
1574b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius    }
1575b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius
1576b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius    /**
157708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Increment N-Way network selection decision histograms:
157808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Counts the size of various sets of scanDetails within a scan, and increment the occurrence
157908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * of that size for the associated histogram. There are ten histograms generated for each
158008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * combination of: {SSID, BSSID} *{Total, Saved, Open, Saved_or_Open, Passpoint}
158108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Only performs this count if isFullBand is true, otherwise, increments the partial scan count
158208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     */
158308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void incrementAvailableNetworksHistograms(List<ScanDetail> scanDetails,
158408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            boolean isFullBand) {
158508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        synchronized (mLock) {
158608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            if (mWifiConfigManager == null || mWifiNetworkSelector == null
158708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    || mPasspointManager == null) {
158808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                return;
158908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
159008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            if (!isFullBand) {
159108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                mWifiLogProto.partialAllSingleScanListenerResults++;
159208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                return;
159308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
159408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> ssids = new HashSet<ScanResultMatchInfo>();
159508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int bssids = 0;
159608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> openSsids = new HashSet<ScanResultMatchInfo>();
159708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int openBssids = 0;
159808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> savedSsids = new HashSet<ScanResultMatchInfo>();
159908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int savedBssids = 0;
160008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            // openOrSavedSsids calculated from union of savedSsids & openSsids
160108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int openOrSavedBssids = 0;
160208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<PasspointProvider> savedPasspointProviderProfiles =
160308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    new HashSet<PasspointProvider>();
160408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int savedPasspointProviderBssids = 0;
16059831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            int passpointR1Aps = 0;
16069831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            int passpointR2Aps = 0;
16079831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            Map<ANQPNetworkKey, Integer> passpointR1UniqueEss = new HashMap<>();
16089831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            Map<ANQPNetworkKey, Integer> passpointR2UniqueEss = new HashMap<>();
1609973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            int supporting80211mcAps = 0;
161008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            for (ScanDetail scanDetail : scanDetails) {
161108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
161208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
1613533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
1614533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                // statistics to be collected for ALL APs (irrespective of signal power)
1615533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                if (networkDetail.is80211McResponderSupport()) {
1616533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                    supporting80211mcAps++;
161708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
1618533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
161908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ScanResultMatchInfo matchInfo = ScanResultMatchInfo.fromScanResult(scanResult);
162008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                Pair<PasspointProvider, PasspointMatch> providerMatch = null;
162108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                PasspointProvider passpointProvider = null;
162208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (networkDetail.isInterworking()) {
162308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    providerMatch =
162408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                            mPasspointManager.matchProvider(scanResult);
162508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    passpointProvider = providerMatch != null ? providerMatch.first : null;
16269831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
16279831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
16289831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        passpointR1Aps++;
16299831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
16309831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        passpointR2Aps++;
16319831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
16329831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
16339831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    long bssid = 0;
16349831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    boolean validBssid = false;
16359831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    try {
16369831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        bssid = Utils.parseMac(scanResult.BSSID);
16379831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        validBssid = true;
16389831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    } catch (IllegalArgumentException e) {
16399831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        Log.e(TAG,
16409831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                                "Invalid BSSID provided in the scan result: " + scanResult.BSSID);
16419831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
16429831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    if (validBssid) {
16439831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        ANQPNetworkKey uniqueEss = ANQPNetworkKey.buildKey(scanResult.SSID, bssid,
16449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                                scanResult.hessid, networkDetail.getAnqpDomainID());
16459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
16469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            Integer countObj = passpointR1UniqueEss.get(uniqueEss);
16479831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            int count = countObj == null ? 0 : countObj;
16489831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            passpointR1UniqueEss.put(uniqueEss, count + 1);
16499831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
16509831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            Integer countObj = passpointR2UniqueEss.get(uniqueEss);
16519831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            int count = countObj == null ? 0 : countObj;
16529831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            passpointR2UniqueEss.put(uniqueEss, count + 1);
16539831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        }
16549831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
16559831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
165608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
1657533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
1658533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                if (mWifiNetworkSelector.isSignalTooWeak(scanResult)) {
1659533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                    continue;
1660533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                }
1661533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
1662533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen                // statistics to be collected ONLY for those APs with sufficient signal power
1663533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen
166408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ssids.add(matchInfo);
166508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                bssids++;
166608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isOpen = matchInfo.networkType == ScanResultMatchInfo.NETWORK_TYPE_OPEN;
166708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                WifiConfiguration config =
166808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        mWifiConfigManager.getConfiguredNetworkForScanDetail(scanDetail);
166908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isSaved = (config != null) && !config.isEphemeral()
167008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        && !config.isPasspoint();
167108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isSavedPasspoint = passpointProvider != null;
167208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isOpen) {
167308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openSsids.add(matchInfo);
167408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openBssids++;
167508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
167608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isSaved) {
167708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedSsids.add(matchInfo);
167808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedBssids++;
167908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
168008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isOpen || isSaved) {
168108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openOrSavedBssids++;
168208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    // Calculate openOrSavedSsids union later
168308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
168408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isSavedPasspoint) {
168508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderProfiles.add(passpointProvider);
168608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderBssids++;
168708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
168808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
168908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.fullBandAllSingleScanListenerResults++;
169008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementTotalScanSsids(mTotalSsidsInScanHistogram, ssids.size());
169108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementTotalScanResults(mTotalBssidsInScanHistogram, bssids);
169208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableOpenSsidsInScanHistogram, openSsids.size());
169308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableOpenBssidsInScanHistogram, openBssids);
169408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableSavedSsidsInScanHistogram, savedSsids.size());
169508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableSavedBssidsInScanHistogram, savedBssids);
169608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            openSsids.addAll(savedSsids); // openSsids = Union(openSsids, savedSsids)
169708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableOpenOrSavedSsidsInScanHistogram, openSsids.size());
169808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableOpenOrSavedBssidsInScanHistogram, openOrSavedBssids);
169908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableSavedPasspointProviderProfilesInScanHistogram,
170008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderProfiles.size());
170108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableSavedPasspointProviderBssidsInScanHistogram,
170208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderBssids);
17039831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalPasspointAps(mObservedHotspotR1ApInScanHistogram, passpointR1Aps);
17049831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalPasspointAps(mObservedHotspotR2ApInScanHistogram, passpointR2Aps);
17059831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalUniquePasspointEss(mObservedHotspotR1EssInScanHistogram,
17069831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    passpointR1UniqueEss.size());
17079831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalUniquePasspointEss(mObservedHotspotR2EssInScanHistogram,
17089831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    passpointR2UniqueEss.size());
17099831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            for (Integer count : passpointR1UniqueEss.values()) {
17109831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                incrementPasspointPerUniqueEss(mObservedHotspotR1ApsPerEssInScanHistogram, count);
17119831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            }
17129831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            for (Integer count : passpointR2UniqueEss.values()) {
17139831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                incrementPasspointPerUniqueEss(mObservedHotspotR2ApsPerEssInScanHistogram, count);
17149831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            }
1715973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            increment80211mcAps(mObserved80211mcApInScanHistogram, supporting80211mcAps);
171608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        }
171708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
171808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
1719054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    /**
1720054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     * TODO: (b/72443859) Use notifierTag param to separate metrics for OpenNetworkNotifier and
1721054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     * CarrierNetworkNotifier, for this method and all other related metrics.
1722054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     */
1723a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of a "Connect to Network" notification. */
1724054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementConnectToNetworkNotification(String notifierTag, int notificationType) {
1725a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1726a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int count = mConnectToNetworkNotificationCount.get(notificationType);
1727a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationCount.put(notificationType, count + 1);
1728a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1729a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1730a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1731a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of an "Connect to Network" notification user action. */
1732054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementConnectToNetworkNotificationAction(String notifierTag,
1733054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh            int notificationType, int actionType) {
1734a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1735a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int key = notificationType * CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER
1736a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    + actionType;
1737a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int count = mConnectToNetworkNotificationActionCount.get(key);
1738a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationActionCount.put(key, count + 1);
1739a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1740a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1741a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1742a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /**
1743a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * Sets the number of SSIDs blacklisted from recommendation by the open network notification
1744a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * recommender.
1745a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     */
1746054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void setNetworkRecommenderBlacklistSize(String notifierTag, int size) {
1747a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1748a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mOpenNetworkRecommenderBlacklistSize = size;
1749a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1750a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1751a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1752a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Sets if the available network notification feature is enabled. */
1753054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void setIsWifiNetworksAvailableNotificationEnabled(String notifierTag, boolean enabled) {
1754a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1755a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mIsWifiNetworksAvailableNotificationOn = enabled;
1756a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1757a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1758a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1759a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of connection attempts that were initiated unsuccessfully */
1760054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementNumNetworkRecommendationUpdates(String notifierTag) {
1761a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1762a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkRecommendationUpdates++;
1763a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1764a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1765a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1766a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of connection attempts that were initiated unsuccessfully */
1767054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementNumNetworkConnectMessageFailedToSend(String notifierTag) {
1768a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1769a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkConnectMessageFailedToSend++;
1770a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1771a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1772a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
177328a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim    /** Sets if Connected MAC Randomization feature is enabled */
177428a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim    public void setIsMacRandomizationOn(boolean enabled) {
177528a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim        synchronized (mLock) {
177628a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim            mIsMacRandomizationOn = enabled;
177728a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim        }
177828a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim    }
177928a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim
178011638f348ba45f9f417928e79b81186cef76c561Glen Kuhne    public static final String PROTO_DUMP_ARG = "wifiMetricsProto";
17819ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne    public static final String CLEAN_DUMP_ARG = "clean";
17829ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne
17831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
17841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager
17859ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne     * at this time.
17861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
17871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param fd unused
17881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param pw PrintWriter for writing dump to
1789a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass     * @param args [wifiMetricsProto [clean]]
17901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
17911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
17921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
1793a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass            consolidateScoringParams();
1794031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne            if (args != null && args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) {
17959ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                // Dump serialized WifiLog proto
17961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                consolidateProto(true);
17971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
17981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (mCurrentConnectionEvent != event) {
17991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //indicate that automatic bug report has been taken for all valid
18001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //connection events
18011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
18021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
18031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
18041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto);
18051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT);
18069ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                if (args.length > 1 && CLEAN_DUMP_ARG.equals(args[1])) {
18079ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    // Output metrics proto bytes (base64) and nothing else
18089ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.print(metricsProtoDump);
18099ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                } else {
18109ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    // Tag the start and end of the metrics proto bytes
18119ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println("WifiMetrics:");
18129ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println(metricsProtoDump);
18139ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println("EndWifiMetrics");
18149ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                }
18152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                clear();
18161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            } else {
18179ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                pw.println("WifiMetrics:");
18181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mConnectionEvents:");
18191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
18201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    String eventLine = event.toString();
18211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (event == mCurrentConnectionEvent) {
18221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        eventLine += "CURRENTLY OPEN EVENT";
18231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
18241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    pw.println(eventLine);
18251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
18261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks);
18271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks);
18281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworks="
18291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numPersonalNetworks);
18301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworks="
18311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworks);
183259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks);
183359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPasspointNetworks="
183459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPasspointNetworks);
18351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled);
18361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isScanningAlwaysEnabled="
18371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.isScanningAlwaysEnabled);
1838c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByUser="
1839c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByUser);
1840c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByApps="
1841c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByApps);
1842c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNonEmptyScanResults="
1843c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNonEmptyScanResults);
1844c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numEmptyScanResults="
1845c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numEmptyScanResults);
1846424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang                pw.println("mWifiLogProto.numConnecitvityOneshotScans="
1847424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang                        + mWifiLogProto.numConnectivityOneshotScans);
1848c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numOneshotScans="
1849c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numOneshotScans);
1850c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numBackgroundScans="
1851c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numBackgroundScans);
185205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                pw.println("mWifiLogProto.numExternalAppOneshotScanRequests="
185305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                        + mWifiLogProto.numExternalAppOneshotScanRequests);
185405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                pw.println("mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled="
185505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                        + mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled);
185605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                pw.println("mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled="
185705a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius                        + mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled);
1858c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1859c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mScanReturnEntries:");
1860c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_UNKNOWN: " + getScanReturnEntry(
1861c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_UNKNOWN));
1862c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_SUCCESS: " + getScanReturnEntry(
1863c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_SUCCESS));
1864c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry(
1865c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED));
1866c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry(
1867c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION));
1868c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  FAILURE_WIFI_DISABLED: " + getScanReturnEntry(
1869c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED));
1870c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1871c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>");
1872c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN       ON: "
1873c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true));
1874c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED      ON: "
1875c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true));
1876c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED  ON: "
1877c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true));
1878c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED    ON: "
1879c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true));
1880c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN      OFF: "
1881c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false));
1882c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED     OFF: "
1883c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false));
1884c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED OFF: "
1885c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false));
1886c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED   OFF: "
1887c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false));
1888ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood="
1889ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoGood);
1890ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad="
1891ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoBad);
1892ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood="
1893ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundGood);
1894ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad="
1895ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundBad);
18965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggers="
18975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggers);
18985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal="
18995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal);
19005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal="
19015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal);
19025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal="
19035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal);
19045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal="
19055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal);
19065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal="
19075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal);
19085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation="
19095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation);
19105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication="
19115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication);
19125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp="
19135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp);
19145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther="
19155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther);
1916da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogSuccesses="
1917da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogSuccesses);
1918107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                pw.println("mWifiLogProto.recordDurationSec="
1919107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                        + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec));
192004012eb3e692202b25095f7afc1eda40b63e3e0fxshu
192104012eb3e692202b25095f7afc1eda40b63e3e0fxshu                try {
192204012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    JSONObject rssiMap = new JSONObject();
192304012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    for (Map.Entry<Integer, SparseIntArray> entry : mRssiPollCountsMap.entrySet()) {
192404012eb3e692202b25095f7afc1eda40b63e3e0fxshu                        int frequency = entry.getKey();
192504012eb3e692202b25095f7afc1eda40b63e3e0fxshu                        final SparseIntArray histogram = entry.getValue();
192604012eb3e692202b25095f7afc1eda40b63e3e0fxshu                        JSONArray histogramElements = new JSONArray();
192704012eb3e692202b25095f7afc1eda40b63e3e0fxshu                        for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) {
192804012eb3e692202b25095f7afc1eda40b63e3e0fxshu                            int count = histogram.get(i);
192904012eb3e692202b25095f7afc1eda40b63e3e0fxshu                            if (count == 0) {
193004012eb3e692202b25095f7afc1eda40b63e3e0fxshu                                continue;
193104012eb3e692202b25095f7afc1eda40b63e3e0fxshu                            }
193204012eb3e692202b25095f7afc1eda40b63e3e0fxshu                            JSONObject histogramElement = new JSONObject();
193304012eb3e692202b25095f7afc1eda40b63e3e0fxshu                            histogramElement.put(Integer.toString(i), count);
193404012eb3e692202b25095f7afc1eda40b63e3e0fxshu                            histogramElements.put(histogramElement);
193504012eb3e692202b25095f7afc1eda40b63e3e0fxshu                        }
193604012eb3e692202b25095f7afc1eda40b63e3e0fxshu                        rssiMap.put(Integer.toString(frequency), histogramElements);
193704012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    }
193804012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    pw.println("mWifiLogProto.rssiPollCount: " + rssiMap.toString());
193904012eb3e692202b25095f7afc1eda40b63e3e0fxshu                } catch (JSONException e) {
194004012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    pw.println("JSONException occurred: " + e.getMessage());
19417a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                }
194204012eb3e692202b25095f7afc1eda40b63e3e0fxshu
19435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                pw.println("mWifiLogProto.rssiPollDeltaCount: Printing counts for ["
19445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                        + MIN_RSSI_DELTA + ", " + MAX_RSSI_DELTA + "]");
194504012eb3e692202b25095f7afc1eda40b63e3e0fxshu                StringBuilder sb = new StringBuilder();
19465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                for (int i = MIN_RSSI_DELTA; i <= MAX_RSSI_DELTA; i++) {
19475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    sb.append(mRssiDeltaCounts.get(i) + " ");
19485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
19495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                pw.println("  " + sb.toString());
1950f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                pw.print("mWifiLogProto.alertReasonCounts=");
1951f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                sb.setLength(0);
1952f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN;
1953f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) {
1954f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    int count = mWifiAlertReasonCounts.get(i);
1955f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    if (count > 0) {
1956f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        sb.append("(" + i + "," + count + "),");
1957f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    }
1958f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
1959f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                if (sb.length() > 1) {
1960f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    sb.setLength(sb.length() - 1);  // strip trailing comma
1961f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println(sb.toString());
1962f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                } else {
1963f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println("()");
1964f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
196559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numTotalScanResults="
196659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numTotalScanResults);
196759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworkScanResults="
196859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numOpenNetworkScanResults);
196959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworkScanResults="
197059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPersonalNetworkScanResults);
197159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworkScanResults="
197259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworkScanResults);
197359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworkScanResults="
197459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHiddenNetworkScanResults);
197559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults="
197659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R1NetworkScanResults);
197759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults="
197859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R2NetworkScanResults);
197959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans);
19804569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                pw.println("mWifiLogProto.WifiScoreCount: [" + MIN_WIFI_SCORE + ", "
19814569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                        + MAX_WIFI_SCORE + "]");
19824569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                for (int i = 0; i <= MAX_WIFI_SCORE; i++) {
19834569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                    pw.print(mWifiScoreCounts.get(i) + " ");
19844569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                }
198544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println(); // add a line after wifi scores
198644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("mWifiLogProto.SoftApManagerReturnCodeCounts:");
198744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  SUCCESS: " + mSoftApManagerReturnCodeCounts.get(
198844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY));
198944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  FAILED_GENERAL_ERROR: " + mSoftApManagerReturnCodeCounts.get(
199044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR));
199144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  FAILED_NO_CHANNEL: " + mSoftApManagerReturnCodeCounts.get(
199244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL));
19934569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                pw.print("\n");
1994bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numHalCrashes="
1995bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numHalCrashes);
1996bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numWificondCrashes="
1997bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numWificondCrashes);
199865a9143d6c93624837da3867f1cadf2daab62236Roshan Pius                pw.println("mWifiLogProto.numSupplicantCrashes="
199965a9143d6c93624837da3867f1cadf2daab62236Roshan Pius                        + mWifiLogProto.numSupplicantCrashes);
200065a9143d6c93624837da3867f1cadf2daab62236Roshan Pius                pw.println("mWifiLogProto.numHostapdCrashes="
200165a9143d6c93624837da3867f1cadf2daab62236Roshan Pius                        + mWifiLogProto.numHostapdCrashes);
20025ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToHal="
20035ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupClientInterfaceFailureDueToHal);
20045ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToWificond="
20055ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupClientInterfaceFailureDueToWificond);
20065ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant="
20075ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant);
20085ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal="
20095ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal);
20105ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond="
20115ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond);
20125ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd="
20135ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius                        + mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd);
201446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                pw.println("StaEventList:");
2015d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                for (StaEventWithTime event : mStaEventList) {
2016d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                    pw.println(event);
201746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
2018910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen
201926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviders="
202026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviders);
202126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderInstallation="
202226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderInstallation);
202326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderInstallSuccess="
202426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderInstallSuccess);
202526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderUninstallation="
202626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderUninstallation);
202726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderUninstallSuccess="
202826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderUninstallSuccess);
202926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProvidersSuccessfullyConnected="
203026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProvidersSuccessfullyConnected);
20315d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius                pw.println("mWifiLogProto.numRadioModeChangeToMcc="
20325d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius                        + mWifiLogProto.numRadioModeChangeToMcc);
20335d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius                pw.println("mWifiLogProto.numRadioModeChangeToScc="
20345d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius                        + mWifiLogProto.numRadioModeChangeToScc);
20355d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius                pw.println("mWifiLogProto.numRadioModeChangeToSbs="
20365d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius                        + mWifiLogProto.numRadioModeChangeToSbs);
20375d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius                pw.println("mWifiLogProto.numRadioModeChangeToDbs="
20385d540c3dbe22ebd666e5f712a28327d3c7f34a49Roshan Pius                        + mWifiLogProto.numRadioModeChangeToDbs);
2039b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius                pw.println("mWifiLogProto.numSoftApUserBandPreferenceUnsatisfied="
2040b4846aff56ffd388ff02400a144da80ff73b87bdRoshan Pius                        + mWifiLogProto.numSoftApUserBandPreferenceUnsatisfied);
204108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mTotalSsidsInScanHistogram:"
204208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mTotalSsidsInScanHistogram.toString());
204308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mTotalBssidsInScanHistogram:"
204408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mTotalBssidsInScanHistogram.toString());
204508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenSsidsInScanHistogram:"
204608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenSsidsInScanHistogram.toString());
204708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenBssidsInScanHistogram:"
204808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenBssidsInScanHistogram.toString());
204908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedSsidsInScanHistogram:"
205008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedSsidsInScanHistogram.toString());
205108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedBssidsInScanHistogram:"
205208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedBssidsInScanHistogram.toString());
205308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenOrSavedSsidsInScanHistogram:"
205408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenOrSavedSsidsInScanHistogram.toString());
205508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenOrSavedBssidsInScanHistogram:"
205608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenOrSavedBssidsInScanHistogram.toString());
205708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedPasspointProviderProfilesInScanHistogram:"
205808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedPasspointProviderProfilesInScanHistogram.toString());
205908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedPasspointProviderBssidsInScanHistogram:"
206008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedPasspointProviderBssidsInScanHistogram.toString());
206108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mWifiLogProto.partialAllSingleScanListenerResults="
206208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mWifiLogProto.partialAllSingleScanListenerResults);
206308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mWifiLogProto.fullBandAllSingleScanListenerResults="
206408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mWifiLogProto.fullBandAllSingleScanListenerResults);
2065910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen                pw.println("mWifiAwareMetrics:");
2066910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen                mWifiAwareMetrics.dump(fd, pw, args);
206702e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen                pw.println("mRttMetrics:");
206802e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen                mRttMetrics.dump(fd, pw, args);
2069a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
2070a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanAttempts="
2071a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanAttempts);
2072a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanFailed="
2073a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanFailed);
2074a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanStartedOverOffload="
2075a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanStartedOverOffload);
2076a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanFailedOverOffload="
2077a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanFailedOverOffload);
2078a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoFoundNetworkEvents="
2079a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoFoundNetworkEvents);
2080a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2081a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.connectToNetworkNotificationCount="
2082a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mConnectToNetworkNotificationCount.toString());
2083a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.connectToNetworkNotificationActionCount="
2084a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mConnectToNetworkNotificationActionCount.toString());
2085a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.openNetworkRecommenderBlacklistSize="
2086a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mOpenNetworkRecommenderBlacklistSize);
2087a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.isWifiNetworksAvailableNotificationOn="
2088a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mIsWifiNetworksAvailableNotificationOn);
2089a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.numOpenNetworkRecommendationUpdates="
2090a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mNumOpenNetworkRecommendationUpdates);
2091a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.numOpenNetworkConnectMessageFailedToSend="
2092a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mNumOpenNetworkConnectMessageFailedToSend);
20939831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
20949831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1ApInScanHistogram="
20959831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1ApInScanHistogram);
20969831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2ApInScanHistogram="
20979831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2ApInScanHistogram);
20989831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1EssInScanHistogram="
20999831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1EssInScanHistogram);
21009831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2EssInScanHistogram="
21019831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2EssInScanHistogram);
21029831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram="
21039831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1ApsPerEssInScanHistogram);
21049831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram="
21059831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2ApsPerEssInScanHistogram);
210605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
2107973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                pw.println("mWifiLogProto.observed80211mcSupportingApsInScanHistogram"
2108973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                        + mObserved80211mcApInScanHistogram);
2109973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
211005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                pw.println("mSoftApTetheredEvents:");
211105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                for (SoftApConnectedClientsEvent event : mSoftApEventListTethered) {
211205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    StringBuilder eventLine = new StringBuilder();
211305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append("event_type=" + event.eventType);
211405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",time_stamp_millis=" + event.timeStampMillis);
211505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",num_connected_clients=" + event.numConnectedClients);
21164de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_frequency=" + event.channelFrequency);
21174de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_bandwidth=" + event.channelBandwidth);
211805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    pw.println(eventLine.toString());
211905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                }
212005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                pw.println("mSoftApLocalOnlyEvents:");
212105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                for (SoftApConnectedClientsEvent event : mSoftApEventListLocalOnly) {
212205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    StringBuilder eventLine = new StringBuilder();
212305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append("event_type=" + event.eventType);
212405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",time_stamp_millis=" + event.timeStampMillis);
212505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",num_connected_clients=" + event.numConnectedClients);
21264de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_frequency=" + event.channelFrequency);
21274de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_bandwidth=" + event.channelBandwidth);
212805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    pw.println(eventLine.toString());
212905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                }
213062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
213162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsAttempts="
213262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsAttempts);
213362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsSuccess="
213462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsSuccess);
213562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsStartFailure="
213662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsStartFailure);
213762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsOverlapFailure="
213862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsOverlapFailure);
213962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsTimeoutFailure="
214062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsTimeoutFailure);
214162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsOtherConnectionFailure="
214262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsOtherConnectionFailure);
214362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsSupplicantFailure="
214462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsSupplicantFailure);
214562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsCancellation="
214662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsCancellation);
2147fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray
2148fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray                mWifiPowerMetrics.dump(pw);
214912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                mWifiWakeMetrics.dump(pw);
215028a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim
215128a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim                pw.println("mWifiLogProto.isMacRandomizationOn=" + mIsMacRandomizationOn);
2152a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass                pw.println("mWifiLogProto.scoreExperimentId=" + mWifiLogProto.scoreExperimentId);
21531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
21541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
21551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
21561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
21573c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    /**
21583c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     * Update various counts of saved network types
21593c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     * @param networks List of WifiConfigurations representing all saved networks, must not be null
21603c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     */
21613c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    public void updateSavedNetworks(List<WifiConfiguration> networks) {
21623c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne        synchronized (mLock) {
21633c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numSavedNetworks = networks.size();
21643c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numOpenNetworks = 0;
21653c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numPersonalNetworks = 0;
21663c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numEnterpriseNetworks = 0;
21673c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numNetworksAddedByUser = 0;
21683c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numNetworksAddedByApps = 0;
21693c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numHiddenNetworks = 0;
21703c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numPasspointNetworks = 0;
21713c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            for (WifiConfiguration config : networks) {
21723c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
21733c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numOpenNetworks++;
21743c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else if (config.isEnterprise()) {
21753c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numEnterpriseNetworks++;
21763c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else {
21773c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numPersonalNetworks++;
21783c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
21793c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.selfAdded) {
21803c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numNetworksAddedByUser++;
21813c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else {
21823c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numNetworksAddedByApps++;
21833c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
21843c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.hiddenSSID) {
21853c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numHiddenNetworks++;
21863c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
21873c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.isPasspoint()) {
21883c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numPasspointNetworks++;
21893c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
21903c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            }
21913c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne        }
21923c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    }
21933c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne
21941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
219549357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * Update metrics for saved Passpoint profiles.
219626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     *
219726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * @param numSavedProfiles The number of saved Passpoint profiles
219849357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * @param numConnectedProfiles The number of saved Passpoint profiles that have ever resulted
219949357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     *                             in a successful network connection
220026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
220149357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu    public void updateSavedPasspointProfiles(int numSavedProfiles, int numConnectedProfiles) {
220226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
220326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviders = numSavedProfiles;
220449357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu            mWifiLogProto.numPasspointProvidersSuccessfullyConnected = numConnectedProfiles;
220526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
220626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
220726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
220826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
2209c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their
2210c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * respective lists within mWifiLogProto
22111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
22121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param incremental Only include ConnectionEvents created since last automatic bug report
22131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
22141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private void consolidateProto(boolean incremental) {
22151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>();
22167a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>();
22175cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        List<WifiMetricsProto.RssiPollCount> rssiDeltas = new ArrayList<>();
2218f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>();
22194569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        List<WifiMetricsProto.WifiScoreCount> scores = new ArrayList<>();
22201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
22211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            for (ConnectionEvent event : mConnectionEventList) {
2222c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // If this is not incremental, dump full ConnectionEvent list
2223c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // Else Dump all un-dumped events except for the current one
22241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                if (!incremental || ((mCurrentConnectionEvent != event)
22251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        && !event.mConnectionEvent.automaticBugReportTaken)) {
22261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //Get all ConnectionEvents that haven not been dumped as a proto, also exclude
22271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //the current active un-ended connection event
22281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    events.add(event.mConnectionEvent);
2229c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    if (incremental) {
2230c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
2231c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    }
22321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
22331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
22341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            if (events.size() > 0) {
22351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent);
22361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
2237c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
2238c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list
2239c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.scanReturnEntries =
2240c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()];
2241c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mScanReturnEntries.size(); i++) {
2242c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry();
2243c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i);
2244c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i);
2245c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
2246c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
2247c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list
2248c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // This one is slightly more complex, as the Sparse are indexed with:
2249c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //     key: wifiState * 2 + isScreenOn, value: wifiStateCount
2250c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.wifiSystemStateEntries =
2251c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog
2252c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    .WifiSystemStateEntry[mWifiSystemStateEntries.size()];
2253c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mWifiSystemStateEntries.size(); i++) {
2254c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i] =
2255c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        new WifiMetricsProto.WifiLog.WifiSystemStateEntry();
2256c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiState =
2257c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.keyAt(i) / 2;
2258c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount =
2259c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.valueAt(i);
2260c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].isScreenOn =
2261c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        (mWifiSystemStateEntries.keyAt(i) % 2) > 0;
2262c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
2263107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000)
2264107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    - mRecordStartTimeSec);
22657a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
22667a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            /**
226704012eb3e692202b25095f7afc1eda40b63e3e0fxshu             * Convert the SparseIntArrays of RSSI poll rssi, counts, and frequency to the
226804012eb3e692202b25095f7afc1eda40b63e3e0fxshu             * proto's repeated ntKeyVal array.
22697a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             */
227004012eb3e692202b25095f7afc1eda40b63e3e0fxshu            for (Map.Entry<Integer, SparseIntArray> entry : mRssiPollCountsMap.entrySet()) {
227104012eb3e692202b25095f7afc1eda40b63e3e0fxshu                int frequency = entry.getKey();
227204012eb3e692202b25095f7afc1eda40b63e3e0fxshu                SparseIntArray histogram = entry.getValue();
227304012eb3e692202b25095f7afc1eda40b63e3e0fxshu                for (int i = 0; i < histogram.size(); i++) {
227404012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
227504012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    keyVal.rssi = histogram.keyAt(i);
227604012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    keyVal.count = histogram.valueAt(i);
227704012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    keyVal.frequency = frequency;
227804012eb3e692202b25095f7afc1eda40b63e3e0fxshu                    rssis.add(keyVal);
227904012eb3e692202b25095f7afc1eda40b63e3e0fxshu                }
22807a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            }
22817a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount);
2282f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
2283f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            /**
22845cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             * Convert the SparseIntArray of RSSI delta rssi's and counts to the proto's repeated
22855cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             * IntKeyVal array.
22865cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             */
22875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            for (int i = 0; i < mRssiDeltaCounts.size(); i++) {
22885cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
22895cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                keyVal.rssi = mRssiDeltaCounts.keyAt(i);
22905cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                keyVal.count = mRssiDeltaCounts.valueAt(i);
22915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                rssiDeltas.add(keyVal);
22925cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
22935cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mWifiLogProto.rssiPollDeltaCount = rssiDeltas.toArray(mWifiLogProto.rssiPollDeltaCount);
22945cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne
229504012eb3e692202b25095f7afc1eda40b63e3e0fxshu
229604012eb3e692202b25095f7afc1eda40b63e3e0fxshu
22975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            /**
2298f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * Convert the SparseIntArray of alert reasons and counts to the proto's repeated
2299f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * IntKeyVal array.
2300f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             */
2301f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) {
2302f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount();
2303f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.reason = mWifiAlertReasonCounts.keyAt(i);
2304f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.count = mWifiAlertReasonCounts.valueAt(i);
2305f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                alertReasons.add(keyVal);
2306f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            }
2307f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount);
23084569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao
23094569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            /**
23104569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            *  Convert the SparseIntArray of Wifi Score and counts to proto's repeated
23114569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            * IntKeyVal array.
23124569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            */
23134569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            for (int score = 0; score < mWifiScoreCounts.size(); score++) {
23144569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                WifiMetricsProto.WifiScoreCount keyVal = new WifiMetricsProto.WifiScoreCount();
23154569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                keyVal.score = mWifiScoreCounts.keyAt(score);
23164569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                keyVal.count = mWifiScoreCounts.valueAt(score);
23174569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                scores.add(keyVal);
23184569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            }
23194569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiLogProto.wifiScoreCount = scores.toArray(mWifiLogProto.wifiScoreCount);
232044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
232144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            /**
232244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             * Convert the SparseIntArray of SoftAp Return codes and counts to proto's repeated
232344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             * IntKeyVal array.
232444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             */
232544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            int codeCounts = mSoftApManagerReturnCodeCounts.size();
232644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            mWifiLogProto.softApReturnCode = new WifiMetricsProto.SoftApReturnCodeCount[codeCounts];
232744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            for (int sapCode = 0; sapCode < codeCounts; sapCode++) {
232844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode] =
232944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        new WifiMetricsProto.SoftApReturnCodeCount();
233044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode].startResult =
233144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        mSoftApManagerReturnCodeCounts.keyAt(sapCode);
233244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode].count =
233344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        mSoftApManagerReturnCodeCounts.valueAt(sapCode);
233444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
2335d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2336d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            /**
2337d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne             * Convert StaEventList to array of StaEvents
2338d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne             */
2339d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            mWifiLogProto.staEventList = new StaEvent[mStaEventList.size()];
2340d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            for (int i = 0; i < mStaEventList.size(); i++) {
2341d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                mWifiLogProto.staEventList[i] = mStaEventList.get(i).staEvent;
2342d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            }
234308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.totalSsidsInScanHistogram =
234408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mTotalSsidsInScanHistogram);
234508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.totalBssidsInScanHistogram =
234608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mTotalBssidsInScanHistogram);
234708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenSsidsInScanHistogram =
234808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableOpenSsidsInScanHistogram);
234908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenBssidsInScanHistogram =
235008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableOpenBssidsInScanHistogram);
235108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedSsidsInScanHistogram =
235208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableSavedSsidsInScanHistogram);
235308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedBssidsInScanHistogram =
235408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableSavedBssidsInScanHistogram);
235508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenOrSavedSsidsInScanHistogram =
235608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
235708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableOpenOrSavedSsidsInScanHistogram);
235808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenOrSavedBssidsInScanHistogram =
235908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
236008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableOpenOrSavedBssidsInScanHistogram);
236108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedPasspointProviderProfilesInScanHistogram =
236208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
236308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableSavedPasspointProviderProfilesInScanHistogram);
236408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedPasspointProviderBssidsInScanHistogram =
236508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
236608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableSavedPasspointProviderBssidsInScanHistogram);
2367910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen            mWifiLogProto.wifiAwareLog = mWifiAwareMetrics.consolidateProto();
236802e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen            mWifiLogProto.wifiRttLog = mRttMetrics.consolidateProto();
2369a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
2370a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mWifiLogProto.pnoScanMetrics = mPnoScanMetrics;
2371a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2372a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            /**
2373a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * Convert the SparseIntArray of "Connect to Network" notification types and counts to
2374a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * proto's repeated IntKeyVal array.
2375a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             */
2376a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            ConnectToNetworkNotificationAndActionCount[] notificationCountArray =
2377a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    new ConnectToNetworkNotificationAndActionCount[
2378a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                            mConnectToNetworkNotificationCount.size()];
2379a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            for (int i = 0; i < mConnectToNetworkNotificationCount.size(); i++) {
2380a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                ConnectToNetworkNotificationAndActionCount keyVal =
2381a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        new ConnectToNetworkNotificationAndActionCount();
2382a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.notification = mConnectToNetworkNotificationCount.keyAt(i);
2383a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.recommender =
2384a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN;
2385a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.count = mConnectToNetworkNotificationCount.valueAt(i);
2386a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                notificationCountArray[i] = keyVal;
2387a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            }
2388a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.connectToNetworkNotificationCount = notificationCountArray;
2389a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2390a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            /**
2391a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * Convert the SparseIntArray of "Connect to Network" notification types and counts to
2392a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * proto's repeated IntKeyVal array.
2393a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             */
2394a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            ConnectToNetworkNotificationAndActionCount[] notificationActionCountArray =
2395a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    new ConnectToNetworkNotificationAndActionCount[
2396a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                            mConnectToNetworkNotificationActionCount.size()];
2397a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            for (int i = 0; i < mConnectToNetworkNotificationActionCount.size(); i++) {
2398a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                ConnectToNetworkNotificationAndActionCount keyVal =
2399a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        new ConnectToNetworkNotificationAndActionCount();
2400a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                int key = mConnectToNetworkNotificationActionCount.keyAt(i);
2401a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.notification = key / CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER;
2402a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.action = key % CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER;
2403a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.recommender =
2404a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN;
2405a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.count = mConnectToNetworkNotificationActionCount.valueAt(i);
2406a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                notificationActionCountArray[i] = keyVal;
2407a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            }
2408a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.connectToNetworkNotificationActionCount = notificationActionCountArray;
2409a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2410a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.openNetworkRecommenderBlacklistSize =
2411a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mOpenNetworkRecommenderBlacklistSize;
2412a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.isWifiNetworksAvailableNotificationOn =
2413a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mIsWifiNetworksAvailableNotificationOn;
2414a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.numOpenNetworkRecommendationUpdates =
2415a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mNumOpenNetworkRecommendationUpdates;
2416a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.numOpenNetworkConnectMessageFailedToSend =
2417a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mNumOpenNetworkConnectMessageFailedToSend;
24189831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
24199831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1ApsInScanHistogram =
24209831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR1ApInScanHistogram);
24219831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2ApsInScanHistogram =
24229831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR2ApInScanHistogram);
24239831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1EssInScanHistogram =
24249831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR1EssInScanHistogram);
24259831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2EssInScanHistogram =
24269831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR2EssInScanHistogram);
24279831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram =
24289831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(
24299831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            mObservedHotspotR1ApsPerEssInScanHistogram);
24309831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram =
24319831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(
24329831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            mObservedHotspotR2ApsPerEssInScanHistogram);
243305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
2434973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            mWifiLogProto.observed80211McSupportingApsInScanHistogram =
2435973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                    makeNumConnectableNetworksBucketArray(mObserved80211mcApInScanHistogram);
2436973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
243705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (mSoftApEventListTethered.size() > 0) {
243805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                mWifiLogProto.softApConnectedClientsEventsTethered =
243905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mSoftApEventListTethered.toArray(
244005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mWifiLogProto.softApConnectedClientsEventsTethered);
244105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
244205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (mSoftApEventListLocalOnly.size() > 0) {
244305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                mWifiLogProto.softApConnectedClientsEventsLocalOnly =
244405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mSoftApEventListLocalOnly.toArray(
244505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mWifiLogProto.softApConnectedClientsEventsLocalOnly);
244605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
244762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
244862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWifiLogProto.wpsMetrics = mWpsMetrics;
2449fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray            mWifiLogProto.wifiPowerStats = mWifiPowerMetrics.buildProto();
245012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach            mWifiLogProto.wifiWakeStats = mWifiWakeMetrics.buildProto();
245128a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim            mWifiLogProto.isMacRandomizationOn = mIsMacRandomizationOn;
2452ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        }
24531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
24542532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
2455a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass    /** Sets the scoring experiment id to current value */
2456a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass    private void consolidateScoringParams() {
2457a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass        synchronized (mLock) {
2458a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass            if (mScoringParams != null) {
2459a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass                int experimentIdentifier = mScoringParams.getExperimentIdentifier();
2460a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass                if (experimentIdentifier == 0) {
2461a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass                    mWifiLogProto.scoreExperimentId = "";
2462a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass                } else {
2463a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass                    mWifiLogProto.scoreExperimentId = "x" + experimentIdentifier;
2464a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass                }
2465a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass            }
2466a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass        }
2467a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass    }
2468a332e6d65efbee41e08b86d56394db4431ca6e86Michael Plass
246908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiMetricsProto.NumConnectableNetworksBucket[] makeNumConnectableNetworksBucketArray(
247008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            SparseIntArray sia) {
247108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        WifiMetricsProto.NumConnectableNetworksBucket[] array =
247208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                new WifiMetricsProto.NumConnectableNetworksBucket[sia.size()];
247308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        for (int i = 0; i < sia.size(); i++) {
247408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            WifiMetricsProto.NumConnectableNetworksBucket keyVal =
247508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    new WifiMetricsProto.NumConnectableNetworksBucket();
247608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            keyVal.numConnectableNetworks = sia.keyAt(i);
247708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            keyVal.count = sia.valueAt(i);
247808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            array[i] = keyVal;
247908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        }
248008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        return array;
248108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
248208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
24832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
2484a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * Clear all WifiMetrics, except for currentConnectionEvent and Open Network Notification
2485a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * feature enabled state, blacklist size.
24862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
24872532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private void clear() {
24882532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        synchronized (mLock) {
24892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEventList.clear();
24902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
24912532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mConnectionEventList.add(mCurrentConnectionEvent);
24922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
24932532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mScanReturnEntries.clear();
24942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiSystemStateEntries.clear();
2495107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
249604012eb3e692202b25095f7afc1eda40b63e3e0fxshu            mRssiPollCountsMap.clear();
24975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mRssiDeltaCounts.clear();
2498f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.clear();
24994569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiScoreCounts.clear();
25002532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiLogProto.clear();
25015cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
250244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            mSoftApManagerReturnCodeCounts.clear();
250346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            mStaEventList.clear();
2504910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen            mWifiAwareMetrics.clear();
250502e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen            mRttMetrics.clear();
250608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mTotalSsidsInScanHistogram.clear();
250708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mTotalBssidsInScanHistogram.clear();
250808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenSsidsInScanHistogram.clear();
250908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenBssidsInScanHistogram.clear();
251008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedSsidsInScanHistogram.clear();
251108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedBssidsInScanHistogram.clear();
251208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenOrSavedSsidsInScanHistogram.clear();
251308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenOrSavedBssidsInScanHistogram.clear();
251408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedPasspointProviderProfilesInScanHistogram.clear();
251508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedPasspointProviderBssidsInScanHistogram.clear();
2516a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.clear();
2517a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationCount.clear();
2518a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationActionCount.clear();
2519a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkRecommendationUpdates = 0;
2520a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkConnectMessageFailedToSend = 0;
25219831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1ApInScanHistogram.clear();
25229831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2ApInScanHistogram.clear();
25239831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1EssInScanHistogram.clear();
25249831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2EssInScanHistogram.clear();
25259831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1ApsPerEssInScanHistogram.clear();
25269831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2ApsPerEssInScanHistogram.clear();
252705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            mSoftApEventListTethered.clear();
252805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            mSoftApEventListLocalOnly.clear();
252962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.clear();
253012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach            mWifiWakeMetrics.clear();
2531973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            mObserved80211mcApInScanHistogram.clear();
25322532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
25332532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
2534ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
2535ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
2536ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set screen state (On/Off)
2537ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
2538ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setScreenState(boolean screenOn) {
2539ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
2540ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = screenOn;
2541ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
2542ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
2543ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
2544ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
2545ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED)
2546ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
2547ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setWifiState(int wifiState) {
2548ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
2549ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = wifiState;
2550e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            mWifiWins = (wifiState == WifiMetricsProto.WifiLog.WIFI_ASSOCIATED);
2551ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
2552ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
255346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
255446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
255546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Message handler for interesting WifiMonitor messages. Generates StaEvents
255646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
255746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private void processMessage(Message msg) {
255846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StaEvent event = new StaEvent();
255946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        boolean logEvent = true;
256046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (msg.what) {
256146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.ASSOCIATION_REJECTION_EVENT:
256246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT;
256346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.associationTimedOut = msg.arg1 > 0 ? true : false;
256446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.status = msg.arg2;
256546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
256646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.AUTHENTICATION_FAILURE_EVENT:
256746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT;
2568b6a730ce63a9a864adaea6ba1bee827444be52a5Ahmed ElArabawy                switch (msg.arg1) {
256946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_NONE:
257046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_NONE;
257146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
257246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_TIMEOUT:
257346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_TIMEOUT;
257446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
257546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD:
257646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_WRONG_PSWD;
257746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
257846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE:
257946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_EAP_FAILURE;
258046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
258146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    default:
258246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
258346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
258446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
258546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.NETWORK_CONNECTION_EVENT:
258646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_NETWORK_CONNECTION_EVENT;
258746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
258846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.NETWORK_DISCONNECTION_EVENT:
258946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT;
259046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.reason = msg.arg2;
259146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.localGen = msg.arg1 == 0 ? false : true;
259246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
259346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT:
259446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                logEvent = false;
259546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                StateChangeResult stateChangeResult = (StateChangeResult) msg.obj;
259646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                mSupplicantStateChangeBitmask |= supplicantStateToBit(stateChangeResult.state);
259746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
259846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiStateMachine.CMD_ASSOCIATED_BSSID:
259946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_CMD_ASSOCIATED_BSSID;
260046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
260146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiStateMachine.CMD_TARGET_BSSID:
260246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_CMD_TARGET_BSSID;
260346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
260446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
260546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return;
260646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
260746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (logEvent) {
260846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            addStaEvent(event);
260946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
261046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
261146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
261246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
261346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
261446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
261546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
261646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type) {
261746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, null);
261846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
261946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
262046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
262146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
262246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
262346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param config WifiConfiguration for a framework initiated connection attempt
262446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
262546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, WifiConfiguration config) {
262646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, config);
262746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
262846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
262946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
263046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
263146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
263246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework
263346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     *                                  initiated a FRAMEWORK_DISCONNECT
263446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
263546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, int frameworkDisconnectReason) {
263646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, frameworkDisconnectReason, null);
263746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
263846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
263946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
264046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
264146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
264246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework
264346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     *                                  initiated a FRAMEWORK_DISCONNECT
264446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param config WifiConfiguration for a framework initiated connection attempt
264546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
264646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, int frameworkDisconnectReason, WifiConfiguration config) {
264746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (type) {
264846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL:
264946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST:
265046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST:
265146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_CONNECT:
265246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_ROAM:
265346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CONNECT_NETWORK:
265446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK:
265546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_FRAMEWORK_DISCONNECT:
2656e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            case StaEvent.TYPE_SCORE_BREACH:
265728a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim            case StaEvent.TYPE_MAC_CHANGE:
265846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
265946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
266046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                Log.e(TAG, "Unknown StaEvent:" + type);
266146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return;
266246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
266346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StaEvent event = new StaEvent();
266446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        event.type = type;
266546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (frameworkDisconnectReason != StaEvent.DISCONNECT_UNKNOWN) {
266646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            event.frameworkDisconnectReason = frameworkDisconnectReason;
266746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
266846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        event.configInfo = createConfigInfo(config);
266946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        addStaEvent(event);
267046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
267146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
267246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private void addStaEvent(StaEvent staEvent) {
267346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.startTimeMillis = mClock.getElapsedSinceBootMillis();
267446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastRssi = mLastPollRssi;
267546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastFreq = mLastPollFreq;
267646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastLinkSpeed = mLastPollLinkSpeed;
267746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.supplicantStateChangesBitmask = mSupplicantStateChangeBitmask;
2678e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        staEvent.lastScore = mLastScore;
267946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mSupplicantStateChangeBitmask = 0;
268046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollRssi = -127;
268146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollFreq = -1;
268246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollLinkSpeed = -1;
2683e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        mLastScore = -1;
2684d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        mStaEventList.add(new StaEventWithTime(staEvent, mClock.getWallClockMillis()));
268546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        // Prune StaEventList if it gets too long
268646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (mStaEventList.size() > MAX_STA_EVENTS) mStaEventList.remove();
268746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
268846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
268946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private ConfigInfo createConfigInfo(WifiConfiguration config) {
269046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (config == null) return null;
269146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        ConfigInfo info = new ConfigInfo();
269246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedKeyManagement = bitSetToInt(config.allowedKeyManagement);
269346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedProtocols = bitSetToInt(config.allowedProtocols);
269446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedAuthAlgorithms = bitSetToInt(config.allowedAuthAlgorithms);
269546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedPairwiseCiphers = bitSetToInt(config.allowedPairwiseCiphers);
269646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedGroupCiphers = bitSetToInt(config.allowedGroupCiphers);
269746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.hiddenSsid = config.hiddenSSID;
269846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.isPasspoint = config.isPasspoint();
269946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.isEphemeral = config.isEphemeral();
270046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.hasEverConnected = config.getNetworkSelectionStatus().getHasEverConnected();
270146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
270246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (candidate != null) {
270346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            info.scanRssi = candidate.level;
270446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            info.scanFreq = candidate.frequency;
270546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
270646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return info;
270746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
270846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
270946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public Handler getHandler() {
271046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return mHandler;
271146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
271246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
2713910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    public WifiAwareMetrics getWifiAwareMetrics() {
2714910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen        return mWifiAwareMetrics;
2715910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    }
2716910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen
271712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    public WifiWakeMetrics getWakeupMetrics() {
271812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        return mWifiWakeMetrics;
271912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    }
272012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
272102e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen    public RttMetrics getRttMetrics() {
272202e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen        return mRttMetrics;
272302e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen    }
272402e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen
272546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    // Rather than generate a StaEvent for each SUPPLICANT_STATE_CHANGE, cache these in a bitmask
272646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    // and attach it to the next event which is generated.
272746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mSupplicantStateChangeBitmask = 0;
272846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
272946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
273046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Converts a SupplicantState value to a single bit, with position defined by
273146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * {@code StaEvent.SupplicantState}
273246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
273346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static int supplicantStateToBit(SupplicantState state) {
273446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch(state) {
273546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case DISCONNECTED:
273646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_DISCONNECTED;
273746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INTERFACE_DISABLED:
273846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INTERFACE_DISABLED;
273946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INACTIVE:
274046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INACTIVE;
274146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case SCANNING:
274246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_SCANNING;
274346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case AUTHENTICATING:
274446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_AUTHENTICATING;
274546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case ASSOCIATING:
274646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_ASSOCIATING;
274746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case ASSOCIATED:
274846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_ASSOCIATED;
274946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case FOUR_WAY_HANDSHAKE:
275046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE;
275146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case GROUP_HANDSHAKE:
275246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_GROUP_HANDSHAKE;
275346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case COMPLETED:
275446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_COMPLETED;
275546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case DORMANT:
275646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_DORMANT;
275746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case UNINITIALIZED:
275846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_UNINITIALIZED;
275946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INVALID:
276046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INVALID;
276146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
276246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                Log.wtf(TAG, "Got unknown supplicant state: " + state.ordinal());
276346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 0;
276446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
276546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
276646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
276746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String supplicantStateChangesBitmaskToString(int mask) {
276846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
2769d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        sb.append("supplicantStateChangeEvents: {");
277046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_DISCONNECTED)) > 0) sb.append(" DISCONNECTED");
277146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INTERFACE_DISABLED)) > 0) sb.append(" INTERFACE_DISABLED");
277246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INACTIVE)) > 0) sb.append(" INACTIVE");
277346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_SCANNING)) > 0) sb.append(" SCANNING");
277446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_AUTHENTICATING)) > 0) sb.append(" AUTHENTICATING");
277546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_ASSOCIATING)) > 0) sb.append(" ASSOCIATING");
277646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_ASSOCIATED)) > 0) sb.append(" ASSOCIATED");
277746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE)) > 0) sb.append(" FOUR_WAY_HANDSHAKE");
277846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_GROUP_HANDSHAKE)) > 0) sb.append(" GROUP_HANDSHAKE");
277946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_COMPLETED)) > 0) sb.append(" COMPLETED");
278046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_DORMANT)) > 0) sb.append(" DORMANT");
278146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_UNINITIALIZED)) > 0) sb.append(" UNINITIALIZED");
278246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INVALID)) > 0) sb.append(" INVALID");
278346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        sb.append("}");
278446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
278546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
278646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
278746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
278846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Returns a human readable string from a Sta Event. Only adds information relevant to the event
278946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * type.
279046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
279146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static String staEventToString(StaEvent event) {
279246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event == null) return "<NULL>";
279346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
279446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (event.type) {
279546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT:
2796d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("ASSOCIATION_REJECTION_EVENT")
279746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" timedOut=").append(event.associationTimedOut)
279846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" status=").append(event.status).append(":")
279946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(ISupplicantStaIfaceCallback.StatusCode.toString(event.status));
280046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
280146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT:
2802d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("AUTHENTICATION_FAILURE_EVENT reason=").append(event.authFailureReason)
280346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(":").append(authFailureReasonToString(event.authFailureReason));
280446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
280546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_CONNECTION_EVENT:
2806d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_CONNECTION_EVENT");
280746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
280846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT:
2809d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_DISCONNECTION_EVENT")
281046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" local_gen=").append(event.localGen)
281146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" reason=").append(event.reason).append(":")
281246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(ISupplicantStaIfaceCallback.ReasonCode.toString(
281346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                                (event.reason >= 0 ? event.reason : -1 * event.reason)));
281446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
281546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_ASSOCIATED_BSSID:
2816d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_ASSOCIATED_BSSID");
281746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
281846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL:
2819d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_CONFIGURATION_SUCCESSFUL");
282046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
282146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST:
2822d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_CONFIGURATION_LOST");
282346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
282446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST:
2825d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_REACHABILITY_LOST");
282646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
282746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_TARGET_BSSID:
2828d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_TARGET_BSSID");
282946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
283046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_CONNECT:
2831d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_START_CONNECT");
283246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
283346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_ROAM:
2834d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_START_ROAM");
283546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
283646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CONNECT_NETWORK:
2837d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CONNECT_NETWORK");
283846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
283946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK:
2840d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_AGENT_VALID_NETWORK");
284146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
284246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_FRAMEWORK_DISCONNECT:
2843d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("FRAMEWORK_DISCONNECT")
284446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" reason=")
284546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(frameworkDisconnectReasonToString(event.frameworkDisconnectReason));
284646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
2847e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            case StaEvent.TYPE_SCORE_BREACH:
2848e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                sb.append("SCORE_BREACH");
2849e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                break;
285028a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim            case StaEvent.TYPE_MAC_CHANGE:
285128a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim                sb.append("MAC_CHANGE");
285228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim                break;
285346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
285446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                sb.append("UNKNOWN " + event.type + ":");
285546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
285646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
285746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastRssi != -127) sb.append(" lastRssi=").append(event.lastRssi);
285846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastFreq != -1) sb.append(" lastFreq=").append(event.lastFreq);
285946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastLinkSpeed != -1) sb.append(" lastLinkSpeed=").append(event.lastLinkSpeed);
2860e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        if (event.lastScore != -1) sb.append(" lastScore=").append(event.lastScore);
286146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.supplicantStateChangesBitmask != 0) {
2862d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(", ").append(supplicantStateChangesBitmaskToString(
286346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    event.supplicantStateChangesBitmask));
286446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
286546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.configInfo != null) {
2866d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(", ").append(configInfoToString(event.configInfo));
286746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
286846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
286946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
287046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
287146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
287246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String authFailureReasonToString(int authFailureReason) {
287346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (authFailureReason) {
287446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_NONE:
287546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_NONE";
287646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_TIMEOUT:
287746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_TIMEOUT";
287846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_WRONG_PSWD:
287946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_WRONG_PSWD";
288046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_EAP_FAILURE:
288146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_EAP_FAILURE";
288246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
288346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "";
288446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
288546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
288646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
288746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String frameworkDisconnectReasonToString(int frameworkDisconnectReason) {
288846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (frameworkDisconnectReason) {
288946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_API:
289046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_API";
289146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_GENERIC:
289246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_GENERIC";
289346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_UNWANTED:
289446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_UNWANTED";
289546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_ROAM_WATCHDOG_TIMER:
289646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_ROAM_WATCHDOG_TIMER";
289746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST:
289846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST";
289946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_RESET_SIM_NETWORKS:
290046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_RESET_SIM_NETWORKS";
290146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
290246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_UNKNOWN=" + frameworkDisconnectReason;
290346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
290446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
290546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
290646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String configInfoToString(ConfigInfo info) {
290746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
290846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        sb.append("ConfigInfo:")
290946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_key_management=").append(info.allowedKeyManagement)
291046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_protocols=").append(info.allowedProtocols)
291146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_auth_algorithms=").append(info.allowedAuthAlgorithms)
291246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_pairwise_ciphers=").append(info.allowedPairwiseCiphers)
291346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_group_ciphers=").append(info.allowedGroupCiphers)
291446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" hidden_ssid=").append(info.hiddenSsid)
291546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" is_passpoint=").append(info.isPasspoint)
291646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" is_ephemeral=").append(info.isEphemeral)
291746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" has_ever_connected=").append(info.hasEverConnected)
291846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" scan_rssi=").append(info.scanRssi)
291946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" scan_freq=").append(info.scanFreq);
292046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
292146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
292246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
2923e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    public static final int MAX_STA_EVENTS = 768;
2924d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    private LinkedList<StaEventWithTime> mStaEventList = new LinkedList<StaEventWithTime>();
292546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollRssi = -127;
292646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollLinkSpeed = -1;
292746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollFreq = -1;
2928e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    private int mLastScore = -1;
292946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
293046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
293146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Converts the first 31 bits of a BitSet to a little endian int
293246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
293346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static int bitSetToInt(BitSet bits) {
293446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        int value = 0;
293546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        int nBits = bits.length() < 31 ? bits.length() : 31;
293646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        for (int i = 0; i < nBits; i++) {
293746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            value += bits.get(i) ? (1 << i) : 0;
293846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
293946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return value;
294046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
294108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementSsid(SparseIntArray sia, int element) {
294208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_CONNECTABLE_SSID_NETWORK_BUCKET));
294308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
294408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementBssid(SparseIntArray sia, int element) {
294508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_CONNECTABLE_BSSID_NETWORK_BUCKET));
294608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
294708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementTotalScanResults(SparseIntArray sia, int element) {
294808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULTS_BUCKET));
294908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
295008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementTotalScanSsids(SparseIntArray sia, int element) {
295108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET));
295208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
29539831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementTotalPasspointAps(SparseIntArray sia, int element) {
29549831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_APS_BUCKET));
29559831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
29569831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementTotalUniquePasspointEss(SparseIntArray sia, int element) {
29579831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET));
29589831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
29599831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementPasspointPerUniqueEss(SparseIntArray sia, int element) {
29609831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET));
29619831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
2962973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    private void increment80211mcAps(SparseIntArray sia, int element) {
2963973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_80211MC_APS_BUCKET));
2964973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    }
296508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void increment(SparseIntArray sia, int element) {
296608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        int count = sia.get(element);
296708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        sia.put(element, count + 1);
296808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
2969d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2970d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    private static class StaEventWithTime {
2971d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public StaEvent staEvent;
2972d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public long wallClockMillis;
2973d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2974d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        StaEventWithTime(StaEvent event, long wallClockMillis) {
2975d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            staEvent = event;
2976d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            this.wallClockMillis = wallClockMillis;
2977d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        }
2978d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2979d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public String toString() {
2980d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            StringBuilder sb = new StringBuilder();
2981d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            Calendar c = Calendar.getInstance();
2982d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            c.setTimeInMillis(wallClockMillis);
2983d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            if (wallClockMillis != 0) {
2984d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
2985d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            } else {
2986d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("                  ");
2987d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            }
2988d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(" ").append(staEventToString(staEvent));
2989d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            return sb.toString();
2990d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        }
2991d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    }
29921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne}
2993