diff options
author | pauljensen <pauljensen@chromium.org> | 2014-11-25 08:21:47 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-25 16:23:09 +0000 |
commit | 844146e0a3b0c614b4c8dabe9a910feb6d482afb (patch) | |
tree | 96a03df3288d9761ac1b96416858284a89b01af4 /net/android | |
parent | 0da5d4400a7f45a8c2b868140ebe383e8f20e539 (diff) | |
download | chromium_src-844146e0a3b0c614b4c8dabe9a910feb6d482afb.zip chromium_src-844146e0a3b0c614b4c8dabe9a910feb6d482afb.tar.gz chromium_src-844146e0a3b0c614b4c8dabe9a910feb6d482afb.tar.bz2 |
Fix races resulting in NullPointerException in Android NetworkChangeNotifier.
The old code relied on calls to ConnectivityManager.getActiveNetworkInfo()
returning the same result over a short period of time.
Review URL: https://codereview.chromium.org/750563003
Cr-Commit-Position: refs/heads/master@{#305651}
Diffstat (limited to 'net/android')
-rw-r--r-- | net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java | 53 | ||||
-rw-r--r-- | net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java | 20 |
2 files changed, 38 insertions, 35 deletions
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java index 9f69867..ec86b69 100644 --- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java +++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java @@ -9,6 +9,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.telephony.TelephonyManager; @@ -25,6 +26,30 @@ import org.chromium.base.ApplicationStatus; public class NetworkChangeNotifierAutoDetect extends BroadcastReceiver implements ApplicationStatus.ApplicationStateListener { + static class NetworkState { + private final boolean mConnected; + private final int mType; + private final int mSubtype; + + public NetworkState(boolean connected, int type, int subtype) { + mConnected = connected; + mType = type; + mSubtype = subtype; + } + + public boolean isConnected() { + return mConnected; + } + + public int getNetworkType() { + return mType; + } + + public int getNetworkSubType() { + return mSubtype; + } + } + /** Queries the ConnectivityManager for information about the current connection. */ static class ConnectivityManagerDelegate { private final ConnectivityManager mConnectivityManager; @@ -40,20 +65,12 @@ public class NetworkChangeNotifierAutoDetect extends BroadcastReceiver mConnectivityManager = null; } - boolean activeNetworkExists() { - return mConnectivityManager.getActiveNetworkInfo() != null; - } - - boolean isConnected() { - return mConnectivityManager.getActiveNetworkInfo().isConnected(); - } - - int getNetworkType() { - return mConnectivityManager.getActiveNetworkInfo().getType(); - } - - int getNetworkSubtype() { - return mConnectivityManager.getActiveNetworkInfo().getSubtype(); + NetworkState getNetworkState() { + final NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo(); + if (networkInfo == null || !networkInfo.isConnected()) { + return new NetworkState(false, -1, -1); + } + return new NetworkState(true, networkInfo.getType(), networkInfo.getSubtype()); } } @@ -168,12 +185,12 @@ public class NetworkChangeNotifierAutoDetect extends BroadcastReceiver public int getCurrentConnectionType() { // Track exactly what type of connection we have. - if (!mConnectivityManagerDelegate.activeNetworkExists() - || !mConnectivityManagerDelegate.isConnected()) { + final NetworkState networkState = mConnectivityManagerDelegate.getNetworkState(); + if (!networkState.isConnected()) { return NetworkChangeNotifier.CONNECTION_NONE; } - switch (mConnectivityManagerDelegate.getNetworkType()) { + switch (networkState.getNetworkType()) { case ConnectivityManager.TYPE_ETHERNET: return NetworkChangeNotifier.CONNECTION_ETHERNET; case ConnectivityManager.TYPE_WIFI: @@ -184,7 +201,7 @@ public class NetworkChangeNotifierAutoDetect extends BroadcastReceiver return NetworkChangeNotifier.CONNECTION_BLUETOOTH; case ConnectivityManager.TYPE_MOBILE: // Use information from TelephonyManager to classify the connection. - switch (mConnectivityManagerDelegate.getNetworkSubtype()) { + switch (networkState.getNetworkSubType()) { case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_CDMA: diff --git a/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java b/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java index 887bc3b..dd15a76 100644 --- a/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java +++ b/net/android/javatests/src/org/chromium/net/NetworkChangeNotifierTest.java @@ -14,6 +14,7 @@ import android.test.suitebuilder.annotation.MediumTest; import org.chromium.base.ApplicationState; import org.chromium.base.test.util.Feature; +import org.chromium.net.NetworkChangeNotifierAutoDetect.NetworkState; /** * Tests for org.chromium.net.NetworkChangeNotifier. @@ -50,33 +51,18 @@ public class NetworkChangeNotifierTest extends InstrumentationTestCase { private int mNetworkSubtype; @Override - boolean activeNetworkExists() { - return mActiveNetworkExists; - } - - @Override - boolean isConnected() { - return getNetworkType() != NetworkChangeNotifier.CONNECTION_NONE; + NetworkState getNetworkState() { + return new NetworkState(mActiveNetworkExists, mNetworkType, mNetworkSubtype); } void setActiveNetworkExists(boolean networkExists) { mActiveNetworkExists = networkExists; } - @Override - int getNetworkType() { - return mNetworkType; - } - void setNetworkType(int networkType) { mNetworkType = networkType; } - @Override - int getNetworkSubtype() { - return mNetworkSubtype; - } - void setNetworkSubtype(int networkSubtype) { mNetworkSubtype = networkSubtype; } |