[CS] Unregister callback as part of onUnavailable dispatch

The onUnavailable semantics promise that it is equivalent to calling
the unregister callback method. But - it doesn't unregister the callback
allowing it to be reused. Fixed.

Additionally, modified the unregisterNetworkCallback method to not fail
on duplicate unregistration (since a callback could now self
unregister). Instead simply print a log.

Bug: 130651445
Test: atest ConnectivityServiceTest
Merged-In: I4c54b003a733eb0b1e4fd8674ed13081b1bef8e3
Change-Id: I4c54b003a733eb0b1e4fd8674ed13081b1bef8e3
This commit is contained in:
Etan Cohen
2019-04-16 15:07:55 -07:00
parent 44bb6d00a7
commit 2f9a465841
2 changed files with 11 additions and 2 deletions

View File

@@ -3449,6 +3449,10 @@ public class ConnectivityManager {
final NetworkCallback callback; final NetworkCallback callback;
synchronized (sCallbacks) { synchronized (sCallbacks) {
callback = sCallbacks.get(request); callback = sCallbacks.get(request);
if (message.what == CALLBACK_UNAVAIL) {
sCallbacks.remove(request);
callback.networkRequest = ALREADY_UNREGISTERED;
}
} }
if (DBG) { if (DBG) {
Log.d(TAG, getCallbackName(message.what) + " for network " + network); Log.d(TAG, getCallbackName(message.what) + " for network " + network);
@@ -3995,8 +3999,10 @@ public class ConnectivityManager {
synchronized (sCallbacks) { synchronized (sCallbacks) {
Preconditions.checkArgument(networkCallback.networkRequest != null, Preconditions.checkArgument(networkCallback.networkRequest != null,
"NetworkCallback was not registered"); "NetworkCallback was not registered");
Preconditions.checkArgument(networkCallback.networkRequest != ALREADY_UNREGISTERED, if (networkCallback.networkRequest == ALREADY_UNREGISTERED) {
"NetworkCallback was already unregistered"); Log.d(TAG, "NetworkCallback was already unregistered");
return;
}
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());

View File

@@ -3854,6 +3854,9 @@ public class ConnectivityServiceTest {
networkCallback.expectCallback(CallbackState.UNAVAILABLE, null); networkCallback.expectCallback(CallbackState.UNAVAILABLE, null);
testFactory.waitForRequests(); testFactory.waitForRequests();
// unregister network callback - a no-op, but should not fail
mCm.unregisterNetworkCallback(networkCallback);
testFactory.unregister(); testFactory.unregister();
handlerThread.quit(); handlerThread.quit();
} }