Merge "Remove reference when active listener is unregistered" am: a39b107812

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/1833145

Change-Id: I7b05b33c2a0c02c298d42ab4891ce543fe5ab9bd
This commit is contained in:
Chiachang Wang
2021-10-01 00:54:16 +00:00
committed by Automerger Merge Worker
2 changed files with 22 additions and 14 deletions

View File

@@ -2335,6 +2335,7 @@ public class ConnectivityManager {
void onNetworkActive(); void onNetworkActive();
} }
@GuardedBy("mNetworkActivityListeners")
private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener> private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener>
mNetworkActivityListeners = new ArrayMap<>(); mNetworkActivityListeners = new ArrayMap<>();
@@ -2351,13 +2352,14 @@ public class ConnectivityManager {
* @param l The listener to be told when the network is active. * @param l The listener to be told when the network is active.
*/ */
public void addDefaultNetworkActiveListener(final OnNetworkActiveListener l) { public void addDefaultNetworkActiveListener(final OnNetworkActiveListener l) {
INetworkActivityListener rl = new INetworkActivityListener.Stub() { final INetworkActivityListener rl = new INetworkActivityListener.Stub() {
@Override @Override
public void onNetworkActive() throws RemoteException { public void onNetworkActive() throws RemoteException {
l.onNetworkActive(); l.onNetworkActive();
} }
}; };
synchronized (mNetworkActivityListeners) {
try { try {
mService.registerNetworkActivityListener(rl); mService.registerNetworkActivityListener(rl);
mNetworkActivityListeners.put(l, rl); mNetworkActivityListeners.put(l, rl);
@@ -2365,6 +2367,7 @@ public class ConnectivityManager {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
} }
}
/** /**
* Remove network active listener previously registered with * Remove network active listener previously registered with
@@ -2373,16 +2376,19 @@ public class ConnectivityManager {
* @param l Previously registered listener. * @param l Previously registered listener.
*/ */
public void removeDefaultNetworkActiveListener(@NonNull OnNetworkActiveListener l) { public void removeDefaultNetworkActiveListener(@NonNull OnNetworkActiveListener l) {
INetworkActivityListener rl = mNetworkActivityListeners.get(l); synchronized (mNetworkActivityListeners) {
final INetworkActivityListener rl = mNetworkActivityListeners.get(l);
if (rl == null) { if (rl == null) {
throw new IllegalArgumentException("Listener was not registered."); throw new IllegalArgumentException("Listener was not registered.");
} }
try { try {
mService.unregisterNetworkActivityListener(rl); mService.unregisterNetworkActivityListener(rl);
mNetworkActivityListeners.remove(l);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
} }
}
/** /**
* Return whether the data network is currently active. An active network means that * Return whether the data network is currently active. An active network means that

View File

@@ -326,6 +326,8 @@ public class ConnectivityManagerTest {
verify(mService, times(1)).registerNetworkActivityListener(any()); verify(mService, times(1)).registerNetworkActivityListener(any());
manager.removeDefaultNetworkActiveListener(listener); manager.removeDefaultNetworkActiveListener(listener);
verify(mService, times(1)).unregisterNetworkActivityListener(any()); verify(mService, times(1)).unregisterNetworkActivityListener(any());
assertThrows(IllegalArgumentException.class,
() -> manager.removeDefaultNetworkActiveListener(listener));
} }
@Test @Test