Loading core/java/android/net/ConnectivityManager.java +33 −30 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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() { Loading services/core/java/com/android/server/ConnectivityService.java +31 −27 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -3698,11 +3704,14 @@ 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? // 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); } } private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) { Loading @@ -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) + Loading Loading
core/java/android/net/ConnectivityManager.java +33 −30 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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() { Loading
services/core/java/com/android/server/ConnectivityService.java +31 −27 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -3698,11 +3704,14 @@ 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? // 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); } } private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) { Loading @@ -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) + Loading