Loading core/api/system-current.txt +3 −3 Original line number Diff line number Diff line Loading @@ -7520,12 +7520,12 @@ package android.net.util { package android.net.vcn { public class VcnManager { method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void addVcnNetworkPolicyListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.vcn.VcnManager.VcnNetworkPolicyListener); method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void addVcnNetworkPolicyChangeListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.vcn.VcnManager.VcnNetworkPolicyChangeListener); method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.vcn.VcnNetworkPolicyResult applyVcnNetworkPolicy(@NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties); method public void removeVcnNetworkPolicyListener(@NonNull android.net.vcn.VcnManager.VcnNetworkPolicyListener); method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void removeVcnNetworkPolicyChangeListener(@NonNull android.net.vcn.VcnManager.VcnNetworkPolicyChangeListener); } public static interface VcnManager.VcnNetworkPolicyListener { public static interface VcnManager.VcnNetworkPolicyChangeListener { method public void onPolicyChanged(); } Loading core/java/android/net/vcn/VcnManager.java +36 −29 Original line number Diff line number Diff line Loading @@ -73,7 +73,8 @@ import java.util.concurrent.Executor; public class VcnManager { @NonNull private static final String TAG = VcnManager.class.getSimpleName(); private static final Map<VcnNetworkPolicyListener, VcnUnderlyingNetworkPolicyListenerBinder> private static final Map< VcnNetworkPolicyChangeListener, VcnUnderlyingNetworkPolicyListenerBinder> REGISTERED_POLICY_LISTENERS = new ConcurrentHashMap<>(); @NonNull private final Context mContext; Loading @@ -93,13 +94,13 @@ public class VcnManager { } /** * Get all currently registered VcnNetworkPolicyListeners for testing purposes. * Get all currently registered VcnNetworkPolicyChangeListeners for testing purposes. * * @hide */ @VisibleForTesting(visibility = Visibility.PRIVATE) @NonNull public static Map<VcnNetworkPolicyListener, VcnUnderlyingNetworkPolicyListenerBinder> public static Map<VcnNetworkPolicyChangeListener, VcnUnderlyingNetworkPolicyListenerBinder> getAllPolicyListeners() { return Collections.unmodifiableMap(REGISTERED_POLICY_LISTENERS); } Loading Loading @@ -162,14 +163,14 @@ public class VcnManager { } // TODO(b/180537630): remove all VcnUnderlyingNetworkPolicyListener refs once Telephony is using // the new VcnNetworkPolicyListener API // the new VcnNetworkPolicyChangeListener API /** * VcnUnderlyingNetworkPolicyListener is the interface through which internal system components * can register to receive updates for VCN-underlying Network policies from the System Server. * * @hide */ public interface VcnUnderlyingNetworkPolicyListener extends VcnNetworkPolicyListener {} public interface VcnUnderlyingNetworkPolicyListener extends VcnNetworkPolicyChangeListener {} /** * Add a listener for VCN-underlying network policy updates. Loading @@ -185,7 +186,7 @@ public class VcnManager { @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void addVcnUnderlyingNetworkPolicyListener( @NonNull Executor executor, @NonNull VcnUnderlyingNetworkPolicyListener listener) { addVcnNetworkPolicyListener(executor, listener); addVcnNetworkPolicyChangeListener(executor, listener); } /** Loading @@ -198,7 +199,7 @@ public class VcnManager { */ public void removeVcnUnderlyingNetworkPolicyListener( @NonNull VcnUnderlyingNetworkPolicyListener listener) { removeVcnNetworkPolicyListener(listener); removeVcnNetworkPolicyChangeListener(listener); } /** Loading Loading @@ -233,20 +234,20 @@ public class VcnManager { } /** * VcnNetworkPolicyListener is the interface through which internal system components (e.g. * Network Factories) can register to receive updates for VCN-underlying Network policies from * the System Server. * VcnNetworkPolicyChangeListener is the interface through which internal system components * (e.g. Network Factories) can register to receive updates for VCN-underlying Network policies * from the System Server. * * <p>Any Network Factory that brings up Networks capable of being VCN-underlying Networks * should register a VcnNetworkPolicyListener. VcnManager will then use this listener to notify * the registrant when VCN Network policies change. Upon receiving this signal, the listener * must check {@link VcnManager} for the current Network policy result for each of its Networks * via {@link #applyVcnNetworkPolicy(NetworkCapabilities, LinkProperties)}. * should register a VcnNetworkPolicyChangeListener. VcnManager will then use this listener to * notify the registrant when VCN Network policies change. Upon receiving this signal, the * listener must check {@link VcnManager} for the current Network policy result for each of its * Networks via {@link #applyVcnNetworkPolicy(NetworkCapabilities, LinkProperties)}. * * @hide */ @SystemApi public interface VcnNetworkPolicyListener { public interface VcnNetworkPolicyChangeListener { /** * Notifies the implementation that the VCN's underlying Network policy has changed. * Loading @@ -260,20 +261,21 @@ public class VcnManager { /** * Add a listener for VCN-underlying Network policy updates. * * <p>A {@link VcnNetworkPolicyListener} is eligible to begin receiving callbacks once it is * registered. No callbacks are guaranteed upon registration. * <p>A {@link VcnNetworkPolicyChangeListener} is eligible to begin receiving callbacks once it * is registered. No callbacks are guaranteed upon registration. * * @param executor the Executor that will be used for invoking all calls to the specified * Listener * @param listener the VcnNetworkPolicyListener to be added * @param listener the VcnNetworkPolicyChangeListener to be added * @throws SecurityException if the caller does not have permission NETWORK_FACTORY * @throws IllegalStateException if the specified VcnNetworkPolicyListener is already registered * @throws IllegalStateException if the specified VcnNetworkPolicyChangeListener is already * registered * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void addVcnNetworkPolicyListener( @NonNull Executor executor, @NonNull VcnNetworkPolicyListener listener) { public void addVcnNetworkPolicyChangeListener( @NonNull Executor executor, @NonNull VcnNetworkPolicyChangeListener listener) { requireNonNull(executor, "executor must not be null"); requireNonNull(listener, "listener must not be null"); Loading @@ -292,15 +294,18 @@ public class VcnManager { } /** * Remove the specified VcnNetworkPolicyListener from VcnManager. * Remove the specified VcnNetworkPolicyChangeListener from VcnManager. * * <p>If the specified listener is not currently registered, this is a no-op. * * @param listener the VcnNetworkPolicyListener that will be removed * @param listener the VcnNetworkPolicyChangeListener that will be removed * @throws SecurityException if the caller does not have permission NETWORK_FACTORY * @hide */ @SystemApi public void removeVcnNetworkPolicyListener(@NonNull VcnNetworkPolicyListener listener) { @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void removeVcnNetworkPolicyChangeListener( @NonNull VcnNetworkPolicyChangeListener listener) { requireNonNull(listener, "listener must not be null"); VcnUnderlyingNetworkPolicyListenerBinder binder = Loading @@ -320,8 +325,9 @@ public class VcnManager { * Applies the network policy for a {@link android.net.Network} with the given parameters. * * <p>Prior to a new NetworkAgent being registered, or upon notification that Carrier VCN policy * may have changed via {@link VcnNetworkPolicyListener#onPolicyChanged()}, a Network Provider * MUST poll for the updated Network policy based on that Network's capabilities and properties. * may have changed via {@link VcnNetworkPolicyChangeListener#onPolicyChanged()}, a Network * Provider MUST poll for the updated Network policy based on that Network's capabilities and * properties. * * @param networkCapabilities the NetworkCapabilities to be used in determining the Network * policy result for this Network. Loading Loading @@ -532,17 +538,18 @@ public class VcnManager { } /** * Binder wrapper for added VcnNetworkPolicyListeners to receive signals from System Server. * Binder wrapper for added VcnNetworkPolicyChangeListeners to receive signals from System * Server. * * @hide */ private static class VcnUnderlyingNetworkPolicyListenerBinder extends IVcnUnderlyingNetworkPolicyListener.Stub { @NonNull private final Executor mExecutor; @NonNull private final VcnNetworkPolicyListener mListener; @NonNull private final VcnNetworkPolicyChangeListener mListener; private VcnUnderlyingNetworkPolicyListenerBinder( Executor executor, VcnNetworkPolicyListener listener) { Executor executor, VcnNetworkPolicyChangeListener listener) { mExecutor = executor; mListener = listener; } Loading services/core/java/com/android/server/VcnManagementService.java +4 −0 Original line number Diff line number Diff line Loading @@ -666,6 +666,10 @@ public class VcnManagementService extends IVcnManagementService.Stub { @NonNull IVcnUnderlyingNetworkPolicyListener listener) { requireNonNull(listener, "listener was null"); mContext.enforceCallingOrSelfPermission( android.Manifest.permission.NETWORK_FACTORY, "Must have permission NETWORK_FACTORY to unregister a policy listener"); Binder.withCleanCallingIdentity(() -> { synchronized (mLock) { PolicyListenerBinderDeath listenerBinderDeath = Loading tests/vcn/java/com/android/server/VcnManagementServiceTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -593,6 +593,16 @@ public class VcnManagementServiceTest { mVcnMgmtSvc.removeVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); } @Test(expected = SecurityException.class) public void testRemoveVcnUnderlyingNetworkPolicyListenerInvalidPermission() { doThrow(new SecurityException()) .when(mMockContext) .enforceCallingOrSelfPermission( eq(android.Manifest.permission.NETWORK_FACTORY), any()); mVcnMgmtSvc.removeVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); } @Test public void testRemoveVcnUnderlyingNetworkPolicyListenerNeverRegistered() { mVcnMgmtSvc.removeVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); Loading Loading
core/api/system-current.txt +3 −3 Original line number Diff line number Diff line Loading @@ -7520,12 +7520,12 @@ package android.net.util { package android.net.vcn { public class VcnManager { method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void addVcnNetworkPolicyListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.vcn.VcnManager.VcnNetworkPolicyListener); method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void addVcnNetworkPolicyChangeListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.vcn.VcnManager.VcnNetworkPolicyChangeListener); method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public android.net.vcn.VcnNetworkPolicyResult applyVcnNetworkPolicy(@NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties); method public void removeVcnNetworkPolicyListener(@NonNull android.net.vcn.VcnManager.VcnNetworkPolicyListener); method @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void removeVcnNetworkPolicyChangeListener(@NonNull android.net.vcn.VcnManager.VcnNetworkPolicyChangeListener); } public static interface VcnManager.VcnNetworkPolicyListener { public static interface VcnManager.VcnNetworkPolicyChangeListener { method public void onPolicyChanged(); } Loading
core/java/android/net/vcn/VcnManager.java +36 −29 Original line number Diff line number Diff line Loading @@ -73,7 +73,8 @@ import java.util.concurrent.Executor; public class VcnManager { @NonNull private static final String TAG = VcnManager.class.getSimpleName(); private static final Map<VcnNetworkPolicyListener, VcnUnderlyingNetworkPolicyListenerBinder> private static final Map< VcnNetworkPolicyChangeListener, VcnUnderlyingNetworkPolicyListenerBinder> REGISTERED_POLICY_LISTENERS = new ConcurrentHashMap<>(); @NonNull private final Context mContext; Loading @@ -93,13 +94,13 @@ public class VcnManager { } /** * Get all currently registered VcnNetworkPolicyListeners for testing purposes. * Get all currently registered VcnNetworkPolicyChangeListeners for testing purposes. * * @hide */ @VisibleForTesting(visibility = Visibility.PRIVATE) @NonNull public static Map<VcnNetworkPolicyListener, VcnUnderlyingNetworkPolicyListenerBinder> public static Map<VcnNetworkPolicyChangeListener, VcnUnderlyingNetworkPolicyListenerBinder> getAllPolicyListeners() { return Collections.unmodifiableMap(REGISTERED_POLICY_LISTENERS); } Loading Loading @@ -162,14 +163,14 @@ public class VcnManager { } // TODO(b/180537630): remove all VcnUnderlyingNetworkPolicyListener refs once Telephony is using // the new VcnNetworkPolicyListener API // the new VcnNetworkPolicyChangeListener API /** * VcnUnderlyingNetworkPolicyListener is the interface through which internal system components * can register to receive updates for VCN-underlying Network policies from the System Server. * * @hide */ public interface VcnUnderlyingNetworkPolicyListener extends VcnNetworkPolicyListener {} public interface VcnUnderlyingNetworkPolicyListener extends VcnNetworkPolicyChangeListener {} /** * Add a listener for VCN-underlying network policy updates. Loading @@ -185,7 +186,7 @@ public class VcnManager { @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void addVcnUnderlyingNetworkPolicyListener( @NonNull Executor executor, @NonNull VcnUnderlyingNetworkPolicyListener listener) { addVcnNetworkPolicyListener(executor, listener); addVcnNetworkPolicyChangeListener(executor, listener); } /** Loading @@ -198,7 +199,7 @@ public class VcnManager { */ public void removeVcnUnderlyingNetworkPolicyListener( @NonNull VcnUnderlyingNetworkPolicyListener listener) { removeVcnNetworkPolicyListener(listener); removeVcnNetworkPolicyChangeListener(listener); } /** Loading Loading @@ -233,20 +234,20 @@ public class VcnManager { } /** * VcnNetworkPolicyListener is the interface through which internal system components (e.g. * Network Factories) can register to receive updates for VCN-underlying Network policies from * the System Server. * VcnNetworkPolicyChangeListener is the interface through which internal system components * (e.g. Network Factories) can register to receive updates for VCN-underlying Network policies * from the System Server. * * <p>Any Network Factory that brings up Networks capable of being VCN-underlying Networks * should register a VcnNetworkPolicyListener. VcnManager will then use this listener to notify * the registrant when VCN Network policies change. Upon receiving this signal, the listener * must check {@link VcnManager} for the current Network policy result for each of its Networks * via {@link #applyVcnNetworkPolicy(NetworkCapabilities, LinkProperties)}. * should register a VcnNetworkPolicyChangeListener. VcnManager will then use this listener to * notify the registrant when VCN Network policies change. Upon receiving this signal, the * listener must check {@link VcnManager} for the current Network policy result for each of its * Networks via {@link #applyVcnNetworkPolicy(NetworkCapabilities, LinkProperties)}. * * @hide */ @SystemApi public interface VcnNetworkPolicyListener { public interface VcnNetworkPolicyChangeListener { /** * Notifies the implementation that the VCN's underlying Network policy has changed. * Loading @@ -260,20 +261,21 @@ public class VcnManager { /** * Add a listener for VCN-underlying Network policy updates. * * <p>A {@link VcnNetworkPolicyListener} is eligible to begin receiving callbacks once it is * registered. No callbacks are guaranteed upon registration. * <p>A {@link VcnNetworkPolicyChangeListener} is eligible to begin receiving callbacks once it * is registered. No callbacks are guaranteed upon registration. * * @param executor the Executor that will be used for invoking all calls to the specified * Listener * @param listener the VcnNetworkPolicyListener to be added * @param listener the VcnNetworkPolicyChangeListener to be added * @throws SecurityException if the caller does not have permission NETWORK_FACTORY * @throws IllegalStateException if the specified VcnNetworkPolicyListener is already registered * @throws IllegalStateException if the specified VcnNetworkPolicyChangeListener is already * registered * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void addVcnNetworkPolicyListener( @NonNull Executor executor, @NonNull VcnNetworkPolicyListener listener) { public void addVcnNetworkPolicyChangeListener( @NonNull Executor executor, @NonNull VcnNetworkPolicyChangeListener listener) { requireNonNull(executor, "executor must not be null"); requireNonNull(listener, "listener must not be null"); Loading @@ -292,15 +294,18 @@ public class VcnManager { } /** * Remove the specified VcnNetworkPolicyListener from VcnManager. * Remove the specified VcnNetworkPolicyChangeListener from VcnManager. * * <p>If the specified listener is not currently registered, this is a no-op. * * @param listener the VcnNetworkPolicyListener that will be removed * @param listener the VcnNetworkPolicyChangeListener that will be removed * @throws SecurityException if the caller does not have permission NETWORK_FACTORY * @hide */ @SystemApi public void removeVcnNetworkPolicyListener(@NonNull VcnNetworkPolicyListener listener) { @RequiresPermission(android.Manifest.permission.NETWORK_FACTORY) public void removeVcnNetworkPolicyChangeListener( @NonNull VcnNetworkPolicyChangeListener listener) { requireNonNull(listener, "listener must not be null"); VcnUnderlyingNetworkPolicyListenerBinder binder = Loading @@ -320,8 +325,9 @@ public class VcnManager { * Applies the network policy for a {@link android.net.Network} with the given parameters. * * <p>Prior to a new NetworkAgent being registered, or upon notification that Carrier VCN policy * may have changed via {@link VcnNetworkPolicyListener#onPolicyChanged()}, a Network Provider * MUST poll for the updated Network policy based on that Network's capabilities and properties. * may have changed via {@link VcnNetworkPolicyChangeListener#onPolicyChanged()}, a Network * Provider MUST poll for the updated Network policy based on that Network's capabilities and * properties. * * @param networkCapabilities the NetworkCapabilities to be used in determining the Network * policy result for this Network. Loading Loading @@ -532,17 +538,18 @@ public class VcnManager { } /** * Binder wrapper for added VcnNetworkPolicyListeners to receive signals from System Server. * Binder wrapper for added VcnNetworkPolicyChangeListeners to receive signals from System * Server. * * @hide */ private static class VcnUnderlyingNetworkPolicyListenerBinder extends IVcnUnderlyingNetworkPolicyListener.Stub { @NonNull private final Executor mExecutor; @NonNull private final VcnNetworkPolicyListener mListener; @NonNull private final VcnNetworkPolicyChangeListener mListener; private VcnUnderlyingNetworkPolicyListenerBinder( Executor executor, VcnNetworkPolicyListener listener) { Executor executor, VcnNetworkPolicyChangeListener listener) { mExecutor = executor; mListener = listener; } Loading
services/core/java/com/android/server/VcnManagementService.java +4 −0 Original line number Diff line number Diff line Loading @@ -666,6 +666,10 @@ public class VcnManagementService extends IVcnManagementService.Stub { @NonNull IVcnUnderlyingNetworkPolicyListener listener) { requireNonNull(listener, "listener was null"); mContext.enforceCallingOrSelfPermission( android.Manifest.permission.NETWORK_FACTORY, "Must have permission NETWORK_FACTORY to unregister a policy listener"); Binder.withCleanCallingIdentity(() -> { synchronized (mLock) { PolicyListenerBinderDeath listenerBinderDeath = Loading
tests/vcn/java/com/android/server/VcnManagementServiceTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -593,6 +593,16 @@ public class VcnManagementServiceTest { mVcnMgmtSvc.removeVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); } @Test(expected = SecurityException.class) public void testRemoveVcnUnderlyingNetworkPolicyListenerInvalidPermission() { doThrow(new SecurityException()) .when(mMockContext) .enforceCallingOrSelfPermission( eq(android.Manifest.permission.NETWORK_FACTORY), any()); mVcnMgmtSvc.removeVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); } @Test public void testRemoveVcnUnderlyingNetworkPolicyListenerNeverRegistered() { mVcnMgmtSvc.removeVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); Loading