Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 432f29f7 authored by Junyu Lai's avatar Junyu Lai Committed by Gerrit Code Review
Browse files

Merge changes from topic "sp04"

* changes:
  [SP05] add unit test for onStatsProviderLimitReached in NPMS
  [SP04] add unit test for NetworkStatsProvider
  [SP03] support registerNetworkStatsProvider API
  [SP03.1] Replace com.android.internal.util.Preconditions.checkNotNull
parents 89ac9501 4935995a
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1208,6 +1208,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();
+37 −3
Original line number Diff line number Diff line
@@ -16,9 +16,10 @@

package android.app.usage;

import static com.android.internal.util.Preconditions.checkNotNull;

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;
@@ -29,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;
@@ -42,6 +46,8 @@ import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;

import java.util.Objects;

/**
 * Provides access to network usage history and statistics. Usage data is collected in
 * discrete bins of time called 'Buckets'. See {@link NetworkStats.Bucket} for details.
@@ -418,7 +424,7 @@ public class NetworkStatsManager {
    /** @hide */
    public void registerUsageCallback(NetworkTemplate template, int networkType,
            long thresholdBytes, UsageCallback callback, @Nullable Handler handler) {
        checkNotNull(callback, "UsageCallback cannot be null");
        Objects.requireNonNull(callback, "UsageCallback cannot be null");

        final Looper looper;
        if (handler == null) {
@@ -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) {
+5 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);
}
+10 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);
}
+24 −4
Original line number Diff line number Diff line
@@ -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;
@@ -388,6 +389,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;
@@ -4543,6 +4545,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;

@@ -4598,14 +4608,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: {
@@ -5256,6 +5270,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