diff options
3 files changed, 30 insertions, 16 deletions
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 @@ public class MobileDataStateTracker extends NetworkStateTracker { 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 @@ public class MobileDataStateTracker extends NetworkStateTracker { // 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 @@ public class MobileDataStateTracker extends NetworkStateTracker { 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 @@ public class MobileDataStateTracker extends NetworkStateTracker { 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 @@ public class MobileDataStateTracker extends NetworkStateTracker { */ @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..df37d35 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -513,7 +513,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { 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 @@ public class ConnectivityService extends IConnectivityManager.Stub { ++numConnectedNets; } } + if (DBG) Log.d(TAG, "numConnectedNets returning "+numConnectedNets); return numConnectedNets; } @@ -792,7 +794,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { 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 @@ public abstract class DataConnectionTracker extends Handler { 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); + } } } } |