Loading api/system-current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -1331,6 +1331,10 @@ package android.app.usage { field public static final String SERVICE_INTERFACE = "android.app.usage.CacheQuotaService"; } public class NetworkStatsManager { method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.net.netstats.provider.NetworkStatsProviderCallback registerNetworkStatsProvider(@NonNull String, @NonNull android.net.netstats.provider.AbstractNetworkStatsProvider); } public static final class UsageEvents.Event { method public int getInstanceId(); method @Nullable public String getNotificationChannelId(); Loading core/java/android/app/usage/NetworkStatsManager.java +34 −0 Original line number Diff line number Diff line Loading @@ -16,7 +16,10 @@ package android.app.usage; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; import android.app.usage.NetworkStats.Bucket; Loading @@ -27,6 +30,9 @@ import android.net.DataUsageRequest; import android.net.INetworkStatsService; import android.net.NetworkIdentity; import android.net.NetworkTemplate; import android.net.netstats.provider.AbstractNetworkStatsProvider; import android.net.netstats.provider.NetworkStatsProviderCallback; import android.net.netstats.provider.NetworkStatsProviderWrapper; import android.os.Binder; import android.os.Handler; import android.os.Looper; Loading Loading @@ -519,6 +525,34 @@ public class NetworkStatsManager { private DataUsageRequest request; } /** * Registers a custom provider of {@link android.net.NetworkStats} to combine the network * statistics that cannot be seen by the kernel to system. To unregister, invoke * {@link NetworkStatsProviderCallback#unregister()}. * * @param tag a human readable identifier of the custom network stats provider. * @param provider a custom implementation of {@link AbstractNetworkStatsProvider} that needs to * be registered to the system. * @return a {@link NetworkStatsProviderCallback}, which can be used to report events to the * system. * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) @NonNull public NetworkStatsProviderCallback registerNetworkStatsProvider( @NonNull String tag, @NonNull AbstractNetworkStatsProvider provider) { try { final NetworkStatsProviderWrapper wrapper = new NetworkStatsProviderWrapper(provider); return new NetworkStatsProviderCallback( mService.registerNetworkStatsProvider(tag, wrapper)); } catch (RemoteException e) { e.rethrowAsRuntimeException(); } // Unreachable code, but compiler doesn't know about it. return null; } private static NetworkTemplate createTemplate(int networkType, String subscriberId) { final NetworkTemplate template; switch (networkType) { Loading core/java/android/net/INetworkStatsService.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.net.NetworkState; import android.net.NetworkStats; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; import android.net.netstats.provider.INetworkStatsProvider; import android.net.netstats.provider.INetworkStatsProviderCallback; import android.os.IBinder; import android.os.Messenger; import com.android.internal.net.VpnInfo; Loading Loading @@ -89,4 +91,7 @@ interface INetworkStatsService { /** Get the total network stats information since boot */ long getTotalStats(int type); /** Registers a network stats provider */ INetworkStatsProviderCallback registerNetworkStatsProvider(String tag, in INetworkStatsProvider provider); } services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java +10 −0 Original line number Diff line number Diff line Loading @@ -18,8 +18,10 @@ package com.android.server.net; import static com.android.server.net.NetworkPolicyManagerService.isUidNetworkingBlockedInternal; import android.annotation.NonNull; import android.net.Network; import android.net.NetworkTemplate; import android.net.netstats.provider.AbstractNetworkStatsProvider; import android.telephony.SubscriptionPlan; import java.util.Set; Loading Loading @@ -126,4 +128,12 @@ public abstract class NetworkPolicyManagerInternal { */ public abstract void setMeteredRestrictedPackagesAsync( Set<String> packageNames, int userId); /** * Notifies that any of the {@link AbstractNetworkStatsProvider} has reached its quota * which was set through {@link AbstractNetworkStatsProvider#setLimit(String, long)}. * * @param tag the human readable identifier of the custom network stats provider. */ public abstract void onStatsProviderLimitReached(@NonNull String tag); } services/core/java/com/android/server/net/NetworkPolicyManagerService.java +24 −4 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ import static android.net.NetworkTemplate.MATCH_MOBILE; import static android.net.NetworkTemplate.MATCH_WIFI; import static android.net.NetworkTemplate.buildTemplateMobileAll; import static android.net.TrafficStats.MB_IN_BYTES; import static android.net.netstats.provider.AbstractNetworkStatsProvider.QUOTA_UNLIMITED; import static android.os.Trace.TRACE_TAG_NETWORK; import static android.provider.Settings.Global.NETPOLICY_OVERRIDE_ENABLED; import static android.provider.Settings.Global.NETPOLICY_QUOTA_ENABLED; Loading Loading @@ -391,6 +392,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int MSG_METERED_RESTRICTED_PACKAGES_CHANGED = 17; private static final int MSG_SET_NETWORK_TEMPLATE_ENABLED = 18; private static final int MSG_SUBSCRIPTION_PLANS_CHANGED = 19; private static final int MSG_STATS_PROVIDER_LIMIT_REACHED = 20; private static final int UID_MSG_STATE_CHANGED = 100; private static final int UID_MSG_GONE = 101; Loading Loading @@ -4518,6 +4520,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mListeners.finishBroadcast(); return true; } case MSG_STATS_PROVIDER_LIMIT_REACHED: { mNetworkStats.forceUpdate(); synchronized (mNetworkPoliciesSecondLock) { updateNetworkEnabledNL(); updateNotificationsNL(); } return true; } case MSG_LIMIT_REACHED: { final String iface = (String) msg.obj; Loading Loading @@ -4573,14 +4583,18 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { return true; } case MSG_UPDATE_INTERFACE_QUOTA: { removeInterfaceQuota((String) msg.obj); final String iface = (String) msg.obj; // int params need to be stitched back into a long setInterfaceQuota((String) msg.obj, ((long) msg.arg1 << 32) | (msg.arg2 & 0xFFFFFFFFL)); final long quota = ((long) msg.arg1 << 32) | (msg.arg2 & 0xFFFFFFFFL); removeInterfaceQuota(iface); setInterfaceQuota(iface, quota); mNetworkStats.setStatsProviderLimit(iface, quota); return true; } case MSG_REMOVE_INTERFACE_QUOTA: { removeInterfaceQuota((String) msg.obj); final String iface = (String) msg.obj; removeInterfaceQuota(iface); mNetworkStats.setStatsProviderLimit(iface, QUOTA_UNLIMITED); return true; } case MSG_RESET_FIREWALL_RULES_BY_UID: { Loading Loading @@ -5235,6 +5249,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mHandler.obtainMessage(MSG_METERED_RESTRICTED_PACKAGES_CHANGED, userId, 0, packageNames).sendToTarget(); } @Override public void onStatsProviderLimitReached(@NonNull String tag) { Log.v(TAG, "onStatsProviderLimitReached: " + tag); mHandler.obtainMessage(MSG_STATS_PROVIDER_LIMIT_REACHED).sendToTarget(); } } private void setMeteredRestrictedPackagesInternal(Set<String> packageNames, int userId) { Loading Loading
api/system-current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -1331,6 +1331,10 @@ package android.app.usage { field public static final String SERVICE_INTERFACE = "android.app.usage.CacheQuotaService"; } public class NetworkStatsManager { method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.net.netstats.provider.NetworkStatsProviderCallback registerNetworkStatsProvider(@NonNull String, @NonNull android.net.netstats.provider.AbstractNetworkStatsProvider); } public static final class UsageEvents.Event { method public int getInstanceId(); method @Nullable public String getNotificationChannelId(); Loading
core/java/android/app/usage/NetworkStatsManager.java +34 −0 Original line number Diff line number Diff line Loading @@ -16,7 +16,10 @@ package android.app.usage; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; import android.app.usage.NetworkStats.Bucket; Loading @@ -27,6 +30,9 @@ import android.net.DataUsageRequest; import android.net.INetworkStatsService; import android.net.NetworkIdentity; import android.net.NetworkTemplate; import android.net.netstats.provider.AbstractNetworkStatsProvider; import android.net.netstats.provider.NetworkStatsProviderCallback; import android.net.netstats.provider.NetworkStatsProviderWrapper; import android.os.Binder; import android.os.Handler; import android.os.Looper; Loading Loading @@ -519,6 +525,34 @@ public class NetworkStatsManager { private DataUsageRequest request; } /** * Registers a custom provider of {@link android.net.NetworkStats} to combine the network * statistics that cannot be seen by the kernel to system. To unregister, invoke * {@link NetworkStatsProviderCallback#unregister()}. * * @param tag a human readable identifier of the custom network stats provider. * @param provider a custom implementation of {@link AbstractNetworkStatsProvider} that needs to * be registered to the system. * @return a {@link NetworkStatsProviderCallback}, which can be used to report events to the * system. * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) @NonNull public NetworkStatsProviderCallback registerNetworkStatsProvider( @NonNull String tag, @NonNull AbstractNetworkStatsProvider provider) { try { final NetworkStatsProviderWrapper wrapper = new NetworkStatsProviderWrapper(provider); return new NetworkStatsProviderCallback( mService.registerNetworkStatsProvider(tag, wrapper)); } catch (RemoteException e) { e.rethrowAsRuntimeException(); } // Unreachable code, but compiler doesn't know about it. return null; } private static NetworkTemplate createTemplate(int networkType, String subscriberId) { final NetworkTemplate template; switch (networkType) { Loading
core/java/android/net/INetworkStatsService.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.net.NetworkState; import android.net.NetworkStats; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; import android.net.netstats.provider.INetworkStatsProvider; import android.net.netstats.provider.INetworkStatsProviderCallback; import android.os.IBinder; import android.os.Messenger; import com.android.internal.net.VpnInfo; Loading Loading @@ -89,4 +91,7 @@ interface INetworkStatsService { /** Get the total network stats information since boot */ long getTotalStats(int type); /** Registers a network stats provider */ INetworkStatsProviderCallback registerNetworkStatsProvider(String tag, in INetworkStatsProvider provider); }
services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java +10 −0 Original line number Diff line number Diff line Loading @@ -18,8 +18,10 @@ package com.android.server.net; import static com.android.server.net.NetworkPolicyManagerService.isUidNetworkingBlockedInternal; import android.annotation.NonNull; import android.net.Network; import android.net.NetworkTemplate; import android.net.netstats.provider.AbstractNetworkStatsProvider; import android.telephony.SubscriptionPlan; import java.util.Set; Loading Loading @@ -126,4 +128,12 @@ public abstract class NetworkPolicyManagerInternal { */ public abstract void setMeteredRestrictedPackagesAsync( Set<String> packageNames, int userId); /** * Notifies that any of the {@link AbstractNetworkStatsProvider} has reached its quota * which was set through {@link AbstractNetworkStatsProvider#setLimit(String, long)}. * * @param tag the human readable identifier of the custom network stats provider. */ public abstract void onStatsProviderLimitReached(@NonNull String tag); }
services/core/java/com/android/server/net/NetworkPolicyManagerService.java +24 −4 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ import static android.net.NetworkTemplate.MATCH_MOBILE; import static android.net.NetworkTemplate.MATCH_WIFI; import static android.net.NetworkTemplate.buildTemplateMobileAll; import static android.net.TrafficStats.MB_IN_BYTES; import static android.net.netstats.provider.AbstractNetworkStatsProvider.QUOTA_UNLIMITED; import static android.os.Trace.TRACE_TAG_NETWORK; import static android.provider.Settings.Global.NETPOLICY_OVERRIDE_ENABLED; import static android.provider.Settings.Global.NETPOLICY_QUOTA_ENABLED; Loading Loading @@ -391,6 +392,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int MSG_METERED_RESTRICTED_PACKAGES_CHANGED = 17; private static final int MSG_SET_NETWORK_TEMPLATE_ENABLED = 18; private static final int MSG_SUBSCRIPTION_PLANS_CHANGED = 19; private static final int MSG_STATS_PROVIDER_LIMIT_REACHED = 20; private static final int UID_MSG_STATE_CHANGED = 100; private static final int UID_MSG_GONE = 101; Loading Loading @@ -4518,6 +4520,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mListeners.finishBroadcast(); return true; } case MSG_STATS_PROVIDER_LIMIT_REACHED: { mNetworkStats.forceUpdate(); synchronized (mNetworkPoliciesSecondLock) { updateNetworkEnabledNL(); updateNotificationsNL(); } return true; } case MSG_LIMIT_REACHED: { final String iface = (String) msg.obj; Loading Loading @@ -4573,14 +4583,18 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { return true; } case MSG_UPDATE_INTERFACE_QUOTA: { removeInterfaceQuota((String) msg.obj); final String iface = (String) msg.obj; // int params need to be stitched back into a long setInterfaceQuota((String) msg.obj, ((long) msg.arg1 << 32) | (msg.arg2 & 0xFFFFFFFFL)); final long quota = ((long) msg.arg1 << 32) | (msg.arg2 & 0xFFFFFFFFL); removeInterfaceQuota(iface); setInterfaceQuota(iface, quota); mNetworkStats.setStatsProviderLimit(iface, quota); return true; } case MSG_REMOVE_INTERFACE_QUOTA: { removeInterfaceQuota((String) msg.obj); final String iface = (String) msg.obj; removeInterfaceQuota(iface); mNetworkStats.setStatsProviderLimit(iface, QUOTA_UNLIMITED); return true; } case MSG_RESET_FIREWALL_RULES_BY_UID: { Loading Loading @@ -5235,6 +5249,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mHandler.obtainMessage(MSG_METERED_RESTRICTED_PACKAGES_CHANGED, userId, 0, packageNames).sendToTarget(); } @Override public void onStatsProviderLimitReached(@NonNull String tag) { Log.v(TAG, "onStatsProviderLimitReached: " + tag); mHandler.obtainMessage(MSG_STATS_PROVIDER_LIMIT_REACHED).sendToTarget(); } } private void setMeteredRestrictedPackagesInternal(Set<String> packageNames, int userId) { Loading