Skip to content

Commit a848c1c

Browse files
author
Robert Greenwalt
committed
Send callbacks for Net property changes
LinkProperties and NetworkCapabilities changes were not calling app callbacks. bug:17681483 Change-Id: I67dac3c4dc1284f5c4bfb24de239da4ec776336f
1 parent b27d43a commit a848c1c

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;
@@ -170,6 +171,7 @@
170171
import java.util.HashSet;
171172
import java.util.List;
172173
import java.util.Map;
174+
import java.util.Objects;
173175
import java.util.Random;
174176
import java.util.concurrent.atomic.AtomicBoolean;
175177
import java.util.concurrent.atomic.AtomicInteger;
@@ -3533,6 +3535,10 @@ private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties
35333535
updateDnses(newLp, oldLp, netId, flushDns);
35343536
updateClat(newLp, oldLp, networkAgent);
35353537
if (isDefaultNetwork(networkAgent)) handleApplyDefaultProxy(newLp.getHttpProxy());
3538+
// TODO - move this check to cover the whole function
3539+
if (!Objects.equals(newLp, oldLp)) {
3540+
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED);
3541+
}
35363542
}
35373543

35383544
private void updateClat(LinkProperties newLp, LinkProperties oldLp, NetworkAgentInfo na) {
@@ -3670,10 +3676,13 @@ private void setDefaultDnsSystemProperties(Collection<InetAddress> dnses) {
36703676

36713677
private void updateCapabilities(NetworkAgentInfo networkAgent,
36723678
NetworkCapabilities networkCapabilities) {
3673-
// TODO - what else here? Verify still satisfies everybody?
3674-
// Check if satisfies somebody new? call callbacks?
3675-
synchronized (networkAgent) {
3676-
networkAgent.networkCapabilities = networkCapabilities;
3679+
// TODO - turn this on in MR1 when we have more dogfooding time.
3680+
// rematchAllNetworksAndRequests();
3681+
if (!Objects.equals(networkAgent.networkCapabilities, networkCapabilities)) {
3682+
synchronized (networkAgent) {
3683+
networkAgent.networkCapabilities = networkCapabilities;
3684+
}
3685+
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_CAP_CHANGED);
36773686
}
36783687
}
36793688

@@ -3688,37 +3697,32 @@ private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int scor
36883697
private void callCallbackForRequest(NetworkRequestInfo nri,
36893698
NetworkAgentInfo networkAgent, int notificationType) {
36903699
if (nri.messenger == null) return; // Default request has no msgr
3691-
Object o;
3692-
int a1 = 0;
3693-
int a2 = 0;
3700+
Bundle bundle = new Bundle();
3701+
bundle.putParcelable(NetworkRequest.class.getSimpleName(),
3702+
new NetworkRequest(nri.request));
3703+
Message msg = Message.obtain();
3704+
if (notificationType != ConnectivityManager.CALLBACK_UNAVAIL &&
3705+
notificationType != ConnectivityManager.CALLBACK_RELEASED) {
3706+
bundle.putParcelable(Network.class.getSimpleName(), networkAgent.network);
3707+
}
36943708
switch (notificationType) {
3695-
case ConnectivityManager.CALLBACK_LOSING:
3696-
a1 = 30 * 1000; // TODO - read this from NetworkMonitor
3697-
// fall through
3698-
case ConnectivityManager.CALLBACK_PRECHECK:
3699-
case ConnectivityManager.CALLBACK_AVAILABLE:
3700-
case ConnectivityManager.CALLBACK_LOST:
3701-
case ConnectivityManager.CALLBACK_CAP_CHANGED:
3702-
case ConnectivityManager.CALLBACK_IP_CHANGED: {
3703-
o = new NetworkRequest(nri.request);
3704-
a2 = networkAgent.network.netId;
3709+
case ConnectivityManager.CALLBACK_LOSING: {
3710+
msg.arg1 = 30 * 1000; // TODO - read this from NetworkMonitor
37053711
break;
37063712
}
3707-
case ConnectivityManager.CALLBACK_UNAVAIL:
3708-
case ConnectivityManager.CALLBACK_RELEASED: {
3709-
o = new NetworkRequest(nri.request);
3713+
case ConnectivityManager.CALLBACK_CAP_CHANGED: {
3714+
bundle.putParcelable(NetworkCapabilities.class.getSimpleName(),
3715+
new NetworkCapabilities(networkAgent.networkCapabilities));
37103716
break;
37113717
}
3712-
default: {
3713-
loge("Unknown notificationType " + notificationType);
3714-
return;
3718+
case ConnectivityManager.CALLBACK_IP_CHANGED: {
3719+
bundle.putParcelable(LinkProperties.class.getSimpleName(),
3720+
new LinkProperties(networkAgent.linkProperties));
3721+
break;
37153722
}
37163723
}
3717-
Message msg = Message.obtain();
3718-
msg.arg1 = a1;
3719-
msg.arg2 = a2;
3720-
msg.obj = o;
37213724
msg.what = notificationType;
3725+
msg.setData(bundle);
37223726
try {
37233727
if (VDBG) {
37243728
log("sending notification " + notifyTypeToName(notificationType) +

0 commit comments

Comments
 (0)