OSDN Git Service

Update networktype before sending state change.
authorRobert Greenwalt <rgreenwalt@google.com>
Wed, 26 Jan 2011 18:45:10 +0000 (10:45 -0800)
committerRobert Greenwalt <rgreenwalt@google.com>
Wed, 26 Jan 2011 21:39:46 +0000 (13:39 -0800)
Fixes potential race condition in network-type info.  May fix this issue.

bug:3376930
Change-Id: I3d5fd7c76e54923b62c56defa947be3c9c1cd585

core/java/android/net/MobileDataStateTracker.java
core/java/android/net/NetworkStateTracker.java

index ffbd69d..b559601 100644 (file)
@@ -149,6 +149,11 @@ public class MobileDataStateTracker extends NetworkStateTracker {
         ConnectivityManager mConnectivityManager;
         public void onReceive(Context context, Intent intent) {
             synchronized(this) {
+                // update state and roaming before we set the state - only state changes are
+                // noticed
+                TelephonyManager tm = TelephonyManager.getDefault();
+                setRoamingStatus(tm.isNetworkRoaming());
+                setSubtype(tm.getNetworkType(), tm.getNetworkTypeName());
                 if (intent.getAction().equals(TelephonyIntents.
                         ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
                     Phone.DataState state = getMobileDataState(intent);
@@ -254,9 +259,6 @@ public class MobileDataStateTracker extends NetworkStateTracker {
                             reason == null ? "" : "(" + reason + ")");
                     setDetailedState(DetailedState.FAILED, reason, apnName);
                 }
-                TelephonyManager tm = TelephonyManager.getDefault();
-                setRoamingStatus(tm.isNetworkRoaming());
-                setSubtype(tm.getNetworkType(), tm.getNetworkTypeName());
             }
         }
     }
index d340a99..039dfff 100644 (file)
@@ -302,7 +302,7 @@ public abstract class NetworkStateTracker extends Handler {
     public boolean isTeardownRequested() {
         return mTeardownRequested;
     }
-    
+
     /**
      * Send a  notification that the results of a scan for network access
      * points has completed, and results are available.
@@ -327,10 +327,10 @@ public abstract class NetworkStateTracker extends Handler {
     }
 
     protected void setSubtype(int subtype, String subtypeName) {
-        if (mNetworkInfo.isConnected()) {
-            int oldSubtype = mNetworkInfo.getSubtype();
-            if (subtype != oldSubtype) {
-                mNetworkInfo.setSubtype(subtype, subtypeName);
+        int oldSubtype = mNetworkInfo.getSubtype();
+        if (subtype != oldSubtype) {
+            mNetworkInfo.setSubtype(subtype, subtypeName);
+            if (mNetworkInfo.isConnected()) {
                 Message msg = mTarget.obtainMessage(
                         EVENT_NETWORK_SUBTYPE_CHANGED, oldSubtype, 0, mNetworkInfo);
                 msg.sendToTarget();