Merge "Better errors from unregisterNetworkCallback" am: 04e89ad631

am: ca6ebb0f39

Change-Id: Ib380ee7c3fc85db353682ee7abfe97842eaeeb29
This commit is contained in:
Hugo Benichi
2017-06-20 05:19:46 +00:00
committed by android-build-merger

View File

@@ -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;
} }
} }