WifiMetrics.java revision 5f001750a0ce82a8b3a47ac566117d4de27f3e23
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.os.SystemClock; 221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport android.util.Base64; 23c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.Log; 24c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.SparseIntArray; 251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 26f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail; 27f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil; 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; 461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private final Object mLock = new Object(); 472532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private static final int MAX_CONNECTION_EVENTS = 256; 48ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 49ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 50ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics are stored within an instance of the WifiLog proto during runtime, 531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during 541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced 551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * together at dump-time 561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private final WifiMetricsProto.WifiLog mWifiLogProto; 581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Session information that gets logged for every Wifi connection attempt. 601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private final List<ConnectionEvent> mConnectionEventList; 621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The latest started (but un-ended) connection attempt 641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent mCurrentConnectionEvent; 661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode 681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 69c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private SparseIntArray mScanReturnEntries; 701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Mapping of system state to the counts of scans requested in that wifi state * screenOn 721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * combination. Indexed by WifiLog.WifiState * (1 + screenOn) 731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 74c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private SparseIntArray mWifiSystemStateEntries; 751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class RouterFingerPrint { 771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto; 782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne RouterFingerPrint() { 791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint(); 801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType); 861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo); 871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mDtim=" + mRouterFingerPrintProto.dtim); 881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication); 891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mHidden=" + mRouterFingerPrintProto.hidden); 901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology); 911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6); 921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void updateFromWifiConfiguration(WifiConfiguration config) { 96ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 97ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config != null) { 98ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Is this a hidden network 99ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.hidden = config.hiddenSSID; 100ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Config may not have a valid dtimInterval set yet, in which case dtim will be zero 101ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // (These are only populated from beacon frame scan results, which are returned as 102ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // scan results from the chip far less frequently than Probe-responses) 103ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.dtimInterval > 0) { 104ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.dtim = config.dtimInterval; 105ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 106ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConfigSsid = config.SSID; 107ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Get AuthType information from config (We do this again from ScanResult after 108ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // associating with BSSID) 109ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.allowedKeyManagement != null 110ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) { 111ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 112ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 113ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else if (config.isEnterprise()) { 114ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 115ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 116ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else { 117ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 118ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 119ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 120ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // If there's a ScanResult candidate associated with this config already, get it and 121ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // log (more accurate) metrics from it 122ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 123ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (candidate != null) { 124ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(candidate); 125ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 12696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 1272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Log event, tracking the start time, end time and result of a wireless connection attempt. 1331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class ConnectionEvent { 1351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.ConnectionEvent mConnectionEvent; 13696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field 13796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //covering more than just l2 failures. see b/27652362 13896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne /** 13996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot 14096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * more failures than just l2 though, since the proto does not have a place to log 14196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * framework failures) 14296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne */ 1432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // Failure is unknown 14496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_UNKNOWN = 0; 1452532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NONE 14696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NONE = 1; 1472532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // ASSOCIATION_REJECTION_EVENT 14896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ASSOCIATION_REJECTION = 2; 1492532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // AUTHENTICATION_FAILURE_EVENT 15096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_AUTHENTICATION_FAILURE = 3; 1512532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // SSID_TEMP_DISABLED (Also Auth failure) 15296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_SSID_TEMP_DISABLED = 4; 1534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // reconnect() or reassociate() call to WifiNative failed 15496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_CONNECT_NETWORK_FAILED = 5; 1552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NETWORK_DISCONNECTION_EVENT 15696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NETWORK_DISCONNECTION = 6; 1574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // NEW_CONNECTION_ATTEMPT before previous finished 15896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7; 15996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // New connection attempt to the same network & bssid 16096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8; 16196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Roam Watchdog timer triggered (Roaming timed out) 16296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ROAM_TIMEOUT = 9; 16396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // DHCP failure 16496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_DHCP = 10; 16596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne 1664dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne RouterFingerPrint mRouterFingerPrint; 1674dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealStartTime; 1684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealEndTime; 1694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigSsid; 1704dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigBssid; 171ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 172ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 1732532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 1741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent() { 1751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mConnectionEvent = new WifiMetricsProto.ConnectionEvent(); 176947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealEndTime = 0; 177947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealStartTime = 0; 1782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mRouterFingerPrint = new RouterFingerPrint(); 1792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto; 1804dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigSsid = "<NULL>"; 1814dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigBssid = "<NULL>"; 182ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN; 183ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = false; 1841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 1871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 1881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("startTime="); 1891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne Calendar c = Calendar.getInstance(); 1901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 1911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne c.setTimeInMillis(mConnectionEvent.startTimeMillis); 1921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.startTimeMillis == 0 ? " <null>" : 1931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); 1944dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", SSID="); 1954dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigSsid); 1964dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", BSSID="); 1974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigBssid); 1984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", durationMillis="); 1991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.durationTakenToConnectMillis); 2002532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append(", roamType="); 2014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.roamType) { 2022532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 1: 2032532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_NONE"); 2042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 2: 2062532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_DBDC"); 2072532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2082532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 3: 2092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_ENTERPRISE"); 2102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2112532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 4: 2122532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_USER_SELECTED"); 2132532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2142532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 5: 2152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNRELATED"); 2162532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2172532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne default: 2182532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNKNOWN"); 2192532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2204dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", connectionResult="); 2214dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.connectionResult); 2221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", level2FailureCode="); 2234dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.level2FailureCode) { 22496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NONE: 2254dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 2264dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 22796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ASSOCIATION_REJECTION: 2284dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("ASSOCIATION_REJECTION"); 2294dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 23096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_AUTHENTICATION_FAILURE: 2314dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("AUTHENTICATION_FAILURE"); 2324dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 23396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_SSID_TEMP_DISABLED: 2344dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("SSID_TEMP_DISABLED"); 2354dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 23696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_CONNECT_NETWORK_FAILED: 2374dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("CONNECT_NETWORK_FAILED"); 2384dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 23996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NETWORK_DISCONNECTION: 2404dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NETWORK_DISCONNECTION"); 2414dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 24296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NEW_CONNECTION_ATTEMPT: 2434dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NEW_CONNECTION_ATTEMPT"); 2444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 24596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_REDUNDANT_CONNECTION_ATTEMPT: 24696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("REDUNDANT_CONNECTION_ATTEMPT"); 24796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 24896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ROAM_TIMEOUT: 24996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("ROAM_TIMEOUT"); 25096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 25196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_DHCP: 25296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("DHCP"); 2534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 2544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 2554dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 2571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", connectivityLevelFailureCode="); 2584dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.connectivityLevelFailureCode) { 2594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NONE: 2604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 2614dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2624dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_DHCP: 2634dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("DHCP"); 2644dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2654dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET: 2664dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NO_INTERNET"); 2674dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED: 2694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNWANTED"); 2704dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 2724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 2734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 2744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 2754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", signalStrength="); 2764dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.signalStrength); 277ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", wifiState="); 278ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne switch(mWifiState) { 279ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 280ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISABLED"); 281ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 282ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 283ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISCONNECTED"); 284ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 285ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 286ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_ASSOCIATED"); 287ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 288ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne default: 289ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_UNKNOWN"); 290ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 291ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 292ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", screenOn="); 293ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(mScreenOn); 294ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(". mRouterFingerprint: "); 2951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mRouterFingerPrint.toString()); 2961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 2981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 3011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public WifiMetrics() { 3021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto = new WifiMetricsProto.WifiLog(); 3031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mConnectionEventList = new ArrayList<>(); 304c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mScanReturnEntries = new SparseIntArray(); 305c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries = new SparseIntArray(); 3061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mCurrentConnectionEvent = null; 307ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = true; 308ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED; 3091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 311c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Values used for indexing SystemStateEntries 312c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_ON = 1; 313c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_OFF = 0; 314c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 3151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 3161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Create a new connection event. Call when wifi attempts to make a new network connection 3171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity 3181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * failure code. 3191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Gathers and sets the RouterFingerPrint data as well 3201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 321947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne * @param config WifiConfiguration of the config used for the current connection attempt 3221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X 3231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 32496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) { 3251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 32696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Check if this is overlapping another current connection event 32796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent != null) { 32896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //Is this new Connection Event the same as the current one 32996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent.mConfigSsid != null 33096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigBssid != null 33196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && config != null 33296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID) 33396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && (mCurrentConnectionEvent.mConfigBssid.equals("any") 33496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) { 33596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 33696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to the same network 33796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT, 33896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 33996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } else { 34096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to different network 34196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT, 34296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 34396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 34496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 34596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //If past maximum connection events, start removing the oldest 3464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) { 3474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.remove(0); 3484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 3494dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent = new ConnectionEvent(); 3504dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.startTimeMillis = 3514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne System.currentTimeMillis(); 35296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 3534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 3544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config); 35596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = "any"; 3564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mRealStartTime = SystemClock.elapsedRealtime(); 357ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mWifiState = mWifiState; 358ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mScreenOn = mScreenOn; 3594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 3601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 3631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 3642532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * set the RoamType of the current ConnectionEvent (if any) 3652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 3662532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void setConnectionEventRoamType(int roamType) { 367ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 368ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null) { 369ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 370ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 3712532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 3722532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 373f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 374f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne /** 375f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * Set AP related metrics from ScanDetail 376f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne */ 377f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void setConnectionScanDetail(ScanDetail scanDetail) { 378ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 379ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null && scanDetail != null) { 380ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 381ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 382ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //Ensure that we have a networkDetail, and that it corresponds to the currently 383ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //tracked connection attempt 384ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (networkDetail != null && scanResult != null 385ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid != null 386ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid 387ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .equals("\"" + networkDetail.getSSID() + "\"")) { 388ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromNetworkDetail(networkDetail); 389ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(scanResult); 390ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 391f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 392f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 393f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 394f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 3952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 3961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * End a Connection event record. Call when wifi connection attempt succeeds or fails. 3971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If a Connection event has not been started and is active when .end is called, a new one is 3981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * created with zero duration. 3991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 4001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param level2FailureCode Level 2 failure code returned by supplicant 4011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X 4021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 4031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) { 4041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 4052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 4062532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne boolean result = (level2FailureCode == 1) 4072532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE); 4082532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0; 4092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mRealEndTime = SystemClock.elapsedRealtime(); 4102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int) 4112532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne (mCurrentConnectionEvent.mRealEndTime 4122532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne - mCurrentConnectionEvent.mRealStartTime); 4132532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode; 4142532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode = 4152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne connectivityFailureCode; 416f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne // ConnectionEvent already added to ConnectionEvents List. Safe to null current here 4172532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent = null; 4181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 4222b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 4232b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail 4242b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 4252b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) { 4262b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int dtimInterval = networkDetail.getDtimInterval(); 4272b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (dtimInterval > 0) { 4282b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim = 4292b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne dtimInterval; 4302b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4312b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int connectionWifiMode; 4322b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne switch (networkDetail.getWifiMode()) { 4332b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_UNDEFINED: 4342b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN; 4352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11A: 4372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A; 4382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11B: 4402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B; 4412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11G: 4432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G; 4442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11N: 4462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N; 4472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11AC : 4492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC; 4502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne default: 4522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER; 4532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 4542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 4562b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne .routerTechnology = connectionWifiMode; 4572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4582b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 4592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 4602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent RSSI and authentication type from ScanResult 4612b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 4622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromScanResult(ScanResult scanResult) { 4632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level; 4642b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 4652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 46696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID; 4672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (scanResult.capabilities != null) { 4682b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (scanResult.capabilities.contains("WEP")) { 4692b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 4702b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 4712b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } else if (scanResult.capabilities.contains("PSK")) { 4722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 4732b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 4742b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } else if (scanResult.capabilities.contains("EAP")) { 4752b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 4762b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 4772b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4782b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 47996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo = 48096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne scanResult.frequency; 4812b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4822b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 4831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumSavedNetworks(int num) { 4841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 4851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numSavedNetworks = num; 4861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 4891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumOpenNetworks(int num) { 4901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 4911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numOpenNetworks = num; 4921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 4951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumPersonalNetworks(int num) { 4961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 4971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numPersonalNetworks = num; 4981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumEnterpriseNetworks(int num) { 5021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numEnterpriseNetworks = num; 5041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumNetworksAddedByUser(int num) { 5081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNetworksAddedByUser = num; 5101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setNumNetworksAddedByApps(int num) { 5141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNetworksAddedByApps = num; 5161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsLocationEnabled(boolean enabled) { 5201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isLocationEnabled = enabled; 5221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsScanningAlwaysEnabled(boolean enabled) { 5261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isScanningAlwaysEnabled = enabled; 5281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 5321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Non Empty Scan Results count 5331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementNonEmptyScanResultCount() { 535c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount"); 5361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNonEmptyScanResults++; 5381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 5421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Empty Scan Results count 5431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementEmptyScanResultCount() { 545c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementEmptyScanResultCount"); 5461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numEmptyScanResults++; 5481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 552c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Increment background scan count 553c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 554c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementBackgroundScanCount() { 555c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementBackgroundScanCount"); 556c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 557c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numBackgroundScans++; 558c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 559c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 560c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 561c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 562c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get Background scan count 563c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 564c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getBackgroundScanCount() { 565c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 566c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numBackgroundScans; 567c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 568c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 569c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 570c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 57170ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry 572c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 573c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementOneshotScanCount() { 574c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 575c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numOneshotScans++; 576c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 57770ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne incrementWifiSystemScanStateCount(mWifiState, mScreenOn); 578c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 579c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 580c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 581c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get oneshot scan count 582c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 583c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getOneshotScanCount() { 584c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 585c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numOneshotScans; 586c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 588c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 589c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String returnCodeToString(int scanReturnCode) { 590c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(scanReturnCode){ 591c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_UNKNOWN: 592c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_UNKNOWN"; 593c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_SUCCESS: 594c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_SUCCESS"; 595c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED: 596c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INTERRUPTED"; 597c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION: 598c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INVALID_CONFIGURATION"; 599c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED: 600c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "FAILURE_WIFI_DISABLED"; 601c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 602c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "<UNKNOWN>"; 603c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 604c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 605c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 606c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 6071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment count of scan return code occurrence 6081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 6091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X 6101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 611c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) { 6121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 613c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode)); 614c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mScanReturnEntries.get(scanReturnCode); 615c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry += countToAdd; 6161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mScanReturnEntries.put(scanReturnCode, entry); 6171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 619c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 620c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this scanReturnCode 621c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * @param scanReturnCode that we are getting the count for 622c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 623c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getScanReturnEntry(int scanReturnCode) { 624c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 625c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mScanReturnEntries.get(scanReturnCode); 626c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 627c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 628c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 629c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String wifiSystemStateToString(int state) { 630c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(state){ 631c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_UNKNOWN: 632c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_UNKNOWN"; 633c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 634c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISABLED"; 635c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 636c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISCONNECTED"; 637c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 638c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_ASSOCIATED"; 639c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 640c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "default"; 641c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 642c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 6431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 6441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 6451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off 6461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 6471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X 6481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param screenOn Is the screen on 6491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 6501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementWifiSystemScanStateCount(int state, boolean screenOn) { 6511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 652c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) { 653c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state) 654c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + " " + screenOn); 6551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 656c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF); 657c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mWifiSystemStateEntries.get(index); 658c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry++; 659c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.put(index, entry); 660c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 661c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 662c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 663c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 664c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this system State Entry 665c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 666c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getSystemStateCount(int state, boolean screenOn) { 667c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 668c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF); 669c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiSystemStateEntries.get(index); 6701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 673ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 6745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack 6755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 6765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggers() { 6775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 6785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggers++; 6795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 6805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 6815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 6825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad association threshold when watchdog triggered 6835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 6845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) { 6855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 6865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count; 6875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 6885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 6895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 6905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad authentication threshold when watchdog triggered 6915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 6925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) { 6935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 6945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count; 6955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 6965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 6975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 6985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad dhcp threshold when watchdog triggered 6995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) { 7015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count; 7035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad other threshold when watchdog triggered 7075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) { 7095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count; 7115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks seen when watchdog triggered 7155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) { 7175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count; 7195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad association network 7235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAssociation() { 7255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++; 7275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad authentication network 7315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() { 7335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++; 7355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad dhcp network 7395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadDhcp() { 7415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++; 7435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad other network 7475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadOther() { 7495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++; 7515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne 7545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 755ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed pno is working 756ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 757ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoGood() { 758ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 759ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoGood++; 760ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 761ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 762ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 763ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found pno not working 764ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 765ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoBad() { 766ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 767ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoBad++; 768ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 769ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 770ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 771ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed background scan is working 772ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 773ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundGood() { 774ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 775ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundGood++; 776ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 777ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 778ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 779ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found background scan not working 780ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 781ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundBad() { 782ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 783ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundBad++; 784ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 785ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 786ce003b812aead64dcb36647180991150021b24c1Glen Kuhne 78711638f348ba45f9f417928e79b81186cef76c561Glen Kuhne public static final String PROTO_DUMP_ARG = "wifiMetricsProto"; 7881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 7891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager 7901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * at this time 7911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 7921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param fd unused 7931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param pw PrintWriter for writing dump to 7941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param args unused 7951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 7961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 7971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 7981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("WifiMetrics:"); 79911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne if (args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) { 8001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //Dump serialized WifiLog proto 8011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne consolidateProto(true); 8021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 8031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (mCurrentConnectionEvent != event) { 8041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //indicate that automatic bug report has been taken for all valid 8051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //connection events 8061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 8071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 8081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 8091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto); 8101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT); 8111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println(metricsProtoDump); 8121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("EndWifiMetrics"); 8132532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne clear(); 8141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } else { 8151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mConnectionEvents:"); 8161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 8171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String eventLine = event.toString(); 8181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (event == mCurrentConnectionEvent) { 8191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne eventLine += "CURRENTLY OPEN EVENT"; 8201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 8211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println(eventLine); 8221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 8231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks); 8241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks); 8251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworks=" 8261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numPersonalNetworks); 8271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworks=" 8281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numEnterpriseNetworks); 8291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled); 8301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isScanningAlwaysEnabled=" 8311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.isScanningAlwaysEnabled); 832c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByUser=" 833c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByUser); 834c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByApps=" 835c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByApps); 836c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNonEmptyScanResults=" 837c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNonEmptyScanResults); 838c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numEmptyScanResults=" 839c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numEmptyScanResults); 840c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numOneshotScans=" 841c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numOneshotScans); 842c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numBackgroundScans=" 843c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numBackgroundScans); 844c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 845c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mScanReturnEntries:"); 846c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_UNKNOWN: " + getScanReturnEntry( 847c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_UNKNOWN)); 848c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_SUCCESS: " + getScanReturnEntry( 849c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_SUCCESS)); 850c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry( 851c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED)); 852c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry( 853c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION)); 854c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" FAILURE_WIFI_DISABLED: " + getScanReturnEntry( 855c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED)); 856c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 857c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>"); 858c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN ON: " 859c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true)); 860c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED ON: " 861c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true)); 862c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED ON: " 863c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true)); 864c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED ON: " 865c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true)); 866c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN OFF: " 867c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false)); 868c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED OFF: " 869c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false)); 870c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED OFF: " 871c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false)); 872c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED OFF: " 873c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false)); 874ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood=" 875ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoGood); 876ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad=" 877ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoBad); 878ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood=" 879ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundGood); 880ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad=" 881ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundBad); 8825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggers=" 8835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggers); 8845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal=" 8855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal); 8865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal=" 8875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal); 8885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal=" 8895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal); 8905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal=" 8915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal); 8925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal=" 8935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal); 8945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation=" 8955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation); 8965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication=" 8975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication); 8985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp=" 8995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp); 9005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther=" 9015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther); 9021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 9061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 907c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their 908c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * respective lists within mWifiLogProto 9091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 9101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param incremental Only include ConnectionEvents created since last automatic bug report 9111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 9121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private void consolidateProto(boolean incremental) { 9131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>(); 9141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 9151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 916c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // If this is not incremental, dump full ConnectionEvent list 917c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Else Dump all un-dumped events except for the current one 9181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (!incremental || ((mCurrentConnectionEvent != event) 9191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne && !event.mConnectionEvent.automaticBugReportTaken)) { 9201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //Get all ConnectionEvents that haven not been dumped as a proto, also exclude 9211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //the current active un-ended connection event 9221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne events.add(event.mConnectionEvent); 923c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (incremental) { 924c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 925c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 9261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (events.size() > 0) { 9291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent); 9301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 931c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 932c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list 933c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries = 934c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()]; 935c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mScanReturnEntries.size(); i++) { 936c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry(); 937c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i); 938c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i); 939c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 940c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 941c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list 942c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // This one is slightly more complex, as the Sparse are indexed with: 943c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // key: wifiState * 2 + isScreenOn, value: wifiStateCount 944c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries = 945c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog 946c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne .WifiSystemStateEntry[mWifiSystemStateEntries.size()]; 947c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mWifiSystemStateEntries.size(); i++) { 948c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i] = 949c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.WifiSystemStateEntry(); 950c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiState = 951c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.keyAt(i) / 2; 952c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount = 953c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.valueAt(i); 954c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].isScreenOn = 955c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne (mWifiSystemStateEntries.keyAt(i) % 2) > 0; 956c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 9571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 9601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 9611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Serializes all of WifiMetrics to WifiLog proto, and returns the byte array. 9621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Does not count as taking an automatic bug report 9631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 9641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @return byte array of the deserialized & consolidated Proto 9651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 9661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public byte[] toByteArray() { 967ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 968ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne consolidateProto(false); 969ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne return mWifiLogProto.toByteArray(mWifiLogProto); 970ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 9711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9722532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 9732532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 9742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * Clear all WifiMetrics, except for currentConnectionEvent. 9752532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 9762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private void clear() { 9772532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne synchronized (mLock) { 9782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.clear(); 9792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 9802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 9812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 9822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mScanReturnEntries.clear(); 9832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiSystemStateEntries.clear(); 9842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiLogProto.clear(); 9852532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 9862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 987ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 988ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 989ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set screen state (On/Off) 990ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 991ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setScreenState(boolean screenOn) { 992ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 993ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = screenOn; 994ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 995ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 996ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 997ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 998ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED) 999ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 1000ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setWifiState(int wifiState) { 1001ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 1002ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = wifiState; 1003ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1004ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 10051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne} 1006