[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:
@@ -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());
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user