WifiMetrics.java revision 59f9a74676831ba4634b35d56a1e2bbe9bf4e322
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 194dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhneimport android.net.wifi.ScanResult; 202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhneimport android.net.wifi.WifiConfiguration; 211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport android.util.Base64; 22c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.Log; 23c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.SparseIntArray; 241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 25f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail; 26f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil; 2759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport com.android.server.wifi.util.ScanResultUtil; 28f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor; 301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter; 311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList; 321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar; 331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List; 341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/** 361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated. 371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include: 381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Aggregated connection stats (num of connections, num of failures, ...) 391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Discrete connection event stats (time, duration, failure codes, ...) 401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Router details (technology type, authentication type, ...) 411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Scan stats 421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics { 441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final String TAG = "WifiMetrics"; 45c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final boolean DBG = false; 467a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 477a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL 487a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 497a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int MAX_RSSI_POLL = 0; 507a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int MIN_RSSI_POLL = -127; 511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private final Object mLock = new Object(); 522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private static final int MAX_CONNECTION_EVENTS = 256; 53107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private Clock mClock; 54ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 55ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics are stored within an instance of the WifiLog proto during runtime, 581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during 591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced 601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * together at dump-time 611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 627a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog(); 631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Session information that gets logged for every Wifi connection attempt. 651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 667a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>(); 671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The latest started (but un-ended) connection attempt 691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent mCurrentConnectionEvent; 711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode 731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 747a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final SparseIntArray mScanReturnEntries = new SparseIntArray(); 751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Mapping of system state to the counts of scans requested in that wifi state * screenOn 771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * combination. Indexed by WifiLog.WifiState * (1 + screenOn) 781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray(); 80f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Mapping of RSSI values to counts. */ 81f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private final SparseIntArray mRssiPollCounts = new SparseIntArray(); 82f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Mapping of alert reason to the respective alert count. */ 83f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray(); 84107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne /** 85107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data 86107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne * capture for for this WifiMetricsProto 87107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne */ 88107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private long mRecordStartTimeSec; 891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class RouterFingerPrint { 911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto; 922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne RouterFingerPrint() { 931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint(); 941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType); 1001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo); 1011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mDtim=" + mRouterFingerPrintProto.dtim); 1021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication); 1031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mHidden=" + mRouterFingerPrintProto.hidden); 1041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology); 1051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6); 1061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 1081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void updateFromWifiConfiguration(WifiConfiguration config) { 110ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 111ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config != null) { 112ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Is this a hidden network 113ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.hidden = config.hiddenSSID; 114ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Config may not have a valid dtimInterval set yet, in which case dtim will be zero 115ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // (These are only populated from beacon frame scan results, which are returned as 116ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // scan results from the chip far less frequently than Probe-responses) 117ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.dtimInterval > 0) { 118ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.dtim = config.dtimInterval; 119ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 120ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConfigSsid = config.SSID; 121ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Get AuthType information from config (We do this again from ScanResult after 122ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // associating with BSSID) 123ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.allowedKeyManagement != null 124ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) { 125ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 126ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 127ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else if (config.isEnterprise()) { 128ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 129ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 130ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else { 131ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 132ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 133ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 13459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 13559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne .passpoint = config.isPasspoint(); 136ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // If there's a ScanResult candidate associated with this config already, get it and 137ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // log (more accurate) metrics from it 138ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 139ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (candidate != null) { 140ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(candidate); 141ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 14296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 1432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1442532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Log event, tracking the start time, end time and result of a wireless connection attempt. 1491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class ConnectionEvent { 1511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.ConnectionEvent mConnectionEvent; 15296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field 15396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //covering more than just l2 failures. see b/27652362 15496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne /** 15596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot 15696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * more failures than just l2 though, since the proto does not have a place to log 15796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * framework failures) 15896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne */ 1592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // Failure is unknown 16096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_UNKNOWN = 0; 1612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NONE 16296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NONE = 1; 1632532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // ASSOCIATION_REJECTION_EVENT 16496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ASSOCIATION_REJECTION = 2; 1652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // AUTHENTICATION_FAILURE_EVENT 16696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_AUTHENTICATION_FAILURE = 3; 1672532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // SSID_TEMP_DISABLED (Also Auth failure) 16896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_SSID_TEMP_DISABLED = 4; 1694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // reconnect() or reassociate() call to WifiNative failed 17096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_CONNECT_NETWORK_FAILED = 5; 1712532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NETWORK_DISCONNECTION_EVENT 17296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NETWORK_DISCONNECTION = 6; 1734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // NEW_CONNECTION_ATTEMPT before previous finished 17496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7; 17596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // New connection attempt to the same network & bssid 17696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8; 17796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Roam Watchdog timer triggered (Roaming timed out) 17896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ROAM_TIMEOUT = 9; 17996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // DHCP failure 18096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_DHCP = 10; 18196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne 1824dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne RouterFingerPrint mRouterFingerPrint; 1834dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealStartTime; 1844dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealEndTime; 1854dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigSsid; 1864dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigBssid; 187ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 188ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 1892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 1901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent() { 1911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mConnectionEvent = new WifiMetricsProto.ConnectionEvent(); 192947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealEndTime = 0; 193947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealStartTime = 0; 1942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mRouterFingerPrint = new RouterFingerPrint(); 1952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto; 1964dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigSsid = "<NULL>"; 1974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigBssid = "<NULL>"; 198ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN; 199ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = false; 2001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 2021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 2031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 2041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("startTime="); 2051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne Calendar c = Calendar.getInstance(); 2061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 2071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne c.setTimeInMillis(mConnectionEvent.startTimeMillis); 2081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.startTimeMillis == 0 ? " <null>" : 2091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); 2104dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", SSID="); 2114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigSsid); 2124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", BSSID="); 2134dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigBssid); 2144dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", durationMillis="); 2151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.durationTakenToConnectMillis); 2162532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append(", roamType="); 2174dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.roamType) { 2182532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 1: 2192532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_NONE"); 2202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2212532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 2: 2222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_DBDC"); 2232532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 3: 2252532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_ENTERPRISE"); 2262532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 4: 2282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_USER_SELECTED"); 2292532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2302532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 5: 2312532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNRELATED"); 2322532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2332532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne default: 2342532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNKNOWN"); 2352532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2364dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", connectionResult="); 2374dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.connectionResult); 2381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", level2FailureCode="); 2394dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.level2FailureCode) { 24096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NONE: 2414dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 2424dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 24396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ASSOCIATION_REJECTION: 2444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("ASSOCIATION_REJECTION"); 2454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 24696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_AUTHENTICATION_FAILURE: 2474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("AUTHENTICATION_FAILURE"); 2484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 24996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_SSID_TEMP_DISABLED: 2504dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("SSID_TEMP_DISABLED"); 2514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 25296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_CONNECT_NETWORK_FAILED: 2534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("CONNECT_NETWORK_FAILED"); 2544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 25596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NETWORK_DISCONNECTION: 2564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NETWORK_DISCONNECTION"); 2574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 25896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NEW_CONNECTION_ATTEMPT: 2594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NEW_CONNECTION_ATTEMPT"); 2604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 26196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_REDUNDANT_CONNECTION_ATTEMPT: 26296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("REDUNDANT_CONNECTION_ATTEMPT"); 26396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 26496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ROAM_TIMEOUT: 26596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("ROAM_TIMEOUT"); 26696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 26796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_DHCP: 26896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("DHCP"); 2694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 2704dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 2714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 2731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", connectivityLevelFailureCode="); 2744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.connectivityLevelFailureCode) { 2754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NONE: 2764dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 2774dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2784dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_DHCP: 2794dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("DHCP"); 2804dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2814dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET: 2824dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NO_INTERNET"); 2834dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2844dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED: 2854dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNWANTED"); 2864dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2874dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 2884dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 2894dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2904dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 2914dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", signalStrength="); 2924dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.signalStrength); 293ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", wifiState="); 294ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne switch(mWifiState) { 295ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 296ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISABLED"); 297ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 298ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 299ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISCONNECTED"); 300ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 301ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 302ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_ASSOCIATED"); 303ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 304ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne default: 305ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_UNKNOWN"); 306ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 307ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 308ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", screenOn="); 309ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(mScreenOn); 310ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(". mRouterFingerprint: "); 3111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mRouterFingerPrint.toString()); 3121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 3141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 317107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne public WifiMetrics(Clock clock) { 318107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mClock = clock; 3191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mCurrentConnectionEvent = null; 320ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = true; 321ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED; 322107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000; 3231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 325c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Values used for indexing SystemStateEntries 326c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_ON = 1; 327c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_OFF = 0; 328c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 3291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 3301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Create a new connection event. Call when wifi attempts to make a new network connection 3311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity 3321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * failure code. 3331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Gathers and sets the RouterFingerPrint data as well 3341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 335947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne * @param config WifiConfiguration of the config used for the current connection attempt 3361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X 3371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 33896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) { 3391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 34096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Check if this is overlapping another current connection event 34196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent != null) { 34296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //Is this new Connection Event the same as the current one 34396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent.mConfigSsid != null 34496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigBssid != null 34596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && config != null 34696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID) 34796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && (mCurrentConnectionEvent.mConfigBssid.equals("any") 34896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) { 34996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 35096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to the same network 35196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT, 35296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 35396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } else { 35496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to different network 35596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT, 35696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 35796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 35896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 35996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //If past maximum connection events, start removing the oldest 3604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) { 3614dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.remove(0); 3624dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 3634dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent = new ConnectionEvent(); 3644dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.startTimeMillis = 365107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mClock.getWallClockMillis(); 36696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 3674dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 3684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config); 36996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = "any"; 370107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis(); 371ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mWifiState = mWifiState; 372ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mScreenOn = mScreenOn; 3734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 3741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 3771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 3782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * set the RoamType of the current ConnectionEvent (if any) 3792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 3802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void setConnectionEventRoamType(int roamType) { 381ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 382ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null) { 383ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 384ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 3852532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 3862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 387f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 388f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne /** 389f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * Set AP related metrics from ScanDetail 390f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne */ 391f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void setConnectionScanDetail(ScanDetail scanDetail) { 392ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 393ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null && scanDetail != null) { 394ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 395ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 396ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //Ensure that we have a networkDetail, and that it corresponds to the currently 397ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //tracked connection attempt 398ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (networkDetail != null && scanResult != null 399ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid != null 400ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid 401ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .equals("\"" + networkDetail.getSSID() + "\"")) { 402ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromNetworkDetail(networkDetail); 403ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(scanResult); 404ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 405f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 406f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 407f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 408f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 4092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 4101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * End a Connection event record. Call when wifi connection attempt succeeds or fails. 4111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If a Connection event has not been started and is active when .end is called, a new one is 4121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * created with zero duration. 4131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 4141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param level2FailureCode Level 2 failure code returned by supplicant 4151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X 4161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 4171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) { 4181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 4192532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 4202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne boolean result = (level2FailureCode == 1) 4212532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE); 4222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0; 423107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis(); 4242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int) 4252532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne (mCurrentConnectionEvent.mRealEndTime 4262532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne - mCurrentConnectionEvent.mRealStartTime); 4272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode; 4282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode = 4292532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne connectivityFailureCode; 430f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne // ConnectionEvent already added to ConnectionEvents List. Safe to null current here 4312532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent = null; 4321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 4362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 4372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail 4382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 4392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) { 4402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int dtimInterval = networkDetail.getDtimInterval(); 4412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (dtimInterval > 0) { 4422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim = 4432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne dtimInterval; 4442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int connectionWifiMode; 4462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne switch (networkDetail.getWifiMode()) { 4472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_UNDEFINED: 4482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN; 4492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11A: 4512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A; 4522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11B: 4542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B; 4552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4562b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11G: 4572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G; 4582b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11N: 4602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N; 4612b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11AC : 4632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC; 4642b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne default: 4662b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER; 4672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4682b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4692b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 4702b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne .routerTechnology = connectionWifiMode; 4712b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 4732b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 4742b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent RSSI and authentication type from ScanResult 4752b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 4762b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromScanResult(ScanResult scanResult) { 4772b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level; 4782b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 4792b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 48096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID; 4812b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (scanResult.capabilities != null) { 48259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) { 4832b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 4842b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 48559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) { 4862b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 4872b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 48859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) { 4892b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 4902b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 4912b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4922b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 49396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo = 49496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne scanResult.frequency; 4952b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4962b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 4971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumSavedNetworks(int num) { 4981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 4991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numSavedNetworks = num; 5001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumOpenNetworks(int num) { 5041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numOpenNetworks = num; 5061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumPersonalNetworks(int num) { 5101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numPersonalNetworks = num; 5121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumEnterpriseNetworks(int num) { 5161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numEnterpriseNetworks = num; 5181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 52159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne void setNumHiddenNetworks(int num) { 52259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne synchronized (mLock) { 52359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHiddenNetworks = num; 52459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 52559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 52659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 52759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne void setNumPasspointNetworks(int num) { 52859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne synchronized (mLock) { 52959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numPasspointNetworks = num; 53059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 53159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 53259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 5331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumNetworksAddedByUser(int num) { 5341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNetworksAddedByUser = num; 5361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumNetworksAddedByApps(int num) { 5401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNetworksAddedByApps = num; 5421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsLocationEnabled(boolean enabled) { 5461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isLocationEnabled = enabled; 5481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsScanningAlwaysEnabled(boolean enabled) { 5521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isScanningAlwaysEnabled = enabled; 5541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 5581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Non Empty Scan Results count 5591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementNonEmptyScanResultCount() { 561c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount"); 5621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNonEmptyScanResults++; 5641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 5681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Empty Scan Results count 5691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementEmptyScanResultCount() { 571c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementEmptyScanResultCount"); 5721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numEmptyScanResults++; 5741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 578c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Increment background scan count 579c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 580c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementBackgroundScanCount() { 581c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementBackgroundScanCount"); 582c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 583c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numBackgroundScans++; 584c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 585c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 586c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 588c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get Background scan count 589c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 590c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getBackgroundScanCount() { 591c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 592c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numBackgroundScans; 593c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 594c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 595c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 596c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 59770ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry 598c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 599c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementOneshotScanCount() { 600c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 601c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numOneshotScans++; 602c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 60370ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne incrementWifiSystemScanStateCount(mWifiState, mScreenOn); 604c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 605c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 606c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 607c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get oneshot scan count 608c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 609c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getOneshotScanCount() { 610c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 611c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numOneshotScans; 612c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 613c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 614c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 615c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String returnCodeToString(int scanReturnCode) { 616c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(scanReturnCode){ 617c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_UNKNOWN: 618c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_UNKNOWN"; 619c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_SUCCESS: 620c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_SUCCESS"; 621c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED: 622c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INTERRUPTED"; 623c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION: 624c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INVALID_CONFIGURATION"; 625c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED: 626c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "FAILURE_WIFI_DISABLED"; 627c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 628c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "<UNKNOWN>"; 629c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 630c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 631c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 632c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 6331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment count of scan return code occurrence 6341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 6351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X 6361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 637c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) { 6381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 639c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode)); 640c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mScanReturnEntries.get(scanReturnCode); 641c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry += countToAdd; 6421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mScanReturnEntries.put(scanReturnCode, entry); 6431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 645c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 646c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this scanReturnCode 647c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * @param scanReturnCode that we are getting the count for 648c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 649c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getScanReturnEntry(int scanReturnCode) { 650c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 651c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mScanReturnEntries.get(scanReturnCode); 652c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 653c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 654c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 655c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String wifiSystemStateToString(int state) { 656c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(state){ 657c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_UNKNOWN: 658c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_UNKNOWN"; 659c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 660c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISABLED"; 661c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 662c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISCONNECTED"; 663c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 664c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_ASSOCIATED"; 665c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 666c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "default"; 667c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 668c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 6691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 6701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 6711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off 6721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 6731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X 6741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param screenOn Is the screen on 6751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 6761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementWifiSystemScanStateCount(int state, boolean screenOn) { 6771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 678c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) { 679c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state) 680c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + " " + screenOn); 6811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 682c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF); 683c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mWifiSystemStateEntries.get(index); 684c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry++; 685c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.put(index, entry); 686c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 687c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 688c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 689c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 690c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this system State Entry 691c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 692c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getSystemStateCount(int state, boolean screenOn) { 693c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 694c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF); 695c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiSystemStateEntries.get(index); 6961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 699ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 7005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack 7015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggers() { 7035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggers++; 7055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad association threshold when watchdog triggered 7095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) { 7115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count; 7135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad authentication threshold when watchdog triggered 7175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) { 7195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count; 7215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad dhcp threshold when watchdog triggered 7255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) { 7275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count; 7295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad other threshold when watchdog triggered 7335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) { 7355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count; 7375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks seen when watchdog triggered 7415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) { 7435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count; 7455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad association network 7495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAssociation() { 7515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++; 7535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad authentication network 7575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() { 7595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++; 7615f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7625f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7635f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7645f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad dhcp network 7655f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7665f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadDhcp() { 7675f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7685f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++; 7695f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7705f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7715f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad other network 7735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadOther() { 7755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++; 7775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne 7805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 781ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed pno is working 782ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 783ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoGood() { 784ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 785ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoGood++; 786ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 787ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 788ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 789ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found pno not working 790ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 791ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoBad() { 792ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 793ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoBad++; 794ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 795ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 796ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 797ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed background scan is working 798ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 799ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundGood() { 800ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 801ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundGood++; 802ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 803ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 804ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 805ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found background scan not working 806ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 807ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundBad() { 808ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 809ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundBad++; 810ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 811ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 812ce003b812aead64dcb36647180991150021b24c1Glen Kuhne 8137a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 8147a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Increment occurence count of RSSI level from RSSI poll. 8157a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Ignores rssi values outside the bounds of [MIN_RSSI_POLL, MAX_RSSI_POLL] 8167a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 8177a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne public void incrementRssiPollRssiCount(int rssi) { 8187a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) { 8197a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne return; 8207a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 8217a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne synchronized (mLock) { 8227a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne int count = mRssiPollCounts.get(rssi); 8237a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mRssiPollCounts.put(rssi, count + 1); 8247a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 8257a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 8267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne 827da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne /** 828f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * Increments the count of alerts by alert reason. 829f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * 830f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * @param reason The cause of the alert. The reason values are driver-specific. 831f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal */ 832f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal public void incrementAlertReasonCount(int reason) { 833f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX 834f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) { 835f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED; 836f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 837f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal synchronized (mLock) { 838f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal int alertCount = mWifiAlertReasonCounts.get(reason); 839f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiAlertReasonCounts.put(reason, alertCount + 1); 840f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 841f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 842f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 843f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** 84459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne * Counts all the different types of networks seen in a set of scan results 84559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne */ 84659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne public void countScanResults(List<ScanDetail> scanDetails) { 84759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (scanDetails == null) { 84859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne return; 84959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 85059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int totalResults = 0; 85159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int openNetworks = 0; 85259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int personalNetworks = 0; 85359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int enterpriseNetworks = 0; 85459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hiddenNetworks = 0; 85559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hotspot2r1Networks = 0; 85659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hotspot2r2Networks = 0; 85759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne for (ScanDetail scanDetail : scanDetails) { 85859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 85959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 86059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne totalResults++; 86159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail != null) { 86259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.isHiddenBeaconFrame()) { 86359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hiddenNetworks++; 86459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 86559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.getHSRelease() != null) { 86659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) { 86759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hotspot2r1Networks++; 86859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) { 86959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hotspot2r2Networks++; 87059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 87159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 87259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 87359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (scanResult != null && scanResult.capabilities != null) { 87459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) { 87559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne enterpriseNetworks++; 87659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult) 87759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne || ScanResultUtil.isScanResultForWepNetwork(scanResult)) { 87859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne personalNetworks++; 87959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else { 88059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne openNetworks++; 88159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 88259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 88359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 88459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne synchronized (mLock) { 88559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numTotalScanResults += totalResults; 88659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numOpenNetworkScanResults += openNetworks; 88759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numPersonalNetworkScanResults += personalNetworks; 88859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks; 88959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks; 89059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks; 89159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks; 89259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numScans++; 89359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 89459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 89559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 89659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne /** 897da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne * Increment count of Watchdog successes. 898da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne */ 899da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne public void incrementNumLastResortWatchdogSuccesses() { 900da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne synchronized (mLock) { 901da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne mWifiLogProto.numLastResortWatchdogSuccesses++; 902da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne } 903da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne } 904da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne 90559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 90611638f348ba45f9f417928e79b81186cef76c561Glen Kuhne public static final String PROTO_DUMP_ARG = "wifiMetricsProto"; 9071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 9081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager 9091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * at this time 9101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 9111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param fd unused 9121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param pw PrintWriter for writing dump to 9131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param args unused 9141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 9151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 9161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 9171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("WifiMetrics:"); 91811638f348ba45f9f417928e79b81186cef76c561Glen Kuhne if (args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) { 9191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //Dump serialized WifiLog proto 9201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne consolidateProto(true); 9211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 9221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (mCurrentConnectionEvent != event) { 9231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //indicate that automatic bug report has been taken for all valid 9241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //connection events 9251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 9261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto); 9291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT); 9301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println(metricsProtoDump); 9311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("EndWifiMetrics"); 9322532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne clear(); 9331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } else { 9341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mConnectionEvents:"); 9351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 9361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String eventLine = event.toString(); 9371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (event == mCurrentConnectionEvent) { 9381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne eventLine += "CURRENTLY OPEN EVENT"; 9391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println(eventLine); 9411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks); 9431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks); 9441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworks=" 9451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numPersonalNetworks); 9461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworks=" 9471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numEnterpriseNetworks); 94859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks); 94959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numPasspointNetworks=" 95059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numPasspointNetworks); 9511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled); 9521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isScanningAlwaysEnabled=" 9531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.isScanningAlwaysEnabled); 954c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByUser=" 955c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByUser); 956c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByApps=" 957c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByApps); 958c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNonEmptyScanResults=" 959c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNonEmptyScanResults); 960c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numEmptyScanResults=" 961c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numEmptyScanResults); 962c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numOneshotScans=" 963c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numOneshotScans); 964c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numBackgroundScans=" 965c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numBackgroundScans); 966c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 967c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mScanReturnEntries:"); 968c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_UNKNOWN: " + getScanReturnEntry( 969c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_UNKNOWN)); 970c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_SUCCESS: " + getScanReturnEntry( 971c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_SUCCESS)); 972c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry( 973c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED)); 974c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry( 975c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION)); 976c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" FAILURE_WIFI_DISABLED: " + getScanReturnEntry( 977c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED)); 978c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 979c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>"); 980c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN ON: " 981c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true)); 982c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED ON: " 983c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true)); 984c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED ON: " 985c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true)); 986c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED ON: " 987c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true)); 988c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN OFF: " 989c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false)); 990c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED OFF: " 991c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false)); 992c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED OFF: " 993c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false)); 994c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED OFF: " 995c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false)); 996ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood=" 997ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoGood); 998ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad=" 999ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoBad); 1000ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood=" 1001ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundGood); 1002ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad=" 1003ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundBad); 10045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggers=" 10055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggers); 10065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal=" 10075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal); 10085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal=" 10095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal); 10105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal=" 10115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal); 10125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal=" 10135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal); 10145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal=" 10155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal); 10165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation=" 10175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation); 10185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication=" 10195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication); 10205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp=" 10215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp); 10225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther=" 10235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther); 1024da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogSuccesses=" 1025da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne + mWifiLogProto.numLastResortWatchdogSuccesses); 1026107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne pw.println("mWifiLogProto.recordDurationSec=" 1027107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec)); 10287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne pw.println("mWifiLogProto.rssiPollRssiCount: Printing counts for [" + MIN_RSSI_POLL 10297a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne + ", " + MAX_RSSI_POLL + "]"); 10307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne StringBuilder sb = new StringBuilder(); 10317a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) { 10327a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne sb.append(mRssiPollCounts.get(i) + " "); 10337a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 10347a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne pw.println(" " + sb.toString()); 1035f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.print("mWifiLogProto.alertReasonCounts="); 1036f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.setLength(0); 1037f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN; 1038f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) { 1039f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal int count = mWifiAlertReasonCounts.get(i); 1040f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (count > 0) { 1041f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.append("(" + i + "," + count + "),"); 1042f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1043f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1044f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (sb.length() > 1) { 1045f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.setLength(sb.length() - 1); // strip trailing comma 1046f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.println(sb.toString()); 1047f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } else { 1048f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.println("()"); 1049f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 105059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numTotalScanResults=" 105159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numTotalScanResults); 105259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numOpenNetworkScanResults=" 105359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numOpenNetworkScanResults); 105459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworkScanResults=" 105559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numPersonalNetworkScanResults); 105659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworkScanResults=" 105759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numEnterpriseNetworkScanResults); 105859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHiddenNetworkScanResults=" 105959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHiddenNetworkScanResults); 106059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults=" 106159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHotspot2R1NetworkScanResults); 106259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults=" 106359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHotspot2R2NetworkScanResults); 106459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans); 10651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 10691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1070c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their 1071c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * respective lists within mWifiLogProto 10721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 10731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param incremental Only include ConnectionEvents created since last automatic bug report 10741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 10751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private void consolidateProto(boolean incremental) { 10761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>(); 10777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>(); 1078f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>(); 10791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 10801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 1081c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // If this is not incremental, dump full ConnectionEvent list 1082c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Else Dump all un-dumped events except for the current one 10831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (!incremental || ((mCurrentConnectionEvent != event) 10841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne && !event.mConnectionEvent.automaticBugReportTaken)) { 10851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //Get all ConnectionEvents that haven not been dumped as a proto, also exclude 10861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //the current active un-ended connection event 10871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne events.add(event.mConnectionEvent); 1088c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (incremental) { 1089c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 1090c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 10911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (events.size() > 0) { 10941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent); 10951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1096c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1097c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list 1098c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries = 1099c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()]; 1100c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mScanReturnEntries.size(); i++) { 1101c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry(); 1102c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i); 1103c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i); 1104c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 1105c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1106c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list 1107c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // This one is slightly more complex, as the Sparse are indexed with: 1108c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // key: wifiState * 2 + isScreenOn, value: wifiStateCount 1109c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries = 1110c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog 1111c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne .WifiSystemStateEntry[mWifiSystemStateEntries.size()]; 1112c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mWifiSystemStateEntries.size(); i++) { 1113c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i] = 1114c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.WifiSystemStateEntry(); 1115c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiState = 1116c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.keyAt(i) / 2; 1117c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount = 1118c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.valueAt(i); 1119c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].isScreenOn = 1120c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne (mWifiSystemStateEntries.keyAt(i) % 2) > 0; 1121c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 1122107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000) 1123107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne - mRecordStartTimeSec); 11247a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne 11257a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 11267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Convert the SparseIntArray of RSSI poll rssi's and counts to the proto's repeated 11277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * IntKeyVal array. 11287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 11297a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = 0; i < mRssiPollCounts.size(); i++) { 11307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount(); 11317a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne keyVal.rssi = mRssiPollCounts.keyAt(i); 11327a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne keyVal.count = mRssiPollCounts.valueAt(i); 11337a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne rssis.add(keyVal); 11347a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 11357a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount); 1136f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 1137f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** 1138f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * Convert the SparseIntArray of alert reasons and counts to the proto's repeated 1139f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * IntKeyVal array. 1140f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal */ 1141f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) { 1142f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount(); 1143f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal keyVal.reason = mWifiAlertReasonCounts.keyAt(i); 1144f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal keyVal.count = mWifiAlertReasonCounts.valueAt(i); 1145f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal alertReasons.add(keyVal); 1146f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1147f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount); 1148ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 11491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 11502532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 11512532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 11522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * Clear all WifiMetrics, except for currentConnectionEvent. 11532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 11542532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private void clear() { 11552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne synchronized (mLock) { 11562532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.clear(); 11572532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 11582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 11592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 11602532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mScanReturnEntries.clear(); 11612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiSystemStateEntries.clear(); 1162107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000; 11637a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mRssiPollCounts.clear(); 1164f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiAlertReasonCounts.clear(); 11652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiLogProto.clear(); 11662532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 11672532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1168ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 1169ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 1170ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set screen state (On/Off) 1171ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 1172ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setScreenState(boolean screenOn) { 1173ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 1174ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = screenOn; 1175ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1176ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1177ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 1178ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 1179ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED) 1180ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 1181ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setWifiState(int wifiState) { 1182ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 1183ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = wifiState; 1184ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1185ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 11861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne} 1187