Fix various issues found when testing Mms.

Fix some race conditions (check isTeardownRequested).
Fix the passing of mInterfaceName to subtypes (mms, etc).
Fix the generation of CONNECTED message to already active subtypes.
Fix the enabling of Data in DataConnectionTracker.

bug: 2065037
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index c5d6e11..f9effa2 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -143,8 +143,9 @@
                     boolean unavailable = intent.getBooleanExtra(Phone.NETWORK_UNAVAILABLE_KEY,
                             false);
                     if (DBG) Log.d(TAG, mApnType + " Received " + intent.getAction() +
-                            " broadcast - state = " + state + ", unavailable = " + unavailable +
-                            ", reason = " + (reason == null ? "(unspecified)" : reason));
+                            " broadcast - state = " + state + ", oldstate = " + mMobileDataState +
+                            ", unavailable = " + unavailable + ", reason = " +
+                            (reason == null ? "(unspecified)" : reason));
 
                     if (isApnTypeIncluded(apnTypeList)) {
                         if (mEnabled == false) {
@@ -152,10 +153,12 @@
                             // we should record the interface name if one's provided.  If the user
                             // turns on this network we will need the interfacename but won't get
                             // a fresh connected message - TODO fix this..
-                            if (mInterfaceName == null && state == Phone.DataState.CONNECTED) {
+                            if (state == Phone.DataState.CONNECTED) {
+                                if (DBG) Log.d(TAG, "replacing old mInterfaceName (" +
+                                        mInterfaceName + ") with " +
+                                        intent.getStringExtra(Phone.DATA_IFACE_NAME_KEY) +
+                                        " for " + mApnType);
                                 mInterfaceName = intent.getStringExtra(Phone.DATA_IFACE_NAME_KEY);
-                            } else if (state == Phone.DataState.DISCONNECTED) {
-                                mInterfaceName = null;
                             }
                             if (DBG) Log.d(TAG, "  dropped - mEnabled = false");
                             return;
@@ -179,6 +182,8 @@
                                 if (mInterfaceName != null) {
                                     NetworkUtils.resetConnections(mInterfaceName);
                                 }
+                                if (DBG) Log.d(TAG, "clearing mInterfaceName for "+ mApnType +
+                                        " as it DISCONNECTED");
                                 mInterfaceName = null;
                                 mDefaultGatewayAddr = 0;
                                 break;
@@ -301,6 +306,8 @@
         switch (setEnableApn(mApnType, true)) {
             case Phone.APN_ALREADY_ACTIVE:
                 mEnabled = true;
+                // need to set self to CONNECTING so the below message is handled.
+                mMobileDataState = Phone.DataState.CONNECTING;
                 //send out a connected message
                 Intent intent = new Intent(TelephonyIntents.
                         ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
@@ -412,10 +419,11 @@
      */
     @Override
     public boolean requestRouteToHost(int hostAddress) {
+        if (DBG) {
+            Log.d(TAG, "Requested host route to " + Integer.toHexString(hostAddress) +
+                    " for " + mApnType + "(" + mInterfaceName + ")");
+        }
         if (mInterfaceName != null && hostAddress != -1) {
-            if (DBG) {
-                Log.d(TAG, "Requested host route to " + Integer.toHexString(hostAddress));
-            }
             return NetworkUtils.addHostRoute(mInterfaceName, hostAddress) == 0;
         } else {
             return false;
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 72a1192..df37d35a 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -513,7 +513,8 @@
                     mNetRequestersPids[usedNetworkType].add(currentPid);
                 }
 
-                if (ni.isConnectedOrConnecting() == true) {
+                if ((ni.isConnectedOrConnecting() == true) &&
+                        !network.isTeardownRequested()) {
                     if (ni.isConnected() == true) {
                         // add the pid-specific dns
                         handleDnsConfigurationChange();
@@ -686,6 +687,7 @@
                 ++numConnectedNets;
             }
         }
+        if (DBG) Log.d(TAG, "numConnectedNets returning "+numConnectedNets);
         return numConnectedNets;
     }
 
@@ -792,7 +794,8 @@
                 if (newNet.isAvailable()) {
                     NetworkInfo switchTo = newNet.getNetworkInfo();
                     switchTo.setFailover(true);
-                    if (!switchTo.isConnectedOrConnecting()) {
+                    if (!switchTo.isConnectedOrConnecting() ||
+                            newNet.isTeardownRequested()) {
                         newNet.reconnect();
                     }
                     if (DBG) {
diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
index 29e89b5..cc981c9 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
@@ -456,16 +456,19 @@
         if (dataEnabled[id] != enable) {
             dataEnabled[id] = enable;
 
+            // count the total number of enabled APN's
+            // if we just enabled the first APN, start our Data connection,
+            // if we disabled the last, stop our data connection
             if (enable) {
                 enabledCount++;
+                if (enabledCount == 1) {
+                    setPrivateDataEnabled(true);
+                }
             } else {
                 enabledCount--;
-            }
-
-            if (enabledCount == 0) {
-                setPrivateDataEnabled(false);
-            } else if (enabledCount == 1) {
-                setPrivateDataEnabled(true);
+                if (enabledCount == 0) {
+                    setPrivateDataEnabled(false);
+                }
             }
         }
     }