Merge "Better errors from unregisterNetworkCallback" am: 04e89ad631
am: ca6ebb0f39 Change-Id: Ib380ee7c3fc85db353682ee7abfe97842eaeeb29
This commit is contained in:
@@ -601,6 +601,15 @@ public class ConnectivityManager {
|
|||||||
*/
|
*/
|
||||||
public final static int REQUEST_ID_UNSET = 0;
|
public final static int REQUEST_ID_UNSET = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static unique request used as a tombstone for NetworkCallbacks that have been unregistered.
|
||||||
|
* This allows to distinguish when unregistering NetworkCallbacks those that were never
|
||||||
|
* registered and those that were already unregistered.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
private final static NetworkRequest ALREADY_UNREGISTERED =
|
||||||
|
new NetworkRequest.Builder().clearCapabilities().build();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A NetID indicating no Network is selected.
|
* A NetID indicating no Network is selected.
|
||||||
* Keep in sync with bionic/libc/dns/include/resolv_netid.h
|
* Keep in sync with bionic/libc/dns/include/resolv_netid.h
|
||||||
@@ -2686,10 +2695,6 @@ public class ConnectivityManager {
|
|||||||
public void onNetworkResumed(Network network) {}
|
public void onNetworkResumed(Network network) {}
|
||||||
|
|
||||||
private NetworkRequest networkRequest;
|
private NetworkRequest networkRequest;
|
||||||
|
|
||||||
private boolean isRegistered() {
|
|
||||||
return (networkRequest != null) && (networkRequest.requestId != REQUEST_ID_UNSET);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2856,7 +2861,8 @@ public class ConnectivityManager {
|
|||||||
final NetworkRequest request;
|
final NetworkRequest request;
|
||||||
try {
|
try {
|
||||||
synchronized(sCallbacks) {
|
synchronized(sCallbacks) {
|
||||||
if (callback.isRegistered()) {
|
if (callback.networkRequest != null
|
||||||
|
&& callback.networkRequest != ALREADY_UNREGISTERED) {
|
||||||
// TODO: throw exception instead and enforce 1:1 mapping of callbacks
|
// TODO: throw exception instead and enforce 1:1 mapping of callbacks
|
||||||
// and requests (http://b/20701525).
|
// and requests (http://b/20701525).
|
||||||
Log.e(TAG, "NetworkCallback was already registered");
|
Log.e(TAG, "NetworkCallback was already registered");
|
||||||
@@ -3302,8 +3308,10 @@ public class ConnectivityManager {
|
|||||||
// Find all requests associated to this callback and stop callback triggers immediately.
|
// Find all requests associated to this callback and stop callback triggers immediately.
|
||||||
// Callback is reusable immediately. http://b/20701525, http://b/35921499.
|
// Callback is reusable immediately. http://b/20701525, http://b/35921499.
|
||||||
synchronized (sCallbacks) {
|
synchronized (sCallbacks) {
|
||||||
Preconditions.checkArgument(
|
Preconditions.checkArgument(networkCallback.networkRequest != null,
|
||||||
networkCallback.isRegistered(), "NetworkCallback was not registered");
|
"NetworkCallback was not registered");
|
||||||
|
Preconditions.checkArgument(networkCallback.networkRequest != ALREADY_UNREGISTERED,
|
||||||
|
"NetworkCallback was already unregistered");
|
||||||
for (Map.Entry<NetworkRequest, NetworkCallback> e : sCallbacks.entrySet()) {
|
for (Map.Entry<NetworkRequest, NetworkCallback> e : sCallbacks.entrySet()) {
|
||||||
if (e.getValue() == networkCallback) {
|
if (e.getValue() == networkCallback) {
|
||||||
reqs.add(e.getKey());
|
reqs.add(e.getKey());
|
||||||
@@ -3319,7 +3327,7 @@ public class ConnectivityManager {
|
|||||||
// Only remove mapping if rpc was successful.
|
// Only remove mapping if rpc was successful.
|
||||||
sCallbacks.remove(r);
|
sCallbacks.remove(r);
|
||||||
}
|
}
|
||||||
networkCallback.networkRequest = null;
|
networkCallback.networkRequest = ALREADY_UNREGISTERED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user