WifiMetrics.java revision 973e49552e5536a5accc391f7760aaafa694df6f
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;
49f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil;
5059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport com.android.server.wifi.util.ScanResultUtil;
51f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor;
531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter;
541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList;
5546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.BitSet;
561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar;
579831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport java.util.HashMap;
5808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.HashSet;
5946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.LinkedList;
601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List;
619831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport java.util.Map;
6208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.Set;
631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/**
651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated.
661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include:
671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Aggregated connection stats (num of connections, num of failures, ...)
681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Discrete connection event stats (time, duration, failure codes, ...)
691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Router details (technology type, authentication type, ...)
701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne *   Scan stats
711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */
721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics {
731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final String TAG = "WifiMetrics";
74c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final boolean DBG = false;
757a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
767a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL
777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
787a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MAX_RSSI_POLL = 0;
797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private static final int MIN_RSSI_POLL = -127;
805cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final int MAX_RSSI_DELTA = 127;
815cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final int MIN_RSSI_DELTA = -127;
825cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Maximum time period between ScanResult and RSSI poll to generate rssi delta datapoint */
835cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    public static final long TIMEOUT_RSSI_DELTA_MILLIS =  3000;
844569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private static final int MIN_WIFI_SCORE = 0;
854569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private static final int MAX_WIFI_SCORE = NetworkAgent.WIFI_BASE_SCORE;
86e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    @VisibleForTesting
87e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    static final int LOW_WIFI_SCORE = 50; // Mobile data score
881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private final Object mLock = new Object();
892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private static final int MAX_CONNECTION_EVENTS = 256;
9008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    // Largest bucket in the NumConnectableNetworkCount histogram,
9108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    // anything large will be stored in this bucket
9208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_CONNECTABLE_SSID_NETWORK_BUCKET = 20;
9308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_CONNECTABLE_BSSID_NETWORK_BUCKET = 50;
9408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET = 100;
9508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public static final int MAX_TOTAL_SCAN_RESULTS_BUCKET = 250;
969831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_TOTAL_PASSPOINT_APS_BUCKET = 50;
979831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET = 20;
989831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    public static final int MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET = 50;
99973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    public static final int MAX_TOTAL_80211MC_APS_BUCKET = 20;
100a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private static final int CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER = 1000;
10105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    // Max limit for number of soft AP related events, extra events will be dropped.
10205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private static final int MAX_NUM_SOFT_AP_EVENTS = 256;
103107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private Clock mClock;
104ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private boolean mScreenOn;
105ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    private int mWifiState;
106910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    private WifiAwareMetrics mWifiAwareMetrics;
107a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    private final PnoScanMetrics mPnoScanMetrics = new PnoScanMetrics();
10862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    private final WpsMetrics mWpsMetrics = new WpsMetrics();
10946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private Handler mHandler;
11008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiConfigManager mWifiConfigManager;
11108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiNetworkSelector mWifiNetworkSelector;
11208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private PasspointManager mPasspointManager;
1131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Metrics are stored within an instance of the WifiLog proto during runtime,
1151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during
1161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced
1171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * together at dump-time
1181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1197a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog();
1201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Session information that gets logged for every Wifi connection attempt.
1221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1237a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>();
1241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * The latest started (but un-ended) connection attempt
1261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private ConnectionEvent mCurrentConnectionEvent;
1281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode
1301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1317a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mScanReturnEntries = new SparseIntArray();
1321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Mapping of system state to the counts of scans requested in that wifi state * screenOn
1341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * combination. Indexed by WifiLog.WifiState * (1 + screenOn)
1351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1367a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray();
137f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of RSSI values to counts. */
138f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mRssiPollCounts = new SparseIntArray();
1395cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Mapping of RSSI scan-poll delta values to counts. */
1405cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private final SparseIntArray mRssiDeltaCounts = new SparseIntArray();
1415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** RSSI of the scan result for the last connection event*/
1425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private int mScanResultRssi = 0;
1435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /** Boot-relative timestamp when the last candidate scanresult was received, used to calculate
1445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        RSSI deltas. -1 designates no candidate scanResult being tracked */
1455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private long mScanResultRssiTimestampMillis = -1;
146f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /** Mapping of alert reason to the respective alert count. */
147f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray();
148107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    /**
149107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data
150107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     * capture for for this WifiMetricsProto
151107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne     */
152107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne    private long mRecordStartTimeSec;
1534569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    /** Mapping of Wifi Scores to counts */
1544569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    private final SparseIntArray mWifiScoreCounts = new SparseIntArray();
15544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    /** Mapping of SoftApManager start SoftAp return codes to counts */
15644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    private final SparseIntArray mSoftApManagerReturnCodeCounts = new SparseIntArray();
15708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
15808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mTotalSsidsInScanHistogram = new SparseIntArray();
15908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mTotalBssidsInScanHistogram = new SparseIntArray();
16008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenSsidsInScanHistogram = new SparseIntArray();
16108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenBssidsInScanHistogram = new SparseIntArray();
16208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedSsidsInScanHistogram = new SparseIntArray();
16308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedBssidsInScanHistogram = new SparseIntArray();
16408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenOrSavedSsidsInScanHistogram = new SparseIntArray();
16508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableOpenOrSavedBssidsInScanHistogram = new SparseIntArray();
16608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedPasspointProviderProfilesInScanHistogram =
16708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            new SparseIntArray();
16808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private final SparseIntArray mAvailableSavedPasspointProviderBssidsInScanHistogram =
16908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            new SparseIntArray();
17008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
171a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Mapping of "Connect to Network" notifications to counts. */
172a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private final SparseIntArray mConnectToNetworkNotificationCount = new SparseIntArray();
173a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Mapping of "Connect to Network" notification user actions to counts. */
174a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private final SparseIntArray mConnectToNetworkNotificationActionCount = new SparseIntArray();
175a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mOpenNetworkRecommenderBlacklistSize = 0;
176a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private boolean mIsWifiNetworksAvailableNotificationOn = false;
177a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mNumOpenNetworkConnectMessageFailedToSend = 0;
178a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    private int mNumOpenNetworkRecommendationUpdates = 0;
17905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /** List of soft AP events related to number of connected clients in tethered mode */
18005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private final List<SoftApConnectedClientsEvent> mSoftApEventListTethered = new ArrayList<>();
18105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /** List of soft AP events related to number of connected clients in local only mode */
18205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private final List<SoftApConnectedClientsEvent> mSoftApEventListLocalOnly = new ArrayList<>();
183a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1849831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1ApInScanHistogram = new SparseIntArray();
1859831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2ApInScanHistogram = new SparseIntArray();
1869831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1EssInScanHistogram = new SparseIntArray();
1879831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2EssInScanHistogram = new SparseIntArray();
1889831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR1ApsPerEssInScanHistogram = new SparseIntArray();
1899831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private final SparseIntArray mObservedHotspotR2ApsPerEssInScanHistogram = new SparseIntArray();
1909831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
191973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    private final SparseIntArray mObserved80211mcApInScanHistogram = new SparseIntArray();
192973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
193fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray    /** Wifi power metrics*/
194fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray    private WifiPowerMetrics mWifiPowerMetrics = new WifiPowerMetrics();
195fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray
19612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    /** Wifi Wake metrics */
19712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    private final WifiWakeMetrics mWifiWakeMetrics = new WifiWakeMetrics();
19812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
1991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class RouterFingerPrint {
2001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto;
2012532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        RouterFingerPrint() {
2021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint();
2031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
2061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
2071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
2081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType);
2091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo);
2101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mDtim=" + mRouterFingerPrintProto.dtim);
2111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication);
2121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mHidden=" + mRouterFingerPrintProto.hidden);
2131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology);
2141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6);
2151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
2161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
2171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
2182532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        public void updateFromWifiConfiguration(WifiConfiguration config) {
219ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            synchronized (mLock) {
220ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (config != null) {
221ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Is this a hidden network
222ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mRouterFingerPrintProto.hidden = config.hiddenSSID;
223ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Config may not have a valid dtimInterval set yet, in which case dtim will be zero
224ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // (These are only populated from beacon frame scan results, which are returned as
225ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // scan results from the chip far less frequently than Probe-responses)
226ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.dtimInterval > 0) {
227ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mRouterFingerPrintProto.dtim = config.dtimInterval;
228ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
229ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    mCurrentConnectionEvent.mConfigSsid = config.SSID;
230ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // Get AuthType information from config (We do this again from ScanResult after
231ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // associating with BSSID)
232ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (config.allowedKeyManagement != null
233ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                            && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
234ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
235ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
236ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else if (config.isEnterprise()) {
237ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
238ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
239ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    } else {
240ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
241ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                                .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
242ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
24359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
24459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                            .passpoint = config.isPasspoint();
245ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // If there's a ScanResult candidate associated with this config already, get it and
246ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    // log (more accurate) metrics from it
247ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
248ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    if (candidate != null) {
249ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        updateMetricsFromScanResult(candidate);
250ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    }
25196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
2522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
2532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
2541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
2551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
2571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Log event, tracking the start time, end time and result of a wireless connection attempt.
2581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
2591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    class ConnectionEvent {
2601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        WifiMetricsProto.ConnectionEvent mConnectionEvent;
26196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field
26296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        //covering more than just l2 failures. see b/27652362
26396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        /**
26496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot
26596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * more failures than just l2 though, since the proto does not have a place to log
26696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         * framework failures)
26796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne         */
2682532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // Failure is unknown
26996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_UNKNOWN = 0;
2702532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NONE
27196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NONE = 1;
2722532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // ASSOCIATION_REJECTION_EVENT
27396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ASSOCIATION_REJECTION = 2;
2742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // AUTHENTICATION_FAILURE_EVENT
27596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_AUTHENTICATION_FAILURE = 3;
2762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // SSID_TEMP_DISABLED (Also Auth failure)
27796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_SSID_TEMP_DISABLED = 4;
2784dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // reconnect() or reassociate() call to WifiNative failed
27996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_CONNECT_NETWORK_FAILED = 5;
2802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        // NETWORK_DISCONNECTION_EVENT
28196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NETWORK_DISCONNECTION = 6;
2824dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        // NEW_CONNECTION_ATTEMPT before previous finished
28396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7;
28496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // New connection attempt to the same network & bssid
28596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8;
28696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // Roam Watchdog timer triggered (Roaming timed out)
28796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_ROAM_TIMEOUT = 9;
28896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        // DHCP failure
28996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        public static final int FAILURE_DHCP = 10;
29096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne
2914dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        RouterFingerPrint mRouterFingerPrint;
2924dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealStartTime;
2934dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private long mRealEndTime;
2944dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigSsid;
2954dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne        private String mConfigBssid;
296ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private int mWifiState;
297ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        private boolean mScreenOn;
2982532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
2991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        private ConnectionEvent() {
3001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mConnectionEvent = new WifiMetricsProto.ConnectionEvent();
301947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealEndTime = 0;
302947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne            mRealStartTime = 0;
3032532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mRouterFingerPrint = new RouterFingerPrint();
3042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto;
3054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigSsid = "<NULL>";
3064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConfigBssid = "<NULL>";
307ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN;
308ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = false;
3091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
3101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
3111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        public String toString() {
3121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            StringBuilder sb = new StringBuilder();
3131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            sb.append("startTime=");
3141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            Calendar c = Calendar.getInstance();
3151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            synchronized (mLock) {
3161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                c.setTimeInMillis(mConnectionEvent.startTimeMillis);
3171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.startTimeMillis == 0 ? "            <null>" :
3181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
3194dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", SSID=");
3204dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigSsid);
3214dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", BSSID=");
3224dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConfigBssid);
3234dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", durationMillis=");
3241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mConnectionEvent.durationTakenToConnectMillis);
3252532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                sb.append(", roamType=");
3264dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.roamType) {
3272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 1:
3282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_NONE");
3292532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3302532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 2:
3312532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_DBDC");
3322532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3332532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 3:
3342532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_ENTERPRISE");
3352532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3362532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 4:
3372532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_USER_SELECTED");
3382532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3392532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    case 5:
3402532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNRELATED");
3412532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        break;
3422532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                    default:
3432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        sb.append("ROAM_UNKNOWN");
3442532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                }
3454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", connectionResult=");
3464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.connectionResult);
3471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", level2FailureCode=");
3484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.level2FailureCode) {
34996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NONE:
3504dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
3514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
35296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ASSOCIATION_REJECTION:
3534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("ASSOCIATION_REJECTION");
3544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
35596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_AUTHENTICATION_FAILURE:
3564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("AUTHENTICATION_FAILURE");
3574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
35896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_SSID_TEMP_DISABLED:
3594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("SSID_TEMP_DISABLED");
3604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_CONNECT_NETWORK_FAILED:
3624dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("CONNECT_NETWORK_FAILED");
3634dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NETWORK_DISCONNECTION:
3654dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NETWORK_DISCONNECTION");
3664dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
36796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_NEW_CONNECTION_ATTEMPT:
3684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NEW_CONNECTION_ATTEMPT");
3694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
37096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_REDUNDANT_CONNECTION_ATTEMPT:
37196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("REDUNDANT_CONNECTION_ATTEMPT");
37296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
37396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_ROAM_TIMEOUT:
37496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("ROAM_TIMEOUT");
37596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        break;
37696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    case FAILURE_DHCP:
37796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        sb.append("DHCP");
3784dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
3794dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
3804dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3814dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
3821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(", connectivityLevelFailureCode=");
3834dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                switch(mConnectionEvent.connectivityLevelFailureCode) {
3844dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NONE:
3854dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NONE");
3864dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3874dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_DHCP:
3884dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("DHCP");
3894dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3904dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET:
3914dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("NO_INTERNET");
3924dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3934dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED:
3944dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNWANTED");
3954dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3964dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                    default:
3974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        sb.append("UNKNOWN");
3984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                        break;
3994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                }
4004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(", signalStrength=");
4014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                sb.append(mConnectionEvent.signalStrength);
402ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", wifiState=");
403ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                switch(mWifiState) {
404ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISABLED:
405ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISABLED");
406ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
407ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
408ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_DISCONNECTED");
409ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
410ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
411ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_ASSOCIATED");
412ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
413ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                    default:
414ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        sb.append("WIFI_UNKNOWN");
415ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                        break;
416ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                }
417ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(", screenOn=");
418ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(mScreenOn);
419ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne                sb.append(". mRouterFingerprint: ");
4201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                sb.append(mRouterFingerPrint.toString());
4211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
4221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            return sb.toString();
4231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
4241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
426910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    public WifiMetrics(Clock clock, Looper looper, WifiAwareMetrics awareMetrics) {
427107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mClock = clock;
4281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mCurrentConnectionEvent = null;
429ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mScreenOn = true;
430ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED;
431107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne        mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
432910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen        mWifiAwareMetrics = awareMetrics;
43346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
43446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mHandler = new Handler(looper) {
43546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            public void handleMessage(Message msg) {
43646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                synchronized (mLock) {
43746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    processMessage(msg);
43846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
43946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            }
44046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        };
4411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
4421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
44308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal WifiConfigManager member */
44408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setWifiConfigManager(WifiConfigManager wifiConfigManager) {
44508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mWifiConfigManager = wifiConfigManager;
44608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
44708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
44808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal WifiNetworkSelector member */
44908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setWifiNetworkSelector(WifiNetworkSelector wifiNetworkSelector) {
45008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mWifiNetworkSelector = wifiNetworkSelector;
45108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
45208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
45308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /** Sets internal PasspointManager member */
45408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void setPasspointManager(PasspointManager passpointManager) {
45508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        mPasspointManager = passpointManager;
45608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
45708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
458a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
459a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment total number of attempts to start a pno scan
460a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
461a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanStartAttempCount() {
462a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
463a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanAttempts++;
464a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
465a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
466a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
467a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
468a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment total number of attempts with pno scan failed
469a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
470a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanFailedCount() {
471a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
472a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanFailed++;
473a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
474a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
475a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
476a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
477a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of pno scans started successfully over offload
478a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
479a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanStartedOverOffloadCount() {
480a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
481a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanStartedOverOffload++;
482a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
483a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
484a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
485a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
486a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of pno scans failed over offload
487a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
488a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoScanFailedOverOffloadCount() {
489a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
490a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoScanFailedOverOffload++;
491a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
492a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
493a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
494a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    /**
495a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     * Increment number of times pno scan found a result
496a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh     */
497a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    public void incrementPnoFoundNetworkEventCount() {
498a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        synchronized (mLock) {
499a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.numPnoFoundNetworkEvents++;
500a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh        }
501a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh    }
502a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
50362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
50462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps connection attempts
50562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
50662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsAttemptCount() {
50762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
50862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsAttempts++;
50962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
51062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
51162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
51262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
51362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps connection success
51462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
51562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsSuccessCount() {
51662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
51762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsSuccess++;
51862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
51962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
52062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
52162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
52262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps failure on start
52362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
52462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsStartFailureCount() {
52562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
52662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsStartFailure++;
52762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
52862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
52962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
53062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
53162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps overlap failure
53262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
53362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsOverlapFailureCount() {
53462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
53562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsOverlapFailure++;
53662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
53762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
53862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
53962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
54062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps timeout failure
54162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
54262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsTimeoutFailureCount() {
54362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
54462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsTimeoutFailure++;
54562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
54662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
54762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
54862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
54962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of other wps failure during connection
55062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
55162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsOtherConnectionFailureCount() {
55262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
55362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsOtherConnectionFailure++;
55462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
55562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
55662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
55762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
55862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of supplicant failure after wps
55962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
56062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsSupplicantFailureCount() {
56162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
56262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsSupplicantFailure++;
56362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
56462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
56562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
56662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    /**
56762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     * Increment total number of wps cancellation
56862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim     */
56962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    public void incrementWpsCancellationCount() {
57062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        synchronized (mLock) {
57162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.numWpsCancellation++;
57262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim        }
57362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim    }
57462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
575c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    // Values used for indexing SystemStateEntries
576c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_ON = 1;
577c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int SCREEN_OFF = 0;
578c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
5791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
5801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Create a new connection event. Call when wifi attempts to make a new network connection
5811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity
5821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * failure code.
5831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Gathers and sets the RouterFingerPrint data as well
5841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
585947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne     * @param config WifiConfiguration of the config used for the current connection attempt
5861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X
5871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
58896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne    public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) {
5891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
59096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            // Check if this is overlapping another current connection event
59196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            if (mCurrentConnectionEvent != null) {
59296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                //Is this new Connection Event the same as the current one
59396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                if (mCurrentConnectionEvent.mConfigSsid != null
59496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigBssid != null
59596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && config != null
59696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID)
59796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        && (mCurrentConnectionEvent.mConfigBssid.equals("any")
59896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                        || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) {
59996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    mCurrentConnectionEvent.mConfigBssid = targetBSSID;
60096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to the same network
60196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT,
60296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
60396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                } else {
60496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    // End Connection Event due to new connection attempt to different network
60596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                    endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT,
60696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                            WifiMetricsProto.ConnectionEvent.HLF_NONE);
60796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                }
60896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            }
60996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            //If past maximum connection events, start removing the oldest
6104dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) {
6114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne                mConnectionEventList.remove(0);
6124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            }
6134dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent = new ConnectionEvent();
6144dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.startTimeMillis =
615107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    mClock.getWallClockMillis();
61696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = targetBSSID;
6174dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
6184dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config);
61996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne            mCurrentConnectionEvent.mConfigBssid = "any";
620107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis();
621ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mWifiState = mWifiState;
622ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mCurrentConnectionEvent.mScreenOn = mScreenOn;
6234dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne            mConnectionEventList.add(mCurrentConnectionEvent);
6245cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
6255cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            if (config != null) {
6265cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
6275cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (candidate != null) {
6285cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // Cache the RSSI of the candidate, as the connection event level is updated
6295cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // from other sources (polls, bssid_associations) and delta requires the
6305cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    // scanResult rssi
6315cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssi = candidate.level;
6325cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssiTimestampMillis = mClock.getElapsedSinceBootMillis();
6335cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
6345cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
6351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
6381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
6392532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * set the RoamType of the current ConnectionEvent (if any)
6402532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
6412532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    public void setConnectionEventRoamType(int roamType) {
642ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
643ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null) {
644ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.roamType = roamType;
645ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            }
6462532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
6472532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
648f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
649f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    /**
650f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Set AP related metrics from ScanDetail
651f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
652f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void setConnectionScanDetail(ScanDetail scanDetail) {
653ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        synchronized (mLock) {
654ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne            if (mCurrentConnectionEvent != null && scanDetail != null) {
655ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
656ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
657ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //Ensure that we have a networkDetail, and that it corresponds to the currently
658ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                //tracked connection attempt
659ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                if (networkDetail != null && scanResult != null
660ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid != null
661ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        && mCurrentConnectionEvent.mConfigSsid
662ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                        .equals("\"" + networkDetail.getSSID() + "\"")) {
663ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromNetworkDetail(networkDetail);
664ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                    updateMetricsFromScanResult(scanResult);
665ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne                }
666f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne            }
667f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        }
668f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
669f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
6702532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
6711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * End a Connection event record. Call when wifi connection attempt succeeds or fails.
6721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * If a Connection event has not been started and is active when .end is called, a new one is
6731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * created with zero duration.
6741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
6751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param level2FailureCode Level 2 failure code returned by supplicant
6761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X
6771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
6781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) {
6791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
6802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
6812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                boolean result = (level2FailureCode == 1)
6822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE);
6832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0;
684107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis();
6852532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int)
6862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        (mCurrentConnectionEvent.mRealEndTime
6872532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        - mCurrentConnectionEvent.mRealStartTime);
6882532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode;
6892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode =
6902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                        connectivityFailureCode;
691f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                // ConnectionEvent already added to ConnectionEvents List. Safe to null current here
6922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mCurrentConnectionEvent = null;
6935cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (!result) {
6945cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mScanResultRssiTimestampMillis = -1;
6955cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
6961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
6971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
6981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
6991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7002b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
7012b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail
7022b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
7032b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) {
7042b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int dtimInterval = networkDetail.getDtimInterval();
7052b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (dtimInterval > 0) {
7062b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim =
7072b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                    dtimInterval;
7082b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
7092b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        int connectionWifiMode;
7102b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        switch (networkDetail.getWifiMode()) {
7112b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_UNDEFINED:
7122b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN;
7132b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7142b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11A:
7152b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A;
7162b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7172b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11B:
7182b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B;
7192b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7202b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11G:
7212b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G;
7222b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7232b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11N:
7242b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N;
7252b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7262b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            case InformationElementUtil.WifiMode.MODE_11AC  :
7272b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC;
7282b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7292b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            default:
7302b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER;
7312b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                break;
7322b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
7332b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto
7342b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                .routerTechnology = connectionWifiMode;
7352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
7362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
7372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    /**
7382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     * Set ConnectionEvent RSSI and authentication type from ScanResult
7392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne     */
7402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    private void updateMetricsFromScanResult(ScanResult scanResult) {
7412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level;
7422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                WifiMetricsProto.RouterFingerPrint.AUTH_OPEN;
74496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID;
7452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        if (scanResult.capabilities != null) {
74659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
7472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
74959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) {
7502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL;
75259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
7532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication =
7542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne                        WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE;
7552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne            }
7562b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne        }
75796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo =
75896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                scanResult.frequency;
7592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne    }
7602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne
7611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsLocationEnabled(boolean enabled) {
7621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isLocationEnabled = enabled;
7641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    void setIsScanningAlwaysEnabled(boolean enabled) {
7681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.isScanningAlwaysEnabled = enabled;
7701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
7741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Non Empty Scan Results count
7751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
7761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementNonEmptyScanResultCount() {
777c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount");
7781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numNonEmptyScanResults++;
7801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
7841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment Empty Scan Results count
7851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
7861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementEmptyScanResultCount() {
787c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementEmptyScanResultCount");
7881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
7891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiLogProto.numEmptyScanResults++;
7901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
7911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
7921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
7931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
794c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Increment background scan count
795c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
796c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementBackgroundScanCount() {
797c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        if (DBG) Log.v(TAG, "incrementBackgroundScanCount");
798c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
799c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numBackgroundScans++;
800c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
801c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
802c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
803c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne   /**
804c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get Background scan count
805c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
806c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getBackgroundScanCount() {
807c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
808c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numBackgroundScans;
809c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
810c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
811c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
812c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
81370ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne     * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry
814c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
815c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementOneshotScanCount() {
816c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
817c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.numOneshotScans++;
818c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
81970ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne        incrementWifiSystemScanStateCount(mWifiState, mScreenOn);
820c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
821c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
822c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
823424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     * Increment connectivity oneshot scan count.
824424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     */
825424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    public void incrementConnectivityOneshotScanCount() {
826424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        synchronized (mLock) {
827424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang            mWifiLogProto.numConnectivityOneshotScans++;
828424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        }
829424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    }
830424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang
831424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    /**
832c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get oneshot scan count
833c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
834c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getOneshotScanCount() {
835c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
836c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiLogProto.numOneshotScans;
837c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
838c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
839c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
840424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    /**
841424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     * Get connectivity oneshot scan count
842424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang     */
843424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    public int getConnectivityOneshotScanCount() {
844424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        synchronized (mLock) {
845424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang            return mWifiLogProto.numConnectivityOneshotScans;
846424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang        }
847424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang    }
848424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang
849c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String returnCodeToString(int scanReturnCode) {
850c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(scanReturnCode){
851c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_UNKNOWN:
852c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_UNKNOWN";
853c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_SUCCESS:
854c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_SUCCESS";
855c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED:
856c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INTERRUPTED";
857c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION:
858c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "SCAN_FAILURE_INVALID_CONFIGURATION";
859c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED:
860c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "FAILURE_WIFI_DISABLED";
861c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
862c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "<UNKNOWN>";
863c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
864c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
865c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
866c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
8671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increment count of scan return code occurrence
8681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
8691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X
8701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
871c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) {
8721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
873c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode));
874c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mScanReturnEntries.get(scanReturnCode);
875c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry += countToAdd;
8761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mScanReturnEntries.put(scanReturnCode, entry);
8771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
8781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
879c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
880c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this scanReturnCode
881c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * @param scanReturnCode that we are getting the count for
882c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
883c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getScanReturnEntry(int scanReturnCode) {
884c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
885c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mScanReturnEntries.get(scanReturnCode);
886c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
887c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
888c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
889c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private String wifiSystemStateToString(int state) {
890c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        switch(state){
891c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_UNKNOWN:
892c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_UNKNOWN";
893c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISABLED:
894c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISABLED";
895c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED:
896c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_DISCONNECTED";
897c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED:
898c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "WIFI_ASSOCIATED";
899c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            default:
900c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return "default";
901c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
902c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
9031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
9041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
9051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off
9061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
9071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X
9081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param screenOn Is the screen on
9091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
9101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void incrementWifiSystemScanStateCount(int state, boolean screenOn) {
9111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
912c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (DBG) {
913c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state)
914c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + " " + screenOn);
9151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
916c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF);
917c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int entry = mWifiSystemStateEntries.get(index);
918c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            entry++;
919c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiSystemStateEntries.put(index, entry);
920c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
921c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
922c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
923c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
924c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * Get the count of this system State Entry
925c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
926c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public int getSystemStateCount(int state, boolean screenOn) {
927c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        synchronized (mLock) {
928c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF);
929c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            return mWifiSystemStateEntries.get(index);
9301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
9311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
9321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
933ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
9345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack
9355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggers() {
9375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggers++;
9395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad association threshold when watchdog triggered
9435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) {
9455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count;
9475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad authentication threshold when watchdog triggered
9515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) {
9535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count;
9555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad dhcp threshold when watchdog triggered
9595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) {
9615f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9625f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count;
9635f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9645f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9655f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9665f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks over bad other threshold when watchdog triggered
9675f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9685f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) {
9695f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9705f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count;
9715f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * @param count number of networks seen when watchdog triggered
9755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) {
9775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count;
9795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad association network
9835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAssociation() {
9855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++;
9875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad authentication network
9915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
9925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() {
9935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
9945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++;
9955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
9965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
9975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
9985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad dhcp network
9995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadDhcp() {
10015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++;
10035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
10065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     * Increment count of triggers with atleast one bad other network
10075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne     */
10085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    public void incrementNumLastResortWatchdogTriggersWithBadOther() {
10095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        synchronized (mLock) {
10105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++;
10115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
10125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    }
10135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne
10145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    /**
1015ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed pno is working
1016ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1017ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoGood() {
1018ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1019ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoGood++;
1020ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1021ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1022ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1023ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found pno not working
1024ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1025ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogPnoBad() {
1026ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1027ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogPnoBad++;
1028ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1029ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1030ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1031ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog confirmed background scan is working
1032ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1033ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundGood() {
1034ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1035ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundGood++;
1036ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1037ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1038ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    /**
1039ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     * Increment number of times connectivity watchdog found background scan not working
1040ce003b812aead64dcb36647180991150021b24c1Glen Kuhne     */
1041ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    public void incrementNumConnectivityWatchdogBackgroundBad() {
1042ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        synchronized (mLock) {
1043ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiLogProto.numConnectivityWatchdogBackgroundBad++;
1044ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
1045ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    }
1046ce003b812aead64dcb36647180991150021b24c1Glen Kuhne
10477a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    /**
104846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Increment various poll related metrics, and cache performance data for StaEvent logging
104946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
105046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void handlePollResult(WifiInfo wifiInfo) {
105146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollRssi = wifiInfo.getRssi();
105246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollLinkSpeed = wifiInfo.getLinkSpeed();
105346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollFreq = wifiInfo.getFrequency();
105446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        incrementRssiPollRssiCount(mLastPollRssi);
105546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
105646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
105746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
10587a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Increment occurence count of RSSI level from RSSI poll.
10597a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     * Ignores rssi values outside the bounds of [MIN_RSSI_POLL, MAX_RSSI_POLL]
10607a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne     */
10617a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    public void incrementRssiPollRssiCount(int rssi) {
10627a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) {
10637a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            return;
10647a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
10657a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        synchronized (mLock) {
10667a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            int count = mRssiPollCounts.get(rssi);
10677a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mRssiPollCounts.put(rssi, count + 1);
10685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            maybeIncrementRssiDeltaCount(rssi - mScanResultRssi);
10695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        }
10705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    }
10715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne
10725cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    /**
10735cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * Increment occurence count of difference between scan result RSSI and the first RSSI poll.
10745cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * Ignores rssi values outside the bounds of [MIN_RSSI_DELTA, MAX_RSSI_DELTA]
10755cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     * mLock must be held when calling this method.
10765cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne     */
10775cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne    private void maybeIncrementRssiDeltaCount(int rssi) {
10785cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        // Check if this RSSI poll is close enough to a scan result RSSI to log a delta value
10795cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        if (mScanResultRssiTimestampMillis >= 0) {
10805cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            long timeDelta = mClock.getElapsedSinceBootMillis() - mScanResultRssiTimestampMillis;
10815cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            if (timeDelta <= TIMEOUT_RSSI_DELTA_MILLIS) {
10825cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                if (rssi >= MIN_RSSI_DELTA && rssi <= MAX_RSSI_DELTA) {
10835cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    int count = mRssiDeltaCounts.get(rssi);
10845cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    mRssiDeltaCounts.put(rssi, count + 1);
10855cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
10865cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
10875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
10887a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        }
10897a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne    }
10907a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
1091da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne    /**
10921c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne     * Increment count of Watchdog successes.
10931c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne     */
10941c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    public void incrementNumLastResortWatchdogSuccesses() {
10951c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne        synchronized (mLock) {
10961c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne            mWifiLogProto.numLastResortWatchdogSuccesses++;
10971c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne        }
10981c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    }
10991c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne
11001c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne    /**
1101f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * Increments the count of alerts by alert reason.
1102f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     *
1103f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     * @param reason The cause of the alert. The reason values are driver-specific.
1104f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal     */
1105f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    public void incrementAlertReasonCount(int reason) {
1106f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX
1107f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) {
1108f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED;
1109f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
1110f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        synchronized (mLock) {
1111f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            int alertCount = mWifiAlertReasonCounts.get(reason);
1112f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.put(reason, alertCount + 1);
1113f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        }
1114f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    }
1115f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
1116f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal    /**
111759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     * Counts all the different types of networks seen in a set of scan results
111859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne     */
111959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    public void countScanResults(List<ScanDetail> scanDetails) {
112059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        if (scanDetails == null) {
112159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            return;
112259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
112359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int totalResults = 0;
112459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int openNetworks = 0;
112559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int personalNetworks = 0;
112659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int enterpriseNetworks = 0;
112759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hiddenNetworks = 0;
112859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r1Networks = 0;
112959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        int hotspot2r2Networks = 0;
113059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        for (ScanDetail scanDetail : scanDetails) {
113159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            NetworkDetail networkDetail = scanDetail.getNetworkDetail();
113259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            ScanResult scanResult = scanDetail.getScanResult();
113359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            totalResults++;
113459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (networkDetail != null) {
113559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.isHiddenBeaconFrame()) {
113659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    hiddenNetworks++;
113759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
113859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (networkDetail.getHSRelease() != null) {
113959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
114059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r1Networks++;
114159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
114259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        hotspot2r2Networks++;
114359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    }
114459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
114559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
114659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            if (scanResult != null && scanResult.capabilities != null) {
114759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) {
114859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    enterpriseNetworks++;
114959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)
115059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        || ScanResultUtil.isScanResultForWepNetwork(scanResult)) {
115159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    personalNetworks++;
115259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                } else {
115359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                    openNetworks++;
115459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                }
115559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            }
115659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
115759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        synchronized (mLock) {
115859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numTotalScanResults += totalResults;
115959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numOpenNetworkScanResults += openNetworks;
116059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numPersonalNetworkScanResults += personalNetworks;
116159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks;
116259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks;
116359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks;
116459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks;
116559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne            mWifiLogProto.numScans++;
116659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne        }
116759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    }
116859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
1169e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    private boolean mWifiWins = false; // Based on scores, use wifi instead of mobile data?
1170e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass
117159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne    /**
11724569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * Increments occurence of a particular wifi score calculated
11734569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     * in WifiScoreReport by current connected network. Scores are bounded
1174e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     * within  [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray.
1175e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     *
1176e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass     * Also records events when the current score breaches significant thresholds.
11774569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao     */
11784569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    public void incrementWifiScoreCount(int score) {
11794569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        if (score < MIN_WIFI_SCORE || score > MAX_WIFI_SCORE) {
11804569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            return;
11814569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        }
11824569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        synchronized (mLock) {
11834569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            int count = mWifiScoreCounts.get(score);
11844569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiScoreCounts.put(score, count + 1);
1185e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass
1186e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            boolean wifiWins = mWifiWins;
1187e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            if (mWifiWins && score < LOW_WIFI_SCORE) {
1188e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                wifiWins = false;
1189e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            } else if (!mWifiWins && score > LOW_WIFI_SCORE) {
1190e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                wifiWins = true;
1191e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            }
1192e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            mLastScore = score;
1193e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            if (wifiWins != mWifiWins) {
1194e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                mWifiWins = wifiWins;
1195e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                StaEvent event = new StaEvent();
1196e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                event.type = StaEvent.TYPE_SCORE_BREACH;
1197e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                addStaEvent(event);
1198e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            }
11994569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        }
12004569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao    }
120159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne
120244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    /**
120344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * Increments occurence of the results from attempting to start SoftAp.
120444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * Maps the |result| and WifiManager |failureCode| constant to proto defined SoftApStartResult
120544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     * codes.
120644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein     */
120744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    public void incrementSoftApStartResult(boolean result, int failureCode) {
120844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein        synchronized (mLock) {
120944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            if (result) {
121044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
121144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY);
121244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
121344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY,
121444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
121544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                return;
121644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
121744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
121844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            // now increment failure modes - if not explicitly handled, dump into the general
121944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            // error bucket.
122044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            if (failureCode == WifiManager.SAP_START_FAILURE_NO_CHANNEL) {
122144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
122244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL);
122344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
122444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL,
122544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
122644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            } else {
122744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                // failure mode not tracked at this time...  count as a general error for now.
122844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                int count = mSoftApManagerReturnCodeCounts.get(
122944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR);
123044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mSoftApManagerReturnCodeCounts.put(
123144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR,
123244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        count + 1);
123344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
123444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein        }
123544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein    }
123644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
1237bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
123805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record indicating the current up state of soft AP
123905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
124005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    public void addSoftApUpChangedEvent(boolean isUp, int mode) {
124105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        SoftApConnectedClientsEvent event = new SoftApConnectedClientsEvent();
124205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.eventType = isUp ? SoftApConnectedClientsEvent.SOFT_AP_UP :
124305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                SoftApConnectedClientsEvent.SOFT_AP_DOWN;
124405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.numConnectedClients = 0;
124505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        addSoftApConnectedClientsEvent(event, mode);
124605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
124705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
124805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
124905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record for current number of associated stations to soft AP
125005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
125105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    public void addSoftApNumAssociatedStationsChangedEvent(int numStations, int mode) {
125205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        SoftApConnectedClientsEvent event = new SoftApConnectedClientsEvent();
125305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.eventType = SoftApConnectedClientsEvent.NUM_CLIENTS_CHANGED;
125405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        event.numConnectedClients = numStations;
125505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        addSoftApConnectedClientsEvent(event, mode);
125605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
125705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
125805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
125905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     * Adds a record to the corresponding event list based on mode param
126005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh     */
126105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    private void addSoftApConnectedClientsEvent(SoftApConnectedClientsEvent event, int mode) {
126205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        synchronized (mLock) {
126305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            List<SoftApConnectedClientsEvent> softApEventList;
126405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            switch (mode) {
126505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_TETHERED:
126605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    softApEventList = mSoftApEventListTethered;
126705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    break;
126805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_LOCAL_ONLY:
126905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    softApEventList = mSoftApEventListLocalOnly;
127005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    break;
127105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                default:
127205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    return;
127305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
127405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
127505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (softApEventList.size() > MAX_NUM_SOFT_AP_EVENTS) {
127605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                return;
127705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
127805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
12794de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            event.timeStampMillis = mClock.getElapsedSinceBootMillis();
128005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            softApEventList.add(event);
128105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh        }
128205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    }
128305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
128405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh    /**
12854de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh     * Updates current soft AP events with channel info
12864de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh     */
12874de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    public void addSoftApChannelSwitchedEvent(int frequency, int bandwidth, int mode) {
12884de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh        synchronized (mLock) {
12894de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            List<SoftApConnectedClientsEvent> softApEventList;
12904de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            switch (mode) {
12914de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_TETHERED:
12924de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    softApEventList = mSoftApEventListTethered;
12934de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
12944de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                case WifiManager.IFACE_IP_MODE_LOCAL_ONLY:
12954de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    softApEventList = mSoftApEventListLocalOnly;
12964de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
12974de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                default:
12984de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    return;
12994de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            }
13004de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13014de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            for (int index = softApEventList.size() - 1; index >= 0; index--) {
13024de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                SoftApConnectedClientsEvent event = softApEventList.get(index);
13034de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13044de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                if (event != null && event.eventType == SoftApConnectedClientsEvent.SOFT_AP_UP) {
13054de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    event.channelFrequency = frequency;
13064de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    event.channelBandwidth = bandwidth;
13074de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    break;
13084de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                }
13094de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh            }
13104de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh        }
13114de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    }
13124de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh
13134de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh    /**
1314bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the HAL crashed.
1315bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1316bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumHalCrashes() {
1317bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1318bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numHalCrashes++;
1319bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1320bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1321bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1322bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1323bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the Wificond crashed.
1324bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1325bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumWificondCrashes() {
1326bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1327bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numWificondCrashes++;
1328bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1329bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1330bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1331bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1332d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     * Increment number of times the supplicant crashed.
1333d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     */
1334d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    public void incrementNumSupplicantCrashes() {
1335d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        synchronized (mLock) {
1336d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius            // TODO(b/71720421): Add metrics for supplicant crashes.
1337d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius            mWifiLogProto.numHalCrashes++;
1338d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        }
1339d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    }
1340d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius
1341d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    /**
134227c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius     * Increment number of times the hostapd crashed.
134327c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius     */
134427c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    public void incrementNumHostapdCrashes() {
134527c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius        synchronized (mLock) {
134627c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius            // TODO(b/71720421): Add metrics for hostapd crashes.
134727c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius            mWifiLogProto.numHalCrashes++;
134827c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius        }
134927c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    }
135027c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius
135127c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius    /**
1352bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the wifi on failed due to an error in HAL.
1353bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1354bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumWifiOnFailureDueToHal() {
1355bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1356bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numWifiOnFailureDueToHal++;
1357bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1358bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1359bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
1360bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    /**
1361bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     * Increment number of times the wifi on failed due to an error in wificond.
1362bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius     */
1363bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    public void incrementNumWifiOnFailureDueToWificond() {
1364bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        synchronized (mLock) {
1365bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius            mWifiLogProto.numWifiOnFailureDueToWificond++;
1366bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius        }
1367bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius    }
1368bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
136926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
1370d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     * Increment number of times the wifi on failed due to an error in wificond.
1371d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius     */
1372d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    public void incrementNumWifiOnFailureDueToSupplicant() {
1373d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        synchronized (mLock) {
1374d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius            // TODO(b/71720421): Add metrics for supplicant failure during startup.
1375d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius            mWifiLogProto.numWifiOnFailureDueToHal++;
1376d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius        }
1377d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    }
1378d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius
1379d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius    /**
138026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider being installed.
138126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
138226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderInstallation() {
138326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
138426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderInstallation++;
138526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
138626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
138726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
138826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
138926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider is installed successfully.
139026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
139126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderInstallSuccess() {
139226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
139326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderInstallSuccess++;
139426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
139526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
139626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
139726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
139826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider being uninstalled.
139926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
140026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderUninstallation() {
140126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
140226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderUninstallation++;
140326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
140426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
140526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
140626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
140726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * Increment number of times Passpoint provider is uninstalled successfully.
140826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
140926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    public void incrementNumPasspointProviderUninstallSuccess() {
141026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
141126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviderUninstallSuccess++;
141226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
141326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
1414bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius
141508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    /**
141608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Increment N-Way network selection decision histograms:
141708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Counts the size of various sets of scanDetails within a scan, and increment the occurrence
141808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * of that size for the associated histogram. There are ten histograms generated for each
141908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * combination of: {SSID, BSSID} *{Total, Saved, Open, Saved_or_Open, Passpoint}
142008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     * Only performs this count if isFullBand is true, otherwise, increments the partial scan count
142108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne     */
142208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    public void incrementAvailableNetworksHistograms(List<ScanDetail> scanDetails,
142308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            boolean isFullBand) {
142408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        synchronized (mLock) {
142508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            if (mWifiConfigManager == null || mWifiNetworkSelector == null
142608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    || mPasspointManager == null) {
142708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                return;
142808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
142908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            if (!isFullBand) {
143008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                mWifiLogProto.partialAllSingleScanListenerResults++;
143108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                return;
143208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
143308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> ssids = new HashSet<ScanResultMatchInfo>();
143408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int bssids = 0;
143508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> openSsids = new HashSet<ScanResultMatchInfo>();
143608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int openBssids = 0;
143708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<ScanResultMatchInfo> savedSsids = new HashSet<ScanResultMatchInfo>();
143808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int savedBssids = 0;
143908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            // openOrSavedSsids calculated from union of savedSsids & openSsids
144008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int openOrSavedBssids = 0;
144108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            Set<PasspointProvider> savedPasspointProviderProfiles =
144208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    new HashSet<PasspointProvider>();
144308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            int savedPasspointProviderBssids = 0;
14449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            int passpointR1Aps = 0;
14459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            int passpointR2Aps = 0;
14469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            Map<ANQPNetworkKey, Integer> passpointR1UniqueEss = new HashMap<>();
14479831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            Map<ANQPNetworkKey, Integer> passpointR2UniqueEss = new HashMap<>();
1448973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            int supporting80211mcAps = 0;
144908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            for (ScanDetail scanDetail : scanDetails) {
145008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                NetworkDetail networkDetail = scanDetail.getNetworkDetail();
145108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ScanResult scanResult = scanDetail.getScanResult();
145208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (mWifiNetworkSelector.isSignalTooWeak(scanResult)) {
145308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    continue;
145408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
145508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ScanResultMatchInfo matchInfo = ScanResultMatchInfo.fromScanResult(scanResult);
145608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                Pair<PasspointProvider, PasspointMatch> providerMatch = null;
145708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                PasspointProvider passpointProvider = null;
145808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (networkDetail.isInterworking()) {
145908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    providerMatch =
146008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                            mPasspointManager.matchProvider(scanResult);
146108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    passpointProvider = providerMatch != null ? providerMatch.first : null;
14629831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
14639831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
14649831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        passpointR1Aps++;
14659831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
14669831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        passpointR2Aps++;
14679831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
14689831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
14699831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    long bssid = 0;
14709831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    boolean validBssid = false;
14719831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    try {
14729831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        bssid = Utils.parseMac(scanResult.BSSID);
14739831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        validBssid = true;
14749831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    } catch (IllegalArgumentException e) {
14759831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        Log.e(TAG,
14769831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                                "Invalid BSSID provided in the scan result: " + scanResult.BSSID);
14779831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
14789831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    if (validBssid) {
14799831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        ANQPNetworkKey uniqueEss = ANQPNetworkKey.buildKey(scanResult.SSID, bssid,
14809831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                                scanResult.hessid, networkDetail.getAnqpDomainID());
14819831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) {
14829831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            Integer countObj = passpointR1UniqueEss.get(uniqueEss);
14839831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            int count = countObj == null ? 0 : countObj;
14849831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            passpointR1UniqueEss.put(uniqueEss, count + 1);
14859831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) {
14869831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            Integer countObj = passpointR2UniqueEss.get(uniqueEss);
14879831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            int count = countObj == null ? 0 : countObj;
14889831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            passpointR2UniqueEss.put(uniqueEss, count + 1);
14899831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        }
14909831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    }
14919831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
149208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
149308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                ssids.add(matchInfo);
149408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                bssids++;
149508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isOpen = matchInfo.networkType == ScanResultMatchInfo.NETWORK_TYPE_OPEN;
149608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                WifiConfiguration config =
149708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        mWifiConfigManager.getConfiguredNetworkForScanDetail(scanDetail);
149808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isSaved = (config != null) && !config.isEphemeral()
149908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        && !config.isPasspoint();
150008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                boolean isSavedPasspoint = passpointProvider != null;
150108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isOpen) {
150208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openSsids.add(matchInfo);
150308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openBssids++;
150408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
150508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isSaved) {
150608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedSsids.add(matchInfo);
150708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedBssids++;
150808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
150908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isOpen || isSaved) {
151008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    openOrSavedBssids++;
151108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    // Calculate openOrSavedSsids union later
151208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
151308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                if (isSavedPasspoint) {
151408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderProfiles.add(passpointProvider);
151508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderBssids++;
151608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                }
1517973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                if (networkDetail.is80211McResponderSupport()) {
1518973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                    supporting80211mcAps++;
1519973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                }
152008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            }
152108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.fullBandAllSingleScanListenerResults++;
152208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementTotalScanSsids(mTotalSsidsInScanHistogram, ssids.size());
152308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementTotalScanResults(mTotalBssidsInScanHistogram, bssids);
152408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableOpenSsidsInScanHistogram, openSsids.size());
152508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableOpenBssidsInScanHistogram, openBssids);
152608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableSavedSsidsInScanHistogram, savedSsids.size());
152708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableSavedBssidsInScanHistogram, savedBssids);
152808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            openSsids.addAll(savedSsids); // openSsids = Union(openSsids, savedSsids)
152908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableOpenOrSavedSsidsInScanHistogram, openSsids.size());
153008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableOpenOrSavedBssidsInScanHistogram, openOrSavedBssids);
153108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementSsid(mAvailableSavedPasspointProviderProfilesInScanHistogram,
153208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderProfiles.size());
153308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            incrementBssid(mAvailableSavedPasspointProviderBssidsInScanHistogram,
153408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    savedPasspointProviderBssids);
15359831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalPasspointAps(mObservedHotspotR1ApInScanHistogram, passpointR1Aps);
15369831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalPasspointAps(mObservedHotspotR2ApInScanHistogram, passpointR2Aps);
15379831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalUniquePasspointEss(mObservedHotspotR1EssInScanHistogram,
15389831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    passpointR1UniqueEss.size());
15399831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            incrementTotalUniquePasspointEss(mObservedHotspotR2EssInScanHistogram,
15409831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    passpointR2UniqueEss.size());
15419831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            for (Integer count : passpointR1UniqueEss.values()) {
15429831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                incrementPasspointPerUniqueEss(mObservedHotspotR1ApsPerEssInScanHistogram, count);
15439831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            }
15449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            for (Integer count : passpointR2UniqueEss.values()) {
15459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                incrementPasspointPerUniqueEss(mObservedHotspotR2ApsPerEssInScanHistogram, count);
15469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            }
1547973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            increment80211mcAps(mObserved80211mcApInScanHistogram, supporting80211mcAps);
154808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        }
154908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
155008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
1551054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    /**
1552054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     * TODO: (b/72443859) Use notifierTag param to separate metrics for OpenNetworkNotifier and
1553054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     * CarrierNetworkNotifier, for this method and all other related metrics.
1554054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh     */
1555a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of a "Connect to Network" notification. */
1556054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementConnectToNetworkNotification(String notifierTag, int notificationType) {
1557a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1558a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int count = mConnectToNetworkNotificationCount.get(notificationType);
1559a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationCount.put(notificationType, count + 1);
1560a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1561a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1562a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1563a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of an "Connect to Network" notification user action. */
1564054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementConnectToNetworkNotificationAction(String notifierTag,
1565054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh            int notificationType, int actionType) {
1566a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1567a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int key = notificationType * CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER
1568a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    + actionType;
1569a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            int count = mConnectToNetworkNotificationActionCount.get(key);
1570a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationActionCount.put(key, count + 1);
1571a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1572a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1573a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1574a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /**
1575a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * Sets the number of SSIDs blacklisted from recommendation by the open network notification
1576a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * recommender.
1577a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     */
1578054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void setNetworkRecommenderBlacklistSize(String notifierTag, int size) {
1579a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1580a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mOpenNetworkRecommenderBlacklistSize = size;
1581a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1582a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1583a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1584a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Sets if the available network notification feature is enabled. */
1585054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void setIsWifiNetworksAvailableNotificationEnabled(String notifierTag, boolean enabled) {
1586a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1587a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mIsWifiNetworksAvailableNotificationOn = enabled;
1588a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1589a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1590a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1591a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of connection attempts that were initiated unsuccessfully */
1592054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementNumNetworkRecommendationUpdates(String notifierTag) {
1593a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1594a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkRecommendationUpdates++;
1595a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1596a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1597a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1598a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    /** Increments the occurence of connection attempts that were initiated unsuccessfully */
1599054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh    public void incrementNumNetworkConnectMessageFailedToSend(String notifierTag) {
1600a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        synchronized (mLock) {
1601a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkConnectMessageFailedToSend++;
1602a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen        }
1603a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen    }
1604a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
160511638f348ba45f9f417928e79b81186cef76c561Glen Kuhne    public static final String PROTO_DUMP_ARG = "wifiMetricsProto";
16069ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne    public static final String CLEAN_DUMP_ARG = "clean";
16079ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne
16081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
16091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager
16109ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne     * at this time.
16111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
16121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param fd unused
16131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param pw PrintWriter for writing dump to
16141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param args unused
16151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
16161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
16171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
1618031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne            if (args != null && args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) {
16199ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                // Dump serialized WifiLog proto
16201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                consolidateProto(true);
16211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
16221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (mCurrentConnectionEvent != event) {
16231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //indicate that automatic bug report has been taken for all valid
16241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        //connection events
16251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
16261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
16271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
16281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto);
16291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT);
16309ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                if (args.length > 1 && CLEAN_DUMP_ARG.equals(args[1])) {
16319ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    // Output metrics proto bytes (base64) and nothing else
16329ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.print(metricsProtoDump);
16339ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                } else {
16349ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    // Tag the start and end of the metrics proto bytes
16359ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println("WifiMetrics:");
16369ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println(metricsProtoDump);
16379ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                    pw.println("EndWifiMetrics");
16389ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                }
16392532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                clear();
16401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            } else {
16419ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne                pw.println("WifiMetrics:");
16421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mConnectionEvents:");
16431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                for (ConnectionEvent event : mConnectionEventList) {
16441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    String eventLine = event.toString();
16451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    if (event == mCurrentConnectionEvent) {
16461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        eventLine += "CURRENTLY OPEN EVENT";
16471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    }
16481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    pw.println(eventLine);
16491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
16501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks);
16511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks);
16521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworks="
16531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numPersonalNetworks);
16541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworks="
16551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworks);
165659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks);
165759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPasspointNetworks="
165859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPasspointNetworks);
16591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled);
16601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                pw.println("mWifiLogProto.isScanningAlwaysEnabled="
16611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + mWifiLogProto.isScanningAlwaysEnabled);
1662c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByUser="
1663c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByUser);
1664c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNetworksAddedByApps="
1665c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNetworksAddedByApps);
1666c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numNonEmptyScanResults="
1667c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numNonEmptyScanResults);
1668c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numEmptyScanResults="
1669c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numEmptyScanResults);
1670424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang                pw.println("mWifiLogProto.numConnecitvityOneshotScans="
1671424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang                        + mWifiLogProto.numConnectivityOneshotScans);
1672c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numOneshotScans="
1673c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numOneshotScans);
1674c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mWifiLogProto.numBackgroundScans="
1675c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + mWifiLogProto.numBackgroundScans);
1676c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1677c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mScanReturnEntries:");
1678c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_UNKNOWN: " + getScanReturnEntry(
1679c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_UNKNOWN));
1680c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_SUCCESS: " + getScanReturnEntry(
1681c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_SUCCESS));
1682c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry(
1683c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED));
1684c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry(
1685c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION));
1686c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  FAILURE_WIFI_DISABLED: " + getScanReturnEntry(
1687c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED));
1688c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1689c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>");
1690c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN       ON: "
1691c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true));
1692c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED      ON: "
1693c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true));
1694c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED  ON: "
1695c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true));
1696c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED    ON: "
1697c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true));
1698c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_UNKNOWN      OFF: "
1699c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false));
1700c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISABLED     OFF: "
1701c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false));
1702c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_DISCONNECTED OFF: "
1703c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false));
1704c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                pw.println("  WIFI_ASSOCIATED   OFF: "
1705c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false));
1706ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood="
1707ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoGood);
1708ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad="
1709ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogPnoBad);
1710ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood="
1711ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundGood);
1712ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad="
1713ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                        + mWifiLogProto.numConnectivityWatchdogBackgroundBad);
17145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggers="
17155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggers);
17165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal="
17175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal);
17185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal="
17195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal);
17205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal="
17215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal);
17225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal="
17235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal);
17245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal="
17255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal);
17265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation="
17275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation);
17285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication="
17295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication);
17305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp="
17315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp);
17325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther="
17335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther);
1734da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                pw.println("mWifiLogProto.numLastResortWatchdogSuccesses="
1735da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne                        + mWifiLogProto.numLastResortWatchdogSuccesses);
1736107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                pw.println("mWifiLogProto.recordDurationSec="
1737107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                        + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec));
17387a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                pw.println("mWifiLogProto.rssiPollRssiCount: Printing counts for [" + MIN_RSSI_POLL
17397a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                        + ", " + MAX_RSSI_POLL + "]");
17407a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                StringBuilder sb = new StringBuilder();
17417a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) {
17427a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                    sb.append(mRssiPollCounts.get(i) + " ");
17437a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                }
17447a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                pw.println("  " + sb.toString());
17455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                pw.println("mWifiLogProto.rssiPollDeltaCount: Printing counts for ["
17465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                        + MIN_RSSI_DELTA + ", " + MAX_RSSI_DELTA + "]");
17475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                sb.setLength(0);
17485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                for (int i = MIN_RSSI_DELTA; i <= MAX_RSSI_DELTA; i++) {
17495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                    sb.append(mRssiDeltaCounts.get(i) + " ");
17505cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                }
17515cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                pw.println("  " + sb.toString());
1752f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                pw.print("mWifiLogProto.alertReasonCounts=");
1753f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                sb.setLength(0);
1754f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN;
1755f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) {
1756f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    int count = mWifiAlertReasonCounts.get(i);
1757f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    if (count > 0) {
1758f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                        sb.append("(" + i + "," + count + "),");
1759f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    }
1760f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
1761f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                if (sb.length() > 1) {
1762f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    sb.setLength(sb.length() - 1);  // strip trailing comma
1763f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println(sb.toString());
1764f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                } else {
1765f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                    pw.println("()");
1766f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                }
176759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numTotalScanResults="
176859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numTotalScanResults);
176959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numOpenNetworkScanResults="
177059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numOpenNetworkScanResults);
177159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numPersonalNetworkScanResults="
177259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numPersonalNetworkScanResults);
177359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numEnterpriseNetworkScanResults="
177459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numEnterpriseNetworkScanResults);
177559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHiddenNetworkScanResults="
177659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHiddenNetworkScanResults);
177759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults="
177859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R1NetworkScanResults);
177959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults="
178059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                        + mWifiLogProto.numHotspot2R2NetworkScanResults);
178159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne                pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans);
17824569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                pw.println("mWifiLogProto.WifiScoreCount: [" + MIN_WIFI_SCORE + ", "
17834569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                        + MAX_WIFI_SCORE + "]");
17844569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                for (int i = 0; i <= MAX_WIFI_SCORE; i++) {
17854569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                    pw.print(mWifiScoreCounts.get(i) + " ");
17864569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                }
178744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println(); // add a line after wifi scores
178844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("mWifiLogProto.SoftApManagerReturnCodeCounts:");
178944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  SUCCESS: " + mSoftApManagerReturnCodeCounts.get(
179044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY));
179144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  FAILED_GENERAL_ERROR: " + mSoftApManagerReturnCodeCounts.get(
179244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR));
179344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                pw.println("  FAILED_NO_CHANNEL: " + mSoftApManagerReturnCodeCounts.get(
179444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL));
17954569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                pw.print("\n");
1796bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numHalCrashes="
1797bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numHalCrashes);
1798bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numWificondCrashes="
1799bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numWificondCrashes);
1800bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numWifiOnFailureDueToHal="
1801bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numWifiOnFailureDueToHal);
1802bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                pw.println("mWifiLogProto.numWifiOnFailureDueToWificond="
1803bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius                        + mWifiLogProto.numWifiOnFailureDueToWificond);
180446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                pw.println("StaEventList:");
1805d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                for (StaEventWithTime event : mStaEventList) {
1806d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                    pw.println(event);
180746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
1808910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen
180926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviders="
181026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviders);
181126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderInstallation="
181226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderInstallation);
181326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderInstallSuccess="
181426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderInstallSuccess);
181526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderUninstallation="
181626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderUninstallation);
181726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProviderUninstallSuccess="
181826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProviderUninstallSuccess);
181926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                pw.println("mWifiLogProto.numPasspointProvidersSuccessfullyConnected="
182026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu                        + mWifiLogProto.numPasspointProvidersSuccessfullyConnected);
182108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mTotalSsidsInScanHistogram:"
182208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mTotalSsidsInScanHistogram.toString());
182308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mTotalBssidsInScanHistogram:"
182408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mTotalBssidsInScanHistogram.toString());
182508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenSsidsInScanHistogram:"
182608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenSsidsInScanHistogram.toString());
182708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenBssidsInScanHistogram:"
182808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenBssidsInScanHistogram.toString());
182908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedSsidsInScanHistogram:"
183008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedSsidsInScanHistogram.toString());
183108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedBssidsInScanHistogram:"
183208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedBssidsInScanHistogram.toString());
183308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenOrSavedSsidsInScanHistogram:"
183408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenOrSavedSsidsInScanHistogram.toString());
183508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableOpenOrSavedBssidsInScanHistogram:"
183608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableOpenOrSavedBssidsInScanHistogram.toString());
183708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedPasspointProviderProfilesInScanHistogram:"
183808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedPasspointProviderProfilesInScanHistogram.toString());
183908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mAvailableSavedPasspointProviderBssidsInScanHistogram:"
184008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mAvailableSavedPasspointProviderBssidsInScanHistogram.toString());
184108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mWifiLogProto.partialAllSingleScanListenerResults="
184208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mWifiLogProto.partialAllSingleScanListenerResults);
184308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                pw.println("mWifiLogProto.fullBandAllSingleScanListenerResults="
184408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                        + mWifiLogProto.fullBandAllSingleScanListenerResults);
1845910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen                pw.println("mWifiAwareMetrics:");
1846910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen                mWifiAwareMetrics.dump(fd, pw, args);
1847a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
1848a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanAttempts="
1849a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanAttempts);
1850a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanFailed="
1851a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanFailed);
1852a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanStartedOverOffload="
1853a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanStartedOverOffload);
1854a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoScanFailedOverOffload="
1855a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoScanFailedOverOffload);
1856a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                pw.println("mPnoScanMetrics.numPnoFoundNetworkEvents="
1857a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh                        + mPnoScanMetrics.numPnoFoundNetworkEvents);
1858a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
1859a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.connectToNetworkNotificationCount="
1860a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mConnectToNetworkNotificationCount.toString());
1861a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.connectToNetworkNotificationActionCount="
1862a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mConnectToNetworkNotificationActionCount.toString());
1863a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.openNetworkRecommenderBlacklistSize="
1864a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mOpenNetworkRecommenderBlacklistSize);
1865a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.isWifiNetworksAvailableNotificationOn="
1866a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mIsWifiNetworksAvailableNotificationOn);
1867a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.numOpenNetworkRecommendationUpdates="
1868a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mNumOpenNetworkRecommendationUpdates);
1869a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                pw.println("mWifiLogProto.numOpenNetworkConnectMessageFailedToSend="
1870a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        + mNumOpenNetworkConnectMessageFailedToSend);
18719831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
18729831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1ApInScanHistogram="
18739831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1ApInScanHistogram);
18749831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2ApInScanHistogram="
18759831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2ApInScanHistogram);
18769831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1EssInScanHistogram="
18779831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1EssInScanHistogram);
18789831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2EssInScanHistogram="
18799831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2EssInScanHistogram);
18809831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram="
18819831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR1ApsPerEssInScanHistogram);
18829831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                pw.println("mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram="
18839831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                        + mObservedHotspotR2ApsPerEssInScanHistogram);
188405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
1885973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                pw.println("mWifiLogProto.observed80211mcSupportingApsInScanHistogram"
1886973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                        + mObserved80211mcApInScanHistogram);
1887973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
188805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                pw.println("mSoftApTetheredEvents:");
188905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                for (SoftApConnectedClientsEvent event : mSoftApEventListTethered) {
189005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    StringBuilder eventLine = new StringBuilder();
189105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append("event_type=" + event.eventType);
189205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",time_stamp_millis=" + event.timeStampMillis);
189305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",num_connected_clients=" + event.numConnectedClients);
18944de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_frequency=" + event.channelFrequency);
18954de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_bandwidth=" + event.channelBandwidth);
189605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    pw.println(eventLine.toString());
189705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                }
189805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                pw.println("mSoftApLocalOnlyEvents:");
189905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                for (SoftApConnectedClientsEvent event : mSoftApEventListLocalOnly) {
190005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    StringBuilder eventLine = new StringBuilder();
190105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append("event_type=" + event.eventType);
190205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",time_stamp_millis=" + event.timeStampMillis);
190305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    eventLine.append(",num_connected_clients=" + event.numConnectedClients);
19044de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_frequency=" + event.channelFrequency);
19054de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh                    eventLine.append(",channel_bandwidth=" + event.channelBandwidth);
190605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                    pw.println(eventLine.toString());
190705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                }
190862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
190962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsAttempts="
191062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsAttempts);
191162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsSuccess="
191262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsSuccess);
191362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsStartFailure="
191462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsStartFailure);
191562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsOverlapFailure="
191662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsOverlapFailure);
191762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsTimeoutFailure="
191862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsTimeoutFailure);
191962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsOtherConnectionFailure="
192062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsOtherConnectionFailure);
192162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsSupplicantFailure="
192262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsSupplicantFailure);
192362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                pw.println("mWpsMetrics.numWpsCancellation="
192462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim                        + mWpsMetrics.numWpsCancellation);
1925fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray
1926fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray                mWifiPowerMetrics.dump(pw);
192712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                mWifiWakeMetrics.dump(pw);
19281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
19291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
19301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
19311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
19323c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    /**
19333c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     * Update various counts of saved network types
19343c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     * @param networks List of WifiConfigurations representing all saved networks, must not be null
19353c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne     */
19363c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    public void updateSavedNetworks(List<WifiConfiguration> networks) {
19373c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne        synchronized (mLock) {
19383c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numSavedNetworks = networks.size();
19393c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numOpenNetworks = 0;
19403c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numPersonalNetworks = 0;
19413c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numEnterpriseNetworks = 0;
19423c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numNetworksAddedByUser = 0;
19433c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numNetworksAddedByApps = 0;
19443c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numHiddenNetworks = 0;
19453c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            mWifiLogProto.numPasspointNetworks = 0;
19463c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            for (WifiConfiguration config : networks) {
19473c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
19483c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numOpenNetworks++;
19493c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else if (config.isEnterprise()) {
19503c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numEnterpriseNetworks++;
19513c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else {
19523c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numPersonalNetworks++;
19533c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
19543c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.selfAdded) {
19553c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numNetworksAddedByUser++;
19563c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                } else {
19573c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numNetworksAddedByApps++;
19583c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
19593c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.hiddenSSID) {
19603c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numHiddenNetworks++;
19613c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
19623c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                if (config.isPasspoint()) {
19633c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                    mWifiLogProto.numPasspointNetworks++;
19643c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne                }
19653c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            }
19663c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne        }
19673c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne    }
19683c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne
19691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
197049357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * Update metrics for saved Passpoint profiles.
197126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     *
197226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     * @param numSavedProfiles The number of saved Passpoint profiles
197349357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * @param numConnectedProfiles The number of saved Passpoint profiles that have ever resulted
197449357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     *                             in a successful network connection
197526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu     */
197649357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu    public void updateSavedPasspointProfiles(int numSavedProfiles, int numConnectedProfiles) {
197726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        synchronized (mLock) {
197826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu            mWifiLogProto.numPasspointProviders = numSavedProfiles;
197949357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu            mWifiLogProto.numPasspointProvidersSuccessfullyConnected = numConnectedProfiles;
198026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu        }
198126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    }
198226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu
198326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu    /**
1984c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their
1985c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     * respective lists within mWifiLogProto
19861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     *
19871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * @param incremental Only include ConnectionEvents created since last automatic bug report
19881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
19891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private void consolidateProto(boolean incremental) {
19901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>();
19917a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne        List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>();
19925cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne        List<WifiMetricsProto.RssiPollCount> rssiDeltas = new ArrayList<>();
1993f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal        List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>();
19944569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao        List<WifiMetricsProto.WifiScoreCount> scores = new ArrayList<>();
19951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        synchronized (mLock) {
19961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            for (ConnectionEvent event : mConnectionEventList) {
1997c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // If this is not incremental, dump full ConnectionEvent list
1998c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                // Else Dump all un-dumped events except for the current one
19991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                if (!incremental || ((mCurrentConnectionEvent != event)
20001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        && !event.mConnectionEvent.automaticBugReportTaken)) {
20011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //Get all ConnectionEvents that haven not been dumped as a proto, also exclude
20021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    //the current active un-ended connection event
20031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    events.add(event.mConnectionEvent);
2004c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    if (incremental) {
2005c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        event.mConnectionEvent.automaticBugReportTaken = true;
2006c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    }
20071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                }
20081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
20091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            if (events.size() > 0) {
20101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent);
20111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            }
2012c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
2013c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list
2014c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.scanReturnEntries =
2015c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()];
2016c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mScanReturnEntries.size(); i++) {
2017c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry();
2018c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i);
2019c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i);
2020c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
2021c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
2022c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list
2023c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            // This one is slightly more complex, as the Sparse are indexed with:
2024c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            //     key: wifiState * 2 + isScreenOn, value: wifiStateCount
2025c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            mWifiLogProto.wifiSystemStateEntries =
2026c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    new WifiMetricsProto.WifiLog
2027c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    .WifiSystemStateEntry[mWifiSystemStateEntries.size()];
2028c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < mWifiSystemStateEntries.size(); i++) {
2029c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i] =
2030c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        new WifiMetricsProto.WifiLog.WifiSystemStateEntry();
2031c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiState =
2032c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.keyAt(i) / 2;
2033c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount =
2034c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        mWifiSystemStateEntries.valueAt(i);
2035c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                mWifiLogProto.wifiSystemStateEntries[i].isScreenOn =
2036c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        (mWifiSystemStateEntries.keyAt(i) % 2) > 0;
2037c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
2038107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000)
2039107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne                    - mRecordStartTimeSec);
20407a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne
20417a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            /**
20427a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             * Convert the SparseIntArray of RSSI poll rssi's and counts to the proto's repeated
20437a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             * IntKeyVal array.
20447a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne             */
20457a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            for (int i = 0; i < mRssiPollCounts.size(); i++) {
20467a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
20477a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                keyVal.rssi = mRssiPollCounts.keyAt(i);
20487a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                keyVal.count = mRssiPollCounts.valueAt(i);
20497a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne                rssis.add(keyVal);
20507a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            }
20517a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount);
2052f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal
2053f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            /**
20545cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             * Convert the SparseIntArray of RSSI delta rssi's and counts to the proto's repeated
20555cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             * IntKeyVal array.
20565cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne             */
20575cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            for (int i = 0; i < mRssiDeltaCounts.size(); i++) {
20585cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount();
20595cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                keyVal.rssi = mRssiDeltaCounts.keyAt(i);
20605cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                keyVal.count = mRssiDeltaCounts.valueAt(i);
20615cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne                rssiDeltas.add(keyVal);
20625cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            }
20635cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mWifiLogProto.rssiPollDeltaCount = rssiDeltas.toArray(mWifiLogProto.rssiPollDeltaCount);
20645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne
20655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            /**
2066f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * Convert the SparseIntArray of alert reasons and counts to the proto's repeated
2067f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             * IntKeyVal array.
2068f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal             */
2069f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) {
2070f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount();
2071f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.reason = mWifiAlertReasonCounts.keyAt(i);
2072f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                keyVal.count = mWifiAlertReasonCounts.valueAt(i);
2073f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal                alertReasons.add(keyVal);
2074f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            }
2075f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount);
20764569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao
20774569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            /**
20784569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            *  Convert the SparseIntArray of Wifi Score and counts to proto's repeated
20794569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            * IntKeyVal array.
20804569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            */
20814569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            for (int score = 0; score < mWifiScoreCounts.size(); score++) {
20824569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                WifiMetricsProto.WifiScoreCount keyVal = new WifiMetricsProto.WifiScoreCount();
20834569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                keyVal.score = mWifiScoreCounts.keyAt(score);
20844569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                keyVal.count = mWifiScoreCounts.valueAt(score);
20854569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao                scores.add(keyVal);
20864569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            }
20874569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiLogProto.wifiScoreCount = scores.toArray(mWifiLogProto.wifiScoreCount);
208844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein
208944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            /**
209044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             * Convert the SparseIntArray of SoftAp Return codes and counts to proto's repeated
209144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             * IntKeyVal array.
209244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein             */
209344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            int codeCounts = mSoftApManagerReturnCodeCounts.size();
209444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            mWifiLogProto.softApReturnCode = new WifiMetricsProto.SoftApReturnCodeCount[codeCounts];
209544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            for (int sapCode = 0; sapCode < codeCounts; sapCode++) {
209644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode] =
209744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        new WifiMetricsProto.SoftApReturnCodeCount();
209844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode].startResult =
209944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        mSoftApManagerReturnCodeCounts.keyAt(sapCode);
210044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                mWifiLogProto.softApReturnCode[sapCode].count =
210144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein                        mSoftApManagerReturnCodeCounts.valueAt(sapCode);
210244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            }
2103d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2104d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            /**
2105d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne             * Convert StaEventList to array of StaEvents
2106d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne             */
2107d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            mWifiLogProto.staEventList = new StaEvent[mStaEventList.size()];
2108d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            for (int i = 0; i < mStaEventList.size(); i++) {
2109d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                mWifiLogProto.staEventList[i] = mStaEventList.get(i).staEvent;
2110d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            }
211108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.totalSsidsInScanHistogram =
211208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mTotalSsidsInScanHistogram);
211308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.totalBssidsInScanHistogram =
211408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mTotalBssidsInScanHistogram);
211508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenSsidsInScanHistogram =
211608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableOpenSsidsInScanHistogram);
211708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenBssidsInScanHistogram =
211808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableOpenBssidsInScanHistogram);
211908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedSsidsInScanHistogram =
212008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableSavedSsidsInScanHistogram);
212108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedBssidsInScanHistogram =
212208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(mAvailableSavedBssidsInScanHistogram);
212308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenOrSavedSsidsInScanHistogram =
212408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
212508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableOpenOrSavedSsidsInScanHistogram);
212608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableOpenOrSavedBssidsInScanHistogram =
212708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
212808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableOpenOrSavedBssidsInScanHistogram);
212908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedPasspointProviderProfilesInScanHistogram =
213008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
213108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableSavedPasspointProviderProfilesInScanHistogram);
213208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mWifiLogProto.availableSavedPasspointProviderBssidsInScanHistogram =
213308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    makeNumConnectableNetworksBucketArray(
213408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    mAvailableSavedPasspointProviderBssidsInScanHistogram);
2135910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen            mWifiLogProto.wifiAwareLog = mWifiAwareMetrics.consolidateProto();
2136a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh
2137a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mWifiLogProto.pnoScanMetrics = mPnoScanMetrics;
2138a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2139a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            /**
2140a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * Convert the SparseIntArray of "Connect to Network" notification types and counts to
2141a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * proto's repeated IntKeyVal array.
2142a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             */
2143a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            ConnectToNetworkNotificationAndActionCount[] notificationCountArray =
2144a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    new ConnectToNetworkNotificationAndActionCount[
2145a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                            mConnectToNetworkNotificationCount.size()];
2146a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            for (int i = 0; i < mConnectToNetworkNotificationCount.size(); i++) {
2147a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                ConnectToNetworkNotificationAndActionCount keyVal =
2148a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        new ConnectToNetworkNotificationAndActionCount();
2149a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.notification = mConnectToNetworkNotificationCount.keyAt(i);
2150a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.recommender =
2151a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN;
2152a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.count = mConnectToNetworkNotificationCount.valueAt(i);
2153a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                notificationCountArray[i] = keyVal;
2154a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            }
2155a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.connectToNetworkNotificationCount = notificationCountArray;
2156a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2157a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            /**
2158a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * Convert the SparseIntArray of "Connect to Network" notification types and counts to
2159a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             * proto's repeated IntKeyVal array.
2160a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen             */
2161a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            ConnectToNetworkNotificationAndActionCount[] notificationActionCountArray =
2162a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    new ConnectToNetworkNotificationAndActionCount[
2163a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                            mConnectToNetworkNotificationActionCount.size()];
2164a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            for (int i = 0; i < mConnectToNetworkNotificationActionCount.size(); i++) {
2165a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                ConnectToNetworkNotificationAndActionCount keyVal =
2166a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        new ConnectToNetworkNotificationAndActionCount();
2167a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                int key = mConnectToNetworkNotificationActionCount.keyAt(i);
2168a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.notification = key / CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER;
2169a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.action = key % CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER;
2170a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.recommender =
2171a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                        ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN;
2172a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                keyVal.count = mConnectToNetworkNotificationActionCount.valueAt(i);
2173a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                notificationActionCountArray[i] = keyVal;
2174a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            }
2175a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.connectToNetworkNotificationActionCount = notificationActionCountArray;
2176a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen
2177a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.openNetworkRecommenderBlacklistSize =
2178a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mOpenNetworkRecommenderBlacklistSize;
2179a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.isWifiNetworksAvailableNotificationOn =
2180a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mIsWifiNetworksAvailableNotificationOn;
2181a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.numOpenNetworkRecommendationUpdates =
2182a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mNumOpenNetworkRecommendationUpdates;
2183a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mWifiLogProto.numOpenNetworkConnectMessageFailedToSend =
2184a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen                    mNumOpenNetworkConnectMessageFailedToSend;
21859831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen
21869831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1ApsInScanHistogram =
21879831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR1ApInScanHistogram);
21889831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2ApsInScanHistogram =
21899831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR2ApInScanHistogram);
21909831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1EssInScanHistogram =
21919831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR1EssInScanHistogram);
21929831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2EssInScanHistogram =
21939831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(mObservedHotspotR2EssInScanHistogram);
21949831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram =
21959831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(
21969831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            mObservedHotspotR1ApsPerEssInScanHistogram);
21979831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram =
21989831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                    makeNumConnectableNetworksBucketArray(
21999831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen                            mObservedHotspotR2ApsPerEssInScanHistogram);
220005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh
2201973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            mWifiLogProto.observed80211McSupportingApsInScanHistogram =
2202973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen                    makeNumConnectableNetworksBucketArray(mObserved80211mcApInScanHistogram);
2203973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen
220405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (mSoftApEventListTethered.size() > 0) {
220505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                mWifiLogProto.softApConnectedClientsEventsTethered =
220605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mSoftApEventListTethered.toArray(
220705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mWifiLogProto.softApConnectedClientsEventsTethered);
220805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
220905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            if (mSoftApEventListLocalOnly.size() > 0) {
221005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                mWifiLogProto.softApConnectedClientsEventsLocalOnly =
221105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mSoftApEventListLocalOnly.toArray(
221205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh                        mWifiLogProto.softApConnectedClientsEventsLocalOnly);
221305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            }
221462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim
221562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWifiLogProto.wpsMetrics = mWpsMetrics;
2216fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray            mWifiLogProto.wifiPowerStats = mWifiPowerMetrics.buildProto();
221712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach            mWifiLogProto.wifiWakeStats = mWifiWakeMetrics.buildProto();
2218ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne        }
22191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
22202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne
222108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private WifiMetricsProto.NumConnectableNetworksBucket[] makeNumConnectableNetworksBucketArray(
222208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            SparseIntArray sia) {
222308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        WifiMetricsProto.NumConnectableNetworksBucket[] array =
222408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                new WifiMetricsProto.NumConnectableNetworksBucket[sia.size()];
222508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        for (int i = 0; i < sia.size(); i++) {
222608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            WifiMetricsProto.NumConnectableNetworksBucket keyVal =
222708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne                    new WifiMetricsProto.NumConnectableNetworksBucket();
222808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            keyVal.numConnectableNetworks = sia.keyAt(i);
222908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            keyVal.count = sia.valueAt(i);
223008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            array[i] = keyVal;
223108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        }
223208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        return array;
223308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
223408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne
22352532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    /**
2236a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * Clear all WifiMetrics, except for currentConnectionEvent and Open Network Notification
2237a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen     * feature enabled state, blacklist size.
22382532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     */
22392532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    private void clear() {
22402532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        synchronized (mLock) {
22412532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mConnectionEventList.clear();
22422532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            if (mCurrentConnectionEvent != null) {
22432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                mConnectionEventList.add(mCurrentConnectionEvent);
22442532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            }
22452532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mScanReturnEntries.clear();
22462532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiSystemStateEntries.clear();
2247107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne            mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000;
22487a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne            mRssiPollCounts.clear();
22495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mRssiDeltaCounts.clear();
2250f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal            mWifiAlertReasonCounts.clear();
22514569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao            mWifiScoreCounts.clear();
22522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne            mWifiLogProto.clear();
22535cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne            mScanResultRssiTimestampMillis = -1;
225444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein            mSoftApManagerReturnCodeCounts.clear();
225546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            mStaEventList.clear();
2256910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen            mWifiAwareMetrics.clear();
225708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mTotalSsidsInScanHistogram.clear();
225808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mTotalBssidsInScanHistogram.clear();
225908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenSsidsInScanHistogram.clear();
226008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenBssidsInScanHistogram.clear();
226108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedSsidsInScanHistogram.clear();
226208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedBssidsInScanHistogram.clear();
226308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenOrSavedSsidsInScanHistogram.clear();
226408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableOpenOrSavedBssidsInScanHistogram.clear();
226508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedPasspointProviderProfilesInScanHistogram.clear();
226608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne            mAvailableSavedPasspointProviderBssidsInScanHistogram.clear();
2267a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh            mPnoScanMetrics.clear();
2268a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationCount.clear();
2269a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mConnectToNetworkNotificationActionCount.clear();
2270a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkRecommendationUpdates = 0;
2271a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen            mNumOpenNetworkConnectMessageFailedToSend = 0;
22729831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1ApInScanHistogram.clear();
22739831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2ApInScanHistogram.clear();
22749831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1EssInScanHistogram.clear();
22759831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2EssInScanHistogram.clear();
22769831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR1ApsPerEssInScanHistogram.clear();
22779831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen            mObservedHotspotR2ApsPerEssInScanHistogram.clear();
227805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            mSoftApEventListTethered.clear();
227905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh            mSoftApEventListLocalOnly.clear();
228062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim            mWpsMetrics.clear();
228112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach            mWifiWakeMetrics.clear();
2282973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen            mObserved80211mcApInScanHistogram.clear();
22832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        }
22842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne    }
2285ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
2286ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
2287ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set screen state (On/Off)
2288ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
2289ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setScreenState(boolean screenOn) {
2290ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
2291ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mScreenOn = screenOn;
2292ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
2293ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
2294ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne
2295ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    /**
2296ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     *  Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED)
2297ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne     */
2298ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    public void setWifiState(int wifiState) {
2299ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        synchronized (mLock) {
2300ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne            mWifiState = wifiState;
2301e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            mWifiWins = (wifiState == WifiMetricsProto.WifiLog.WIFI_ASSOCIATED);
2302ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne        }
2303ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne    }
230446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
230546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
230646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Message handler for interesting WifiMonitor messages. Generates StaEvents
230746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
230846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private void processMessage(Message msg) {
230946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StaEvent event = new StaEvent();
231046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        boolean logEvent = true;
231146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (msg.what) {
231246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.ASSOCIATION_REJECTION_EVENT:
231346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT;
231446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.associationTimedOut = msg.arg1 > 0 ? true : false;
231546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.status = msg.arg2;
231646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
231746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.AUTHENTICATION_FAILURE_EVENT:
231846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT;
231946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                switch (msg.arg2) {
232046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_NONE:
232146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_NONE;
232246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
232346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_TIMEOUT:
232446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_TIMEOUT;
232546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
232646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD:
232746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_WRONG_PSWD;
232846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
232946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    case WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE:
233046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        event.authFailureReason = StaEvent.AUTH_FAILURE_EAP_FAILURE;
233146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
233246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    default:
233346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        break;
233446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                }
233546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
233646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.NETWORK_CONNECTION_EVENT:
233746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_NETWORK_CONNECTION_EVENT;
233846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
233946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.NETWORK_DISCONNECTION_EVENT:
234046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT;
234146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.reason = msg.arg2;
234246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.localGen = msg.arg1 == 0 ? false : true;
234346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
234446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT:
234546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                logEvent = false;
234646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                StateChangeResult stateChangeResult = (StateChangeResult) msg.obj;
234746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                mSupplicantStateChangeBitmask |= supplicantStateToBit(stateChangeResult.state);
234846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
234946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiStateMachine.CMD_ASSOCIATED_BSSID:
235046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_CMD_ASSOCIATED_BSSID;
235146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
235246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case WifiStateMachine.CMD_TARGET_BSSID:
235346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                event.type = StaEvent.TYPE_CMD_TARGET_BSSID;
235446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
235546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
235646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return;
235746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
235846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (logEvent) {
235946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            addStaEvent(event);
236046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
236146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
236246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
236346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
236446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
236546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
236646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
236746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type) {
236846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, null);
236946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
237046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
237146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
237246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
237346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
237446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param config WifiConfiguration for a framework initiated connection attempt
237546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
237646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, WifiConfiguration config) {
237746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, config);
237846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
237946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
238046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
238146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
238246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
238346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework
238446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     *                                  initiated a FRAMEWORK_DISCONNECT
238546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
238646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, int frameworkDisconnectReason) {
238746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        logStaEvent(type, frameworkDisconnectReason, null);
238846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
238946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
239046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant
239146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * generated event types, which are logged through 'sendMessage'
239246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param type StaEvent.EventType describing the event
239346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework
239446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     *                                  initiated a FRAMEWORK_DISCONNECT
239546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * @param config WifiConfiguration for a framework initiated connection attempt
239646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
239746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public void logStaEvent(int type, int frameworkDisconnectReason, WifiConfiguration config) {
239846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (type) {
239946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL:
240046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST:
240146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST:
240246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_CONNECT:
240346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_ROAM:
240446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CONNECT_NETWORK:
240546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK:
240646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_FRAMEWORK_DISCONNECT:
2407e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            case StaEvent.TYPE_SCORE_BREACH:
240846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
240946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
241046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                Log.e(TAG, "Unknown StaEvent:" + type);
241146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return;
241246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
241346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StaEvent event = new StaEvent();
241446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        event.type = type;
241546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (frameworkDisconnectReason != StaEvent.DISCONNECT_UNKNOWN) {
241646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            event.frameworkDisconnectReason = frameworkDisconnectReason;
241746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
241846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        event.configInfo = createConfigInfo(config);
241946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        addStaEvent(event);
242046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
242146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
242246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private void addStaEvent(StaEvent staEvent) {
242346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.startTimeMillis = mClock.getElapsedSinceBootMillis();
242446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastRssi = mLastPollRssi;
242546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastFreq = mLastPollFreq;
242646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.lastLinkSpeed = mLastPollLinkSpeed;
242746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        staEvent.supplicantStateChangesBitmask = mSupplicantStateChangeBitmask;
2428e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        staEvent.lastScore = mLastScore;
242946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mSupplicantStateChangeBitmask = 0;
243046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollRssi = -127;
243146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollFreq = -1;
243246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        mLastPollLinkSpeed = -1;
2433e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        mLastScore = -1;
2434d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        mStaEventList.add(new StaEventWithTime(staEvent, mClock.getWallClockMillis()));
243546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        // Prune StaEventList if it gets too long
243646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (mStaEventList.size() > MAX_STA_EVENTS) mStaEventList.remove();
243746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
243846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
243946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private ConfigInfo createConfigInfo(WifiConfiguration config) {
244046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (config == null) return null;
244146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        ConfigInfo info = new ConfigInfo();
244246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedKeyManagement = bitSetToInt(config.allowedKeyManagement);
244346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedProtocols = bitSetToInt(config.allowedProtocols);
244446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedAuthAlgorithms = bitSetToInt(config.allowedAuthAlgorithms);
244546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedPairwiseCiphers = bitSetToInt(config.allowedPairwiseCiphers);
244646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.allowedGroupCiphers = bitSetToInt(config.allowedGroupCiphers);
244746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.hiddenSsid = config.hiddenSSID;
244846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.isPasspoint = config.isPasspoint();
244946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.isEphemeral = config.isEphemeral();
245046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        info.hasEverConnected = config.getNetworkSelectionStatus().getHasEverConnected();
245146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        ScanResult candidate = config.getNetworkSelectionStatus().getCandidate();
245246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (candidate != null) {
245346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            info.scanRssi = candidate.level;
245446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            info.scanFreq = candidate.frequency;
245546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
245646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return info;
245746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
245846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
245946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public Handler getHandler() {
246046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return mHandler;
246146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
246246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
2463910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    public WifiAwareMetrics getWifiAwareMetrics() {
2464910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen        return mWifiAwareMetrics;
2465910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen    }
2466910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen
246712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    public WifiWakeMetrics getWakeupMetrics() {
246812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        return mWifiWakeMetrics;
246912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    }
247012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
247146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    // Rather than generate a StaEvent for each SUPPLICANT_STATE_CHANGE, cache these in a bitmask
247246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    // and attach it to the next event which is generated.
247346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mSupplicantStateChangeBitmask = 0;
247446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
247546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
247646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Converts a SupplicantState value to a single bit, with position defined by
247746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * {@code StaEvent.SupplicantState}
247846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
247946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static int supplicantStateToBit(SupplicantState state) {
248046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch(state) {
248146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case DISCONNECTED:
248246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_DISCONNECTED;
248346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INTERFACE_DISABLED:
248446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INTERFACE_DISABLED;
248546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INACTIVE:
248646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INACTIVE;
248746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case SCANNING:
248846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_SCANNING;
248946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case AUTHENTICATING:
249046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_AUTHENTICATING;
249146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case ASSOCIATING:
249246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_ASSOCIATING;
249346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case ASSOCIATED:
249446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_ASSOCIATED;
249546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case FOUR_WAY_HANDSHAKE:
249646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE;
249746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case GROUP_HANDSHAKE:
249846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_GROUP_HANDSHAKE;
249946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case COMPLETED:
250046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_COMPLETED;
250146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case DORMANT:
250246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_DORMANT;
250346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case UNINITIALIZED:
250446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_UNINITIALIZED;
250546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case INVALID:
250646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 1 << StaEvent.STATE_INVALID;
250746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
250846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                Log.wtf(TAG, "Got unknown supplicant state: " + state.ordinal());
250946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return 0;
251046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
251146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
251246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
251346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String supplicantStateChangesBitmaskToString(int mask) {
251446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
2515d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        sb.append("supplicantStateChangeEvents: {");
251646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_DISCONNECTED)) > 0) sb.append(" DISCONNECTED");
251746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INTERFACE_DISABLED)) > 0) sb.append(" INTERFACE_DISABLED");
251846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INACTIVE)) > 0) sb.append(" INACTIVE");
251946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_SCANNING)) > 0) sb.append(" SCANNING");
252046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_AUTHENTICATING)) > 0) sb.append(" AUTHENTICATING");
252146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_ASSOCIATING)) > 0) sb.append(" ASSOCIATING");
252246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_ASSOCIATED)) > 0) sb.append(" ASSOCIATED");
252346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE)) > 0) sb.append(" FOUR_WAY_HANDSHAKE");
252446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_GROUP_HANDSHAKE)) > 0) sb.append(" GROUP_HANDSHAKE");
252546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_COMPLETED)) > 0) sb.append(" COMPLETED");
252646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_DORMANT)) > 0) sb.append(" DORMANT");
252746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_UNINITIALIZED)) > 0) sb.append(" UNINITIALIZED");
252846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if ((mask & (1 << StaEvent.STATE_INVALID)) > 0) sb.append(" INVALID");
252946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        sb.append("}");
253046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
253146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
253246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
253346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
253446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Returns a human readable string from a Sta Event. Only adds information relevant to the event
253546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * type.
253646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
253746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    public static String staEventToString(StaEvent event) {
253846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event == null) return "<NULL>";
253946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
254046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (event.type) {
254146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT:
2542d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("ASSOCIATION_REJECTION_EVENT")
254346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" timedOut=").append(event.associationTimedOut)
254446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" status=").append(event.status).append(":")
254546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(ISupplicantStaIfaceCallback.StatusCode.toString(event.status));
254646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
254746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT:
2548d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("AUTHENTICATION_FAILURE_EVENT reason=").append(event.authFailureReason)
254946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(":").append(authFailureReasonToString(event.authFailureReason));
255046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
255146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_CONNECTION_EVENT:
2552d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_CONNECTION_EVENT");
255346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
255446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT:
2555d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_DISCONNECTION_EVENT")
255646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" local_gen=").append(event.localGen)
255746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" reason=").append(event.reason).append(":")
255846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(ISupplicantStaIfaceCallback.ReasonCode.toString(
255946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                                (event.reason >= 0 ? event.reason : -1 * event.reason)));
256046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
256146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_ASSOCIATED_BSSID:
2562d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_ASSOCIATED_BSSID");
256346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
256446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL:
2565d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_CONFIGURATION_SUCCESSFUL");
256646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
256746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST:
2568d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_CONFIGURATION_LOST");
256946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
257046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST:
2571d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_IP_REACHABILITY_LOST");
257246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
257346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_TARGET_BSSID:
2574d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_TARGET_BSSID");
257546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
257646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_CONNECT:
2577d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_START_CONNECT");
257846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
257946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CMD_START_ROAM:
2580d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CMD_START_ROAM");
258146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
258246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_CONNECT_NETWORK:
2583d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("CONNECT_NETWORK");
258446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
258546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK:
2586d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("NETWORK_AGENT_VALID_NETWORK");
258746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
258846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.TYPE_FRAMEWORK_DISCONNECT:
2589d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("FRAMEWORK_DISCONNECT")
259046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(" reason=")
259146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                        .append(frameworkDisconnectReasonToString(event.frameworkDisconnectReason));
259246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
2593e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass            case StaEvent.TYPE_SCORE_BREACH:
2594e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                sb.append("SCORE_BREACH");
2595e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass                break;
259646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
259746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                sb.append("UNKNOWN " + event.type + ":");
259846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                break;
259946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
260046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastRssi != -127) sb.append(" lastRssi=").append(event.lastRssi);
260146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastFreq != -1) sb.append(" lastFreq=").append(event.lastFreq);
260246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.lastLinkSpeed != -1) sb.append(" lastLinkSpeed=").append(event.lastLinkSpeed);
2603e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass        if (event.lastScore != -1) sb.append(" lastScore=").append(event.lastScore);
260446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.supplicantStateChangesBitmask != 0) {
2605d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(", ").append(supplicantStateChangesBitmaskToString(
260646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                    event.supplicantStateChangesBitmask));
260746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
260846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        if (event.configInfo != null) {
2609d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(", ").append(configInfoToString(event.configInfo));
261046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
261146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
261246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
261346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
261446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
261546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String authFailureReasonToString(int authFailureReason) {
261646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (authFailureReason) {
261746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_NONE:
261846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_NONE";
261946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_TIMEOUT:
262046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_TIMEOUT";
262146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_WRONG_PSWD:
262246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_WRONG_PSWD";
262346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.AUTH_FAILURE_EAP_FAILURE:
262446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "ERROR_AUTH_FAILURE_EAP_FAILURE";
262546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
262646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "";
262746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
262846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
262946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
263046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String frameworkDisconnectReasonToString(int frameworkDisconnectReason) {
263146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        switch (frameworkDisconnectReason) {
263246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_API:
263346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_API";
263446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_GENERIC:
263546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_GENERIC";
263646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_UNWANTED:
263746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_UNWANTED";
263846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_ROAM_WATCHDOG_TIMER:
263946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_ROAM_WATCHDOG_TIMER";
264046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST:
264146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST";
264246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            case StaEvent.DISCONNECT_RESET_SIM_NETWORKS:
264346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_RESET_SIM_NETWORKS";
264446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            default:
264546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                return "DISCONNECT_UNKNOWN=" + frameworkDisconnectReason;
264646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
264746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
264846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
264946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static String configInfoToString(ConfigInfo info) {
265046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        StringBuilder sb = new StringBuilder();
265146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        sb.append("ConfigInfo:")
265246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_key_management=").append(info.allowedKeyManagement)
265346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_protocols=").append(info.allowedProtocols)
265446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_auth_algorithms=").append(info.allowedAuthAlgorithms)
265546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_pairwise_ciphers=").append(info.allowedPairwiseCiphers)
265646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" allowed_group_ciphers=").append(info.allowedGroupCiphers)
265746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" hidden_ssid=").append(info.hiddenSsid)
265846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" is_passpoint=").append(info.isPasspoint)
265946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" is_ephemeral=").append(info.isEphemeral)
266046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" has_ever_connected=").append(info.hasEverConnected)
266146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" scan_rssi=").append(info.scanRssi)
266246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne                .append(" scan_freq=").append(info.scanFreq);
266346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return sb.toString();
266446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
266546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
2666e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    public static final int MAX_STA_EVENTS = 768;
2667d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    private LinkedList<StaEventWithTime> mStaEventList = new LinkedList<StaEventWithTime>();
266846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollRssi = -127;
266946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollLinkSpeed = -1;
267046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private int mLastPollFreq = -1;
2671e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass    private int mLastScore = -1;
267246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne
267346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    /**
267446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     * Converts the first 31 bits of a BitSet to a little endian int
267546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne     */
267646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    private static int bitSetToInt(BitSet bits) {
267746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        int value = 0;
267846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        int nBits = bits.length() < 31 ? bits.length() : 31;
267946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        for (int i = 0; i < nBits; i++) {
268046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne            value += bits.get(i) ? (1 << i) : 0;
268146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        }
268246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne        return value;
268346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne    }
268408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementSsid(SparseIntArray sia, int element) {
268508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_CONNECTABLE_SSID_NETWORK_BUCKET));
268608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
268708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementBssid(SparseIntArray sia, int element) {
268808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_CONNECTABLE_BSSID_NETWORK_BUCKET));
268908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
269008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementTotalScanResults(SparseIntArray sia, int element) {
269108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULTS_BUCKET));
269208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
269308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void incrementTotalScanSsids(SparseIntArray sia, int element) {
269408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET));
269508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
26969831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementTotalPasspointAps(SparseIntArray sia, int element) {
26979831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_APS_BUCKET));
26989831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
26999831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementTotalUniquePasspointEss(SparseIntArray sia, int element) {
27009831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET));
27019831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
27029831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    private void incrementPasspointPerUniqueEss(SparseIntArray sia, int element) {
27039831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen        increment(sia, Math.min(element, MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET));
27049831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen    }
2705973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    private void increment80211mcAps(SparseIntArray sia, int element) {
2706973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen        increment(sia, Math.min(element, MAX_TOTAL_80211MC_APS_BUCKET));
2707973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen    }
270808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    private void increment(SparseIntArray sia, int element) {
270908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        int count = sia.get(element);
271008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne        sia.put(element, count + 1);
271108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne    }
2712d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2713d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    private static class StaEventWithTime {
2714d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public StaEvent staEvent;
2715d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public long wallClockMillis;
2716d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2717d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        StaEventWithTime(StaEvent event, long wallClockMillis) {
2718d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            staEvent = event;
2719d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            this.wallClockMillis = wallClockMillis;
2720d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        }
2721d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne
2722d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        public String toString() {
2723d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            StringBuilder sb = new StringBuilder();
2724d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            Calendar c = Calendar.getInstance();
2725d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            c.setTimeInMillis(wallClockMillis);
2726d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            if (wallClockMillis != 0) {
2727d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c));
2728d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            } else {
2729d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne                sb.append("                  ");
2730d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            }
2731d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            sb.append(" ").append(staEventToString(staEvent));
2732d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne            return sb.toString();
2733d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne        }
2734d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne    }
27351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne}
2736