summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lorenzo Colitti <lorenzo@google.com> 2016-07-05 01:22:13 +0900
committer Lorenzo Colitti <lorenzo@google.com> 2016-07-05 01:59:49 +0900
commit1ec11eb5bcd8dc2310ffc89b338cc01fad27b3ec (patch)
treee11485a6024f11075ea750eaa87750b454a99137
parent2573d83fa9052753ee1f4abc8683905ae2acbc25 (diff)
Unbreak unregisterNetworkCallback.
http://ag/1194313 broke unregisterNetworkCallback because the system does not parcel the type of the request back to the app. So when the app calls unregisterNetworkCallback, the NetworkRequest that's passed in does not have a type and thus doesn't match the request in mNetworkRequests. Fix this by parceling over the type as well. This was not caught by the unit test because the unit test all runs in the same process with no parceling. Bug: 23113288 Change-Id: I58b2ed651b9bf5cbdcca5b25c3ca24db53cffdf1
-rw-r--r--core/java/android/net/NetworkRequest.java15
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java19
2 files changed, 17 insertions, 17 deletions
diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java
index 5ac24d56cb98..847d82bbd76d 100644
--- a/core/java/android/net/NetworkRequest.java
+++ b/core/java/android/net/NetworkRequest.java
@@ -19,6 +19,8 @@ package android.net;
import android.os.Parcel;
import android.os.Parcelable;
+import java.util.Objects;
+
/**
* Defines a request for a network, made through {@link NetworkRequest.Builder} and used
* to request a network via {@link ConnectivityManager#requestNetwork} or listen for changes
@@ -264,7 +266,7 @@ public class NetworkRequest implements Parcelable {
dest.writeParcelable(networkCapabilities, flags);
dest.writeInt(legacyType);
dest.writeInt(requestId);
- // type intentionally not preserved across process boundaries.
+ dest.writeString(type.name());
}
public static final Creator<NetworkRequest> CREATOR =
new Creator<NetworkRequest>() {
@@ -272,8 +274,8 @@ public class NetworkRequest implements Parcelable {
NetworkCapabilities nc = (NetworkCapabilities)in.readParcelable(null);
int legacyType = in.readInt();
int requestId = in.readInt();
- // type intentionally not preserved across process boundaries.
- NetworkRequest result = new NetworkRequest(nc, legacyType, requestId, Type.NONE);
+ Type type = Type.valueOf(in.readString()); // IllegalArgumentException if invalid.
+ NetworkRequest result = new NetworkRequest(nc, legacyType, requestId, type);
return result;
}
public NetworkRequest[] newArray(int size) {
@@ -311,13 +313,10 @@ public class NetworkRequest implements Parcelable {
return (that.legacyType == this.legacyType &&
that.requestId == this.requestId &&
that.type == this.type &&
- ((that.networkCapabilities == null && this.networkCapabilities == null) ||
- (that.networkCapabilities != null &&
- that.networkCapabilities.equals(this.networkCapabilities))));
+ Objects.equals(that.networkCapabilities, this.networkCapabilities));
}
public int hashCode() {
- return requestId + (legacyType * 1013) +
- (networkCapabilities.hashCode() * 1051) + type.hashCode() * 17;
+ return Objects.hash(requestId, legacyType, networkCapabilities, type);
}
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 7abb9671f939..69d0561acaec 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -3818,6 +3818,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
+ private void ensureNetworkRequestHasType(NetworkRequest request) {
+ if (request.type == NetworkRequest.Type.NONE) {
+ throw new IllegalArgumentException(
+ "All NetworkRequests in ConnectivityService must have a type");
+ }
+ }
+
/**
* Tracks info about the requester.
* Also used to notice when the calling process dies so we can self-expire
@@ -3833,7 +3840,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequestInfo(NetworkRequest r, PendingIntent pi) {
request = r;
- ensureRequestHasType();
+ ensureNetworkRequestHasType(request);
mPendingIntent = pi;
messenger = null;
mBinder = null;
@@ -3846,7 +3853,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
super();
messenger = m;
request = r;
- ensureRequestHasType();
+ ensureNetworkRequestHasType(request);
mBinder = binder;
mPid = getCallingPid();
mUid = getCallingUid();
@@ -3860,13 +3867,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
- private void ensureRequestHasType() {
- if (request.type == NetworkRequest.Type.NONE) {
- throw new IllegalArgumentException(
- "All NetworkRequests in ConnectivityService must have a type");
- }
- }
-
private void enforceRequestCountLimit() {
synchronized (mUidToNetworkRequestCount) {
int networkRequests = mUidToNetworkRequestCount.get(mUid, 0) + 1;
@@ -4117,6 +4117,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public void releaseNetworkRequest(NetworkRequest networkRequest) {
+ ensureNetworkRequestHasType(networkRequest);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST, getCallingUid(),
0, networkRequest));
}