Chromium Code Reviews| Index: net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java |
| diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java |
| index 470c2a434b15fa8c0a96ecfa2cbfff5045b1e32a..ad70b5d537dca27da4576c403ddeacd7bbd7f1d4 100644 |
| --- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java |
| +++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java |
| @@ -30,6 +30,7 @@ import android.util.Log; |
| import org.chromium.base.ThreadUtils; |
| import org.chromium.base.VisibleForTesting; |
| +import org.chromium.base.metrics.RecordHistogram; |
| import java.io.IOException; |
| import java.util.Arrays; |
| @@ -87,13 +88,34 @@ public class NetworkChangeNotifierAutoDetect extends BroadcastReceiver { |
| return getNetworkState(mConnectivityManager.getActiveNetworkInfo()); |
| } |
| + // Fetches NetworkInfo and records UMA for NullPointerExceptions. |
| + private NetworkInfo getNetworkInfo(Network network) { |
| + try { |
| + NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network); |
| + RecordHistogram.recordBooleanHistogram("NCN.getNetInfo1stSuccess", true); |
| + return networkInfo; |
| + } catch (NullPointerException firstException) { |
| + RecordHistogram.recordBooleanHistogram("NCN.getNetInfo1stSuccess", false); |
| + // Try the IPC again to test if the NPE is a random/transient/ephemeral failure. |
| + // This will indicate if retrying is a viable solution. |
| + try { |
| + NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network); |
| + RecordHistogram.recordBooleanHistogram("NCN.getNetInfo2ndSuccess", true); |
| + return networkInfo; |
| + } catch (NullPointerException secondException) { |
| + RecordHistogram.recordBooleanHistogram("NCN.getNetInfo2ndSuccess", false); |
| + throw secondException; |
|
pauljensen
2016/07/18 17:17:22
Helen, I think I may have messed up. If the secon
xunjieli
2016/07/18 17:24:19
Ah, you are right. I didn't realize that RecordHis
|
| + } |
| + } |
| + } |
| + |
| /** |
| * Returns connection type and status information about |network|. |
| * Only callable on Lollipop and newer releases. |
| */ |
| @TargetApi(Build.VERSION_CODES.LOLLIPOP) |
| NetworkState getNetworkState(Network network) { |
| - final NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network); |
| + final NetworkInfo networkInfo = getNetworkInfo(network); |
| if (networkInfo != null && networkInfo.getType() == TYPE_VPN) { |
| // When a VPN is in place the underlying network type can be queried via |
| // getActiveNeworkInfo() thanks to |
| @@ -191,7 +213,7 @@ public class NetworkChangeNotifierAutoDetect extends BroadcastReceiver { |
| final Network[] networks = getAllNetworksFiltered(this, null); |
| int defaultNetId = NetId.INVALID; |
| for (Network network : networks) { |
| - final NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network); |
| + final NetworkInfo networkInfo = getNetworkInfo(network); |
| if (networkInfo != null |
| && (networkInfo.getType() == defaultNetworkInfo.getType() |
| // getActiveNetworkInfo() will not return TYPE_VPN types due to |
| @@ -255,13 +277,34 @@ public class NetworkChangeNotifierAutoDetect extends BroadcastReceiver { |
| return ""; |
| } |
| + // Fetches WifiInfo and records UMA for NullPointerExceptions. |
| + private WifiInfo getWifiInfo() { |
| + try { |
| + WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); |
| + RecordHistogram.recordBooleanHistogram("NCN.getWifiInfo1stSuccess", true); |
| + return wifiInfo; |
| + } catch (NullPointerException firstException) { |
| + RecordHistogram.recordBooleanHistogram("NCN.getWifiInfo1stSuccess", false); |
| + // Try the IPC again to test if the NPE is a random/transient/ephemeral failure. |
| + // This will indicate if retrying is a viable solution. |
| + try { |
| + WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); |
| + RecordHistogram.recordBooleanHistogram("NCN.getWifiInfo2ndSuccess", true); |
| + return wifiInfo; |
| + } catch (NullPointerException secondException) { |
| + RecordHistogram.recordBooleanHistogram("NCN.getWifiInfo2ndSuccess", false); |
| + throw secondException; |
| + } |
| + } |
| + } |
| + |
| /* |
| * Requires ACCESS_WIFI_STATE permission to get the real link speed, else returns |
| * UNKNOWN_LINK_SPEED. |
| */ |
| int getLinkSpeedInMbps() { |
| if (!mHasWifiPermission || mWifiManager == null) return UNKNOWN_LINK_SPEED; |
| - final WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); |
| + final WifiInfo wifiInfo = getWifiInfo(); |
| if (wifiInfo == null) return UNKNOWN_LINK_SPEED; |
| // wifiInfo.getLinkSpeed returns the current wifi linkspeed, which can change even |