From 9b09a169302f3d49d77623726d5bc31c961da1c8 Mon Sep 17 00:00:00 2001 From: Etan Cohen Date: Tue, 16 Apr 2019 15:07:55 -0700 Subject: [PATCH] [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 Change-Id: I4c54b003a733eb0b1e4fd8674ed13081b1bef8e3 --- core/java/android/net/ConnectivityManager.java | 10 ++++++++-- tests/net/java/com/android/server/ConnectivityServiceTest.java | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 0e10de8c4e3f..a69ca99500d6 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -3449,6 +3449,10 @@ public class ConnectivityManager { final NetworkCallback callback; synchronized (sCallbacks) { callback = sCallbacks.get(request); + if (message.what == CALLBACK_UNAVAIL) { + sCallbacks.remove(request); + callback.networkRequest = ALREADY_UNREGISTERED; + } } if (DBG) { Log.d(TAG, getCallbackName(message.what) + " for network " + network); @@ -3995,8 +3999,10 @@ public class ConnectivityManager { synchronized (sCallbacks) { Preconditions.checkArgument(networkCallback.networkRequest != null, "NetworkCallback was not registered"); - Preconditions.checkArgument(networkCallback.networkRequest != ALREADY_UNREGISTERED, - "NetworkCallback was already unregistered"); + if (networkCallback.networkRequest == ALREADY_UNREGISTERED) { + Log.d(TAG, "NetworkCallback was already unregistered"); + return; + } for (Map.Entry e : sCallbacks.entrySet()) { if (e.getValue() == networkCallback) { reqs.add(e.getKey()); diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 37af461b1305..3c5bb6a0c64f 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -3854,6 +3854,9 @@ public class ConnectivityServiceTest { networkCallback.expectCallback(CallbackState.UNAVAILABLE, null); testFactory.waitForRequests(); + // unregister network callback - a no-op, but should not fail + mCm.unregisterNetworkCallback(networkCallback); + testFactory.unregister(); handlerThread.quit(); } -- 2.11.0