diff --git a/framework/api/module-lib-current.txt b/framework/api/module-lib-current.txt index 7a0142a6f4..fea880aed6 100644 --- a/framework/api/module-lib-current.txt +++ b/framework/api/module-lib-current.txt @@ -25,6 +25,8 @@ package android.net { method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_TEST_NETWORKS, android.Manifest.permission.NETWORK_STACK}) public void simulateDataStall(int, long, @NonNull android.net.Network, @NonNull android.os.PersistableBundle); method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void startCaptivePortalApp(@NonNull android.net.Network); method public void systemReady(); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void updateMeteredNetworkAllowList(int, boolean); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void updateMeteredNetworkDenyList(int, boolean); field public static final String ACTION_CLEAR_DNS_CACHE = "android.net.action.CLEAR_DNS_CACHE"; field public static final String ACTION_PROMPT_LOST_VALIDATION = "android.net.action.PROMPT_LOST_VALIDATION"; field public static final String ACTION_PROMPT_PARTIAL_CONNECTIVITY = "android.net.action.PROMPT_PARTIAL_CONNECTIVITY"; diff --git a/framework/src/android/net/ConnectivityManager.java b/framework/src/android/net/ConnectivityManager.java index ba8aabb646..465595fbc3 100644 --- a/framework/src/android/net/ConnectivityManager.java +++ b/framework/src/android/net/ConnectivityManager.java @@ -5550,4 +5550,48 @@ public class ConnectivityManager { public static Range getIpSecNetIdRange() { return new Range(TUN_INTF_NETID_START, TUN_INTF_NETID_START + TUN_INTF_NETID_RANGE - 1); } + + /** + * Allow target application using metered network. + * + * @param uid uid of target app + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @RequiresPermission(anyOf = { + android.Manifest.permission.NETWORK_SETTINGS, + android.Manifest.permission.NETWORK_STACK, + NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK + }) + public void updateMeteredNetworkAllowList(final int uid, final boolean add) { + try { + mService.updateMeteredNetworkAllowList(uid, add); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } catch (IllegalStateException ie) { + throw ie; + } + } + + /** + * Disallow target application using metered network. + * + * @param uid uid of target app + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @RequiresPermission(anyOf = { + android.Manifest.permission.NETWORK_SETTINGS, + android.Manifest.permission.NETWORK_STACK, + NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK + }) + public void updateMeteredNetworkDenyList(final int uid, final boolean add) { + try { + mService.updateMeteredNetworkDenyList(uid, add); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } catch (IllegalStateException ie) { + throw ie; + } + } } diff --git a/framework/src/android/net/IConnectivityManager.aidl b/framework/src/android/net/IConnectivityManager.aidl index 7c39bec277..5740d853d6 100644 --- a/framework/src/android/net/IConnectivityManager.aidl +++ b/framework/src/android/net/IConnectivityManager.aidl @@ -230,4 +230,8 @@ interface IConnectivityManager void unofferNetwork(in INetworkOfferCallback callback); void setTestAllowBadWifiUntil(long timeMs); + + void updateMeteredNetworkAllowList(int uid, boolean add); + + void updateMeteredNetworkDenyList(int uid, boolean add); } diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index e4faf85c37..578fabea58 100644 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -10580,4 +10580,34 @@ public class ConnectivityService extends IConnectivityManager.Stub return createNetworkRequest(NetworkRequest.Type.REQUEST, netcap); } } + + @Override + public void updateMeteredNetworkAllowList(final int uid, final boolean add) { + enforceNetworkStackOrSettingsPermission(); + + try { + if (add) { + mNetd.bandwidthAddNiceApp(uid); + } else { + mNetd.bandwidthRemoveNiceApp(uid); + } + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); + } + } + + @Override + public void updateMeteredNetworkDenyList(final int uid, final boolean add) { + enforceNetworkStackOrSettingsPermission(); + + try { + if (add) { + mNetd.bandwidthAddNaughtyApp(uid); + } else { + mNetd.bandwidthRemoveNaughtyApp(uid); + } + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); + } + } }