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