Merge "DO NOT MERGE Do not kill sockets going default->hipri" into gingerbread
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index 214510d..c34cb2f 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -53,6 +53,10 @@
     private boolean mEnabled;
     private BroadcastReceiver mStateReceiver;
 
+    // DEFAULT and HIPRI are the same connection.  If we're one of these we need to check if
+    // the other is also disconnected before we reset sockets
+    private boolean mIsDefaultOrHipri = false;
+
     /**
      * Create a new MobileDataStateTracker
      * @param context the application context of the caller
@@ -71,6 +75,10 @@
         } else {
             mApnTypeToWatchFor = mApnType;
         }
+        if (netType == ConnectivityManager.TYPE_MOBILE ||
+                netType == ConnectivityManager.TYPE_MOBILE_HIPRI) {
+            mIsDefaultOrHipri = true;
+        }
 
         mPhoneService = null;
         if(netType == ConnectivityManager.TYPE_MOBILE) {
@@ -138,6 +146,7 @@
     }
 
     private class MobileDataStateReceiver extends BroadcastReceiver {
+        ConnectivityManager mConnectivityManager;
         public void onReceive(Context context, Intent intent) {
             synchronized(this) {
                 if (intent.getAction().equals(TelephonyIntents.
@@ -190,7 +199,26 @@
                                 }
 
                                 setDetailedState(DetailedState.DISCONNECTED, reason, apnName);
-                                if (mInterfaceName != null) {
+                                boolean doReset = true;
+                                if (mIsDefaultOrHipri == true) {
+                                    // both default and hipri must go down before we reset
+                                    int typeToCheck = (Phone.APN_TYPE_DEFAULT.equals(mApnType) ?
+                                            ConnectivityManager.TYPE_MOBILE_HIPRI :
+                                            ConnectivityManager.TYPE_MOBILE);
+                                    if (mConnectivityManager == null) {
+                                        mConnectivityManager =
+                                                (ConnectivityManager)context.getSystemService(
+                                                Context.CONNECTIVITY_SERVICE);
+                                    }
+                                    if (mConnectivityManager != null) {
+                                        NetworkInfo info = mConnectivityManager.getNetworkInfo(
+                                                    typeToCheck);
+                                        if (info != null && info.isConnected() == true) {
+                                            doReset = false;
+                                        }
+                                    }
+                                }
+                                if (doReset && mInterfaceName != null) {
                                     NetworkUtils.resetConnections(mInterfaceName);
                                 }
                                 // can't do this here - ConnectivityService needs it to clear stuff