Skip to content

Commit 24861ea

Browse files
Robert GreenwaltAndroid (Google) Code Review
authored andcommitted
Merge "Send callbacks for Net property changes" into lmp-dev
2 parents a79caa5 + a848c1c commit 24861ea

2 files changed

Lines changed: 64 additions & 57 deletions

File tree

core/java/android/net/ConnectivityManager.java

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.net.NetworkUtils;
2626
import android.os.Binder;
2727
import android.os.Build.VERSION_CODES;
28+
import android.os.Bundle;
2829
import android.os.Handler;
2930
import android.os.HandlerThread;
3031
import android.os.IBinder;
@@ -2147,50 +2148,57 @@ public void handleMessage(Message message) {
21472148
Log.d(TAG, "CM callback handler got msg " + message.what);
21482149
switch (message.what) {
21492150
case CALLBACK_PRECHECK: {
2150-
NetworkRequest request = getNetworkRequest(message);
2151+
NetworkRequest request = (NetworkRequest)getObject(message,
2152+
NetworkRequest.class);
21512153
NetworkCallback callbacks = getCallbacks(request);
21522154
if (callbacks != null) {
2153-
callbacks.onPreCheck(getNetwork(message));
2155+
callbacks.onPreCheck((Network)getObject(message, Network.class));
21542156
} else {
21552157
Log.e(TAG, "callback not found for PRECHECK message");
21562158
}
21572159
break;
21582160
}
21592161
case CALLBACK_AVAILABLE: {
2160-
NetworkRequest request = getNetworkRequest(message);
2162+
NetworkRequest request = (NetworkRequest)getObject(message,
2163+
NetworkRequest.class);
21612164
NetworkCallback callbacks = getCallbacks(request);
21622165
if (callbacks != null) {
2163-
callbacks.onAvailable(getNetwork(message));
2166+
callbacks.onAvailable((Network)getObject(message, Network.class));
21642167
} else {
21652168
Log.e(TAG, "callback not found for AVAILABLE message");
21662169
}
21672170
break;
21682171
}
21692172
case CALLBACK_LOSING: {
2170-
NetworkRequest request = getNetworkRequest(message);
2173+
NetworkRequest request = (NetworkRequest)getObject(message,
2174+
NetworkRequest.class);
21712175
NetworkCallback callbacks = getCallbacks(request);
21722176
if (callbacks != null) {
2173-
callbacks.onLosing(getNetwork(message), message.arg1);
2177+
callbacks.onLosing((Network)getObject(message, Network.class),
2178+
message.arg1);
21742179
} else {
21752180
Log.e(TAG, "callback not found for LOSING message");
21762181
}
21772182
break;
21782183
}
21792184
case CALLBACK_LOST: {
2180-
NetworkRequest request = getNetworkRequest(message);
2185+
NetworkRequest request = (NetworkRequest)getObject(message,
2186+
NetworkRequest.class);
2187+
21812188
NetworkCallback callbacks = getCallbacks(request);
21822189
if (callbacks != null) {
2183-
callbacks.onLost(getNetwork(message));
2190+
callbacks.onLost((Network)getObject(message, Network.class));
21842191
} else {
21852192
Log.e(TAG, "callback not found for LOST message");
21862193
}
21872194
break;
21882195
}
21892196
case CALLBACK_UNAVAIL: {
2190-
NetworkRequest req = (NetworkRequest)message.obj;
2197+
NetworkRequest request = (NetworkRequest)getObject(message,
2198+
NetworkRequest.class);
21912199
NetworkCallback callbacks = null;
21922200
synchronized(mCallbackMap) {
2193-
callbacks = mCallbackMap.get(req);
2201+
callbacks = mCallbackMap.get(request);
21942202
}
21952203
if (callbacks != null) {
21962204
callbacks.onUnavailable();
@@ -2200,33 +2208,37 @@ public void handleMessage(Message message) {
22002208
break;
22012209
}
22022210
case CALLBACK_CAP_CHANGED: {
2203-
NetworkRequest request = getNetworkRequest(message);
2211+
NetworkRequest request = (NetworkRequest)getObject(message,
2212+
NetworkRequest.class);
22042213
NetworkCallback callbacks = getCallbacks(request);
22052214
if (callbacks != null) {
2206-
Network network = getNetwork(message);
2207-
NetworkCapabilities cap = mCm.getNetworkCapabilities(network);
2215+
Network network = (Network)getObject(message, Network.class);
2216+
NetworkCapabilities cap = (NetworkCapabilities)getObject(message,
2217+
NetworkCapabilities.class);
22082218

22092219
callbacks.onCapabilitiesChanged(network, cap);
22102220
} else {
2211-
Log.e(TAG, "callback not found for CHANGED message");
2221+
Log.e(TAG, "callback not found for CAP_CHANGED message");
22122222
}
22132223
break;
22142224
}
22152225
case CALLBACK_IP_CHANGED: {
2216-
NetworkRequest request = getNetworkRequest(message);
2226+
NetworkRequest request = (NetworkRequest)getObject(message,
2227+
NetworkRequest.class);
22172228
NetworkCallback callbacks = getCallbacks(request);
22182229
if (callbacks != null) {
2219-
Network network = getNetwork(message);
2220-
LinkProperties lp = mCm.getLinkProperties(network);
2230+
Network network = (Network)getObject(message, Network.class);
2231+
LinkProperties lp = (LinkProperties)getObject(message,
2232+
LinkProperties.class);
22212233

22222234
callbacks.onLinkPropertiesChanged(network, lp);
22232235
} else {
2224-
Log.e(TAG, "callback not found for CHANGED message");
2236+
Log.e(TAG, "callback not found for IP_CHANGED message");
22252237
}
22262238
break;
22272239
}
22282240
case CALLBACK_RELEASED: {
2229-
NetworkRequest req = (NetworkRequest)message.obj;
2241+
NetworkRequest req = (NetworkRequest)getObject(message, NetworkRequest.class);
22302242
NetworkCallback callbacks = null;
22312243
synchronized(mCallbackMap) {
22322244
callbacks = mCallbackMap.remove(req);
@@ -2254,23 +2266,14 @@ public void handleMessage(Message message) {
22542266
}
22552267
}
22562268

2257-
private NetworkRequest getNetworkRequest(Message msg) {
2258-
return (NetworkRequest)(msg.obj);
2269+
private Object getObject(Message msg, Class c) {
2270+
return msg.getData().getParcelable(c.getSimpleName());
22592271
}
22602272
private NetworkCallback getCallbacks(NetworkRequest req) {
22612273
synchronized(mCallbackMap) {
22622274
return mCallbackMap.get(req);
22632275
}
22642276
}
2265-
private Network getNetwork(Message msg) {
2266-
return new Network(msg.arg2);
2267-
}
2268-
private NetworkCallback removeCallbacks(Message msg) {
2269-
NetworkRequest req = (NetworkRequest)msg.obj;
2270-
synchronized(mCallbackMap) {
2271-
return mCallbackMap.remove(req);
2272-
}
2273-
}
22742277
}
22752278

22762279
private void incCallbackHandlerRefCount() {

services/core/java/com/android/server/ConnectivityService.java

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import android.os.AsyncTask;
9191
import android.os.Binder;
9292
import android.os.Build;
93+
import android.os.Bundle;
9394
import android.os.FileUtils;
9495
import android.os.Handler;
9596
import android.os.HandlerThread;
@@ -171,6 +172,7 @@
171172
import java.util.HashSet;
172173
import java.util.List;
173174
import java.util.Map;
175+
import java.util.Objects;
174176
import java.util.Random;
175177
import java.util.concurrent.atomic.AtomicBoolean;
176178
import java.util.concurrent.atomic.AtomicInteger;
@@ -3561,6 +3563,10 @@ private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties
35613563
updateDnses(newLp, oldLp, netId, flushDns);
35623564
updateClat(newLp, oldLp, networkAgent);
35633565
if (isDefaultNetwork(networkAgent)) handleApplyDefaultProxy(newLp.getHttpProxy());
3566+
// TODO - move this check to cover the whole function
3567+
if (!Objects.equals(newLp, oldLp)) {
3568+
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED);
3569+
}
35643570
}
35653571

35663572
private void updateClat(LinkProperties newLp, LinkProperties oldLp, NetworkAgentInfo na) {
@@ -3698,10 +3704,13 @@ private void setDefaultDnsSystemProperties(Collection<InetAddress> dnses) {
36983704

36993705
private void updateCapabilities(NetworkAgentInfo networkAgent,
37003706
NetworkCapabilities networkCapabilities) {
3701-
// TODO - what else here? Verify still satisfies everybody?
3702-
// Check if satisfies somebody new? call callbacks?
3703-
synchronized (networkAgent) {
3704-
networkAgent.networkCapabilities = networkCapabilities;
3707+
// TODO - turn this on in MR1 when we have more dogfooding time.
3708+
// rematchAllNetworksAndRequests();
3709+
if (!Objects.equals(networkAgent.networkCapabilities, networkCapabilities)) {
3710+
synchronized (networkAgent) {
3711+
networkAgent.networkCapabilities = networkCapabilities;
3712+
}
3713+
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_CAP_CHANGED);
37053714
}
37063715
}
37073716

@@ -3725,37 +3734,32 @@ private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int scor
37253734
private void callCallbackForRequest(NetworkRequestInfo nri,
37263735
NetworkAgentInfo networkAgent, int notificationType) {
37273736
if (nri.messenger == null) return; // Default request has no msgr
3728-
Object o;
3729-
int a1 = 0;
3730-
int a2 = 0;
3737+
Bundle bundle = new Bundle();
3738+
bundle.putParcelable(NetworkRequest.class.getSimpleName(),
3739+
new NetworkRequest(nri.request));
3740+
Message msg = Message.obtain();
3741+
if (notificationType != ConnectivityManager.CALLBACK_UNAVAIL &&
3742+
notificationType != ConnectivityManager.CALLBACK_RELEASED) {
3743+
bundle.putParcelable(Network.class.getSimpleName(), networkAgent.network);
3744+
}
37313745
switch (notificationType) {
3732-
case ConnectivityManager.CALLBACK_LOSING:
3733-
a1 = 30 * 1000; // TODO - read this from NetworkMonitor
3734-
// fall through
3735-
case ConnectivityManager.CALLBACK_PRECHECK:
3736-
case ConnectivityManager.CALLBACK_AVAILABLE:
3737-
case ConnectivityManager.CALLBACK_LOST:
3738-
case ConnectivityManager.CALLBACK_CAP_CHANGED:
3739-
case ConnectivityManager.CALLBACK_IP_CHANGED: {
3740-
o = new NetworkRequest(nri.request);
3741-
a2 = networkAgent.network.netId;
3746+
case ConnectivityManager.CALLBACK_LOSING: {
3747+
msg.arg1 = 30 * 1000; // TODO - read this from NetworkMonitor
37423748
break;
37433749
}
3744-
case ConnectivityManager.CALLBACK_UNAVAIL:
3745-
case ConnectivityManager.CALLBACK_RELEASED: {
3746-
o = new NetworkRequest(nri.request);
3750+
case ConnectivityManager.CALLBACK_CAP_CHANGED: {
3751+
bundle.putParcelable(NetworkCapabilities.class.getSimpleName(),
3752+
new NetworkCapabilities(networkAgent.networkCapabilities));
37473753
break;
37483754
}
3749-
default: {
3750-
loge("Unknown notificationType " + notificationType);
3751-
return;
3755+
case ConnectivityManager.CALLBACK_IP_CHANGED: {
3756+
bundle.putParcelable(LinkProperties.class.getSimpleName(),
3757+
new LinkProperties(networkAgent.linkProperties));
3758+
break;
37523759
}
37533760
}
3754-
Message msg = Message.obtain();
3755-
msg.arg1 = a1;
3756-
msg.arg2 = a2;
3757-
msg.obj = o;
37583761
msg.what = notificationType;
3762+
msg.setData(bundle);
37593763
try {
37603764
if (VDBG) {
37613765
log("sending notification " + notifyTypeToName(notificationType) +

0 commit comments

Comments
 (0)