diff --git a/framework/src/android/net/ConnectivityManager.java b/framework/src/android/net/ConnectivityManager.java index b04b603fea..2951f5ef03 100644 --- a/framework/src/android/net/ConnectivityManager.java +++ b/framework/src/android/net/ConnectivityManager.java @@ -2335,6 +2335,7 @@ public class ConnectivityManager { void onNetworkActive(); } + @GuardedBy("mNetworkActivityListeners") private final ArrayMap mNetworkActivityListeners = new ArrayMap<>(); @@ -2351,18 +2352,20 @@ public class ConnectivityManager { * @param l The listener to be told when the network is active. */ public void addDefaultNetworkActiveListener(final OnNetworkActiveListener l) { - INetworkActivityListener rl = new INetworkActivityListener.Stub() { + final INetworkActivityListener rl = new INetworkActivityListener.Stub() { @Override public void onNetworkActive() throws RemoteException { l.onNetworkActive(); } }; - try { - mService.registerNetworkActivityListener(rl); - mNetworkActivityListeners.put(l, rl); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + synchronized (mNetworkActivityListeners) { + try { + mService.registerNetworkActivityListener(rl); + mNetworkActivityListeners.put(l, rl); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } } @@ -2373,14 +2376,17 @@ public class ConnectivityManager { * @param l Previously registered listener. */ public void removeDefaultNetworkActiveListener(@NonNull OnNetworkActiveListener l) { - INetworkActivityListener rl = mNetworkActivityListeners.get(l); - if (rl == null) { - throw new IllegalArgumentException("Listener was not registered."); - } - try { - mService.unregisterNetworkActivityListener(rl); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + synchronized (mNetworkActivityListeners) { + final INetworkActivityListener rl = mNetworkActivityListeners.get(l); + if (rl == null) { + throw new IllegalArgumentException("Listener was not registered."); + } + try { + mService.unregisterNetworkActivityListener(rl); + mNetworkActivityListeners.remove(l); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } } diff --git a/tests/unit/java/android/net/ConnectivityManagerTest.java b/tests/unit/java/android/net/ConnectivityManagerTest.java index 0914492704..c475419b8a 100644 --- a/tests/unit/java/android/net/ConnectivityManagerTest.java +++ b/tests/unit/java/android/net/ConnectivityManagerTest.java @@ -326,6 +326,8 @@ public class ConnectivityManagerTest { verify(mService, times(1)).registerNetworkActivityListener(any()); manager.removeDefaultNetworkActiveListener(listener); verify(mService, times(1)).unregisterNetworkActivityListener(any()); + assertThrows(IllegalArgumentException.class, + () -> manager.removeDefaultNetworkActiveListener(listener)); } @Test