diff options
| -rw-r--r-- | core/java/android/net/ConnectivityManager.java | 63 | ||||
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 58 |
2 files changed, 64 insertions, 57 deletions
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 2e24785..9194ca8 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -25,6 +25,7 @@ import android.content.Intent; import android.net.NetworkUtils; import android.os.Binder; import android.os.Build.VERSION_CODES; +import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -2147,50 +2148,57 @@ public class ConnectivityManager { Log.d(TAG, "CM callback handler got msg " + message.what); switch (message.what) { case CALLBACK_PRECHECK: { - NetworkRequest request = getNetworkRequest(message); + NetworkRequest request = (NetworkRequest)getObject(message, + NetworkRequest.class); NetworkCallback callbacks = getCallbacks(request); if (callbacks != null) { - callbacks.onPreCheck(getNetwork(message)); + callbacks.onPreCheck((Network)getObject(message, Network.class)); } else { Log.e(TAG, "callback not found for PRECHECK message"); } break; } case CALLBACK_AVAILABLE: { - NetworkRequest request = getNetworkRequest(message); + NetworkRequest request = (NetworkRequest)getObject(message, + NetworkRequest.class); NetworkCallback callbacks = getCallbacks(request); if (callbacks != null) { - callbacks.onAvailable(getNetwork(message)); + callbacks.onAvailable((Network)getObject(message, Network.class)); } else { Log.e(TAG, "callback not found for AVAILABLE message"); } break; } case CALLBACK_LOSING: { - NetworkRequest request = getNetworkRequest(message); + NetworkRequest request = (NetworkRequest)getObject(message, + NetworkRequest.class); NetworkCallback callbacks = getCallbacks(request); if (callbacks != null) { - callbacks.onLosing(getNetwork(message), message.arg1); + callbacks.onLosing((Network)getObject(message, Network.class), + message.arg1); } else { Log.e(TAG, "callback not found for LOSING message"); } break; } case CALLBACK_LOST: { - NetworkRequest request = getNetworkRequest(message); + NetworkRequest request = (NetworkRequest)getObject(message, + NetworkRequest.class); + NetworkCallback callbacks = getCallbacks(request); if (callbacks != null) { - callbacks.onLost(getNetwork(message)); + callbacks.onLost((Network)getObject(message, Network.class)); } else { Log.e(TAG, "callback not found for LOST message"); } break; } case CALLBACK_UNAVAIL: { - NetworkRequest req = (NetworkRequest)message.obj; + NetworkRequest request = (NetworkRequest)getObject(message, + NetworkRequest.class); NetworkCallback callbacks = null; synchronized(mCallbackMap) { - callbacks = mCallbackMap.get(req); + callbacks = mCallbackMap.get(request); } if (callbacks != null) { callbacks.onUnavailable(); @@ -2200,33 +2208,37 @@ public class ConnectivityManager { break; } case CALLBACK_CAP_CHANGED: { - NetworkRequest request = getNetworkRequest(message); + NetworkRequest request = (NetworkRequest)getObject(message, + NetworkRequest.class); NetworkCallback callbacks = getCallbacks(request); if (callbacks != null) { - Network network = getNetwork(message); - NetworkCapabilities cap = mCm.getNetworkCapabilities(network); + Network network = (Network)getObject(message, Network.class); + NetworkCapabilities cap = (NetworkCapabilities)getObject(message, + NetworkCapabilities.class); callbacks.onCapabilitiesChanged(network, cap); } else { - Log.e(TAG, "callback not found for CHANGED message"); + Log.e(TAG, "callback not found for CAP_CHANGED message"); } break; } case CALLBACK_IP_CHANGED: { - NetworkRequest request = getNetworkRequest(message); + NetworkRequest request = (NetworkRequest)getObject(message, + NetworkRequest.class); NetworkCallback callbacks = getCallbacks(request); if (callbacks != null) { - Network network = getNetwork(message); - LinkProperties lp = mCm.getLinkProperties(network); + Network network = (Network)getObject(message, Network.class); + LinkProperties lp = (LinkProperties)getObject(message, + LinkProperties.class); callbacks.onLinkPropertiesChanged(network, lp); } else { - Log.e(TAG, "callback not found for CHANGED message"); + Log.e(TAG, "callback not found for IP_CHANGED message"); } break; } case CALLBACK_RELEASED: { - NetworkRequest req = (NetworkRequest)message.obj; + NetworkRequest req = (NetworkRequest)getObject(message, NetworkRequest.class); NetworkCallback callbacks = null; synchronized(mCallbackMap) { callbacks = mCallbackMap.remove(req); @@ -2254,23 +2266,14 @@ public class ConnectivityManager { } } - private NetworkRequest getNetworkRequest(Message msg) { - return (NetworkRequest)(msg.obj); + private Object getObject(Message msg, Class c) { + return msg.getData().getParcelable(c.getSimpleName()); } private NetworkCallback getCallbacks(NetworkRequest req) { synchronized(mCallbackMap) { return mCallbackMap.get(req); } } - private Network getNetwork(Message msg) { - return new Network(msg.arg2); - } - private NetworkCallback removeCallbacks(Message msg) { - NetworkRequest req = (NetworkRequest)msg.obj; - synchronized(mCallbackMap) { - return mCallbackMap.remove(req); - } - } } private void incCallbackHandlerRefCount() { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 39e5540..3dab17f 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -90,6 +90,7 @@ import android.net.wimax.WimaxManagerConstants; import android.os.AsyncTask; import android.os.Binder; import android.os.Build; +import android.os.Bundle; import android.os.FileUtils; import android.os.Handler; import android.os.HandlerThread; @@ -171,6 +172,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Random; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -3561,6 +3563,10 @@ public class ConnectivityService extends IConnectivityManager.Stub { updateDnses(newLp, oldLp, netId, flushDns); updateClat(newLp, oldLp, networkAgent); if (isDefaultNetwork(networkAgent)) handleApplyDefaultProxy(newLp.getHttpProxy()); + // TODO - move this check to cover the whole function + if (!Objects.equals(newLp, oldLp)) { + notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED); + } } private void updateClat(LinkProperties newLp, LinkProperties oldLp, NetworkAgentInfo na) { @@ -3698,10 +3704,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { private void updateCapabilities(NetworkAgentInfo networkAgent, NetworkCapabilities networkCapabilities) { - // TODO - what else here? Verify still satisfies everybody? - // Check if satisfies somebody new? call callbacks? - synchronized (networkAgent) { - networkAgent.networkCapabilities = networkCapabilities; + // TODO - turn this on in MR1 when we have more dogfooding time. + // rematchAllNetworksAndRequests(); + if (!Objects.equals(networkAgent.networkCapabilities, networkCapabilities)) { + synchronized (networkAgent) { + networkAgent.networkCapabilities = networkCapabilities; + } + notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_CAP_CHANGED); } } @@ -3725,37 +3734,32 @@ public class ConnectivityService extends IConnectivityManager.Stub { private void callCallbackForRequest(NetworkRequestInfo nri, NetworkAgentInfo networkAgent, int notificationType) { if (nri.messenger == null) return; // Default request has no msgr - Object o; - int a1 = 0; - int a2 = 0; + Bundle bundle = new Bundle(); + bundle.putParcelable(NetworkRequest.class.getSimpleName(), + new NetworkRequest(nri.request)); + Message msg = Message.obtain(); + if (notificationType != ConnectivityManager.CALLBACK_UNAVAIL && + notificationType != ConnectivityManager.CALLBACK_RELEASED) { + bundle.putParcelable(Network.class.getSimpleName(), networkAgent.network); + } switch (notificationType) { - case ConnectivityManager.CALLBACK_LOSING: - a1 = 30 * 1000; // TODO - read this from NetworkMonitor - // fall through - case ConnectivityManager.CALLBACK_PRECHECK: - case ConnectivityManager.CALLBACK_AVAILABLE: - case ConnectivityManager.CALLBACK_LOST: - case ConnectivityManager.CALLBACK_CAP_CHANGED: - case ConnectivityManager.CALLBACK_IP_CHANGED: { - o = new NetworkRequest(nri.request); - a2 = networkAgent.network.netId; + case ConnectivityManager.CALLBACK_LOSING: { + msg.arg1 = 30 * 1000; // TODO - read this from NetworkMonitor break; } - case ConnectivityManager.CALLBACK_UNAVAIL: - case ConnectivityManager.CALLBACK_RELEASED: { - o = new NetworkRequest(nri.request); + case ConnectivityManager.CALLBACK_CAP_CHANGED: { + bundle.putParcelable(NetworkCapabilities.class.getSimpleName(), + new NetworkCapabilities(networkAgent.networkCapabilities)); break; } - default: { - loge("Unknown notificationType " + notificationType); - return; + case ConnectivityManager.CALLBACK_IP_CHANGED: { + bundle.putParcelable(LinkProperties.class.getSimpleName(), + new LinkProperties(networkAgent.linkProperties)); + break; } } - Message msg = Message.obtain(); - msg.arg1 = a1; - msg.arg2 = a2; - msg.obj = o; msg.what = notificationType; + msg.setData(bundle); try { if (VDBG) { log("sending notification " + notifyTypeToName(notificationType) + |
