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

Commit fadcece4 authored by Chris Weir's avatar Chris Weir Committed by Automerger Merge Worker
Browse files

Merge "Add atom for OEM managed networks" into sc-dev am: d72020dc

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13679463

Change-Id: If2d1f5907d80257954aaa00b03131a0d1ae89cee
parents b634e142 d72020dc
Loading
Loading
Loading
Loading
+80 −3
Original line number Diff line number Diff line
@@ -25,7 +25,16 @@ import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.NetworkIdentity.OEM_PAID;
import static android.net.NetworkIdentity.OEM_PRIVATE;
import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
import static android.net.NetworkStats.METERED_ALL;
import static android.net.NetworkStats.ROAMING_ALL;
import static android.net.NetworkTemplate.MATCH_ETHERNET;
import static android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD;
import static android.net.NetworkTemplate.MATCH_WIFI_WILDCARD;
import static android.net.NetworkTemplate.NETWORK_TYPE_ALL;
import static android.net.NetworkTemplate.OEM_MANAGED_ALL;
import static android.net.NetworkTemplate.buildTemplateMobileWildcard;
import static android.net.NetworkTemplate.buildTemplateMobileWithRatType;
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
@@ -435,6 +444,7 @@ public class StatsPullAtomService extends SystemService {
                    case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG:
                    case FrameworkStatsLog.BYTES_TRANSFER_BY_TAG_AND_METERED:
                    case FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER:
                    case FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER:
                        synchronized (mDataBytesTransferLock) {
                            return pullDataBytesTransferLocked(atomTag, data);
                        }
@@ -867,6 +877,8 @@ public class StatsPullAtomService extends SystemService {
                FrameworkStatsLog.BYTES_TRANSFER_BY_TAG_AND_METERED));
        mNetworkStatsBaselines.addAll(
                collectNetworkStatsSnapshotForAtom(FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER));
        mNetworkStatsBaselines.addAll(
                collectNetworkStatsSnapshotForAtom(FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER));

        // Listen to subscription changes to record historical subscriptions that activated before
        // pulling, this is used by {@code DATA_USAGE_BYTES_TRANSFER}.
@@ -879,6 +891,7 @@ public class StatsPullAtomService extends SystemService {
        registerMobileBytesTransferBackground();
        registerBytesTransferByTagAndMetered();
        registerDataUsageBytesTransfer();
        registerOemManagedBytesTransfer();
    }

    /**
@@ -1057,7 +1070,7 @@ public class StatsPullAtomService extends SystemService {
                            new int[] {TRANSPORT_WIFI, TRANSPORT_CELLULAR},
                            /*slicedByFgbg=*/false, /*slicedByTag=*/true,
                            /*slicedByMetered=*/true, TelephonyManager.NETWORK_TYPE_UNKNOWN,
                            /*subInfo=*/null));
                            /*subInfo=*/null, OEM_MANAGED_ALL));
                }
                break;
            }
@@ -1067,6 +1080,10 @@ public class StatsPullAtomService extends SystemService {
                }
                break;
            }
            case FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER: {
                ret.addAll(getDataUsageBytesTransferSnapshotForOemManaged());
                break;
            }
            default:
                throw new IllegalArgumentException("Unknown atomTag " + atomTag);
        }
@@ -1094,7 +1111,7 @@ public class StatsPullAtomService extends SystemService {
            final NetworkStatsExt diff = new NetworkStatsExt(
                    item.stats.subtract(baseline.stats).removeEmptyEntries(), item.transports,
                    item.slicedByFgbg, item.slicedByTag, item.slicedByMetered, item.ratType,
                    item.subInfo);
                    item.subInfo, item.oemManaged);

            // If no diff, skip.
            if (diff.stats.size() == 0) continue;
@@ -1106,6 +1123,9 @@ public class StatsPullAtomService extends SystemService {
                case FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER:
                    addDataUsageBytesTransferAtoms(diff, pulledData);
                    break;
                case FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER:
                    addOemDataUsageBytesTransferAtoms(diff, pulledData);
                    break;
                default:
                    addNetworkStats(atomTag, pulledData, diff);
            }
@@ -1177,6 +1197,49 @@ public class StatsPullAtomService extends SystemService {
        }
    }

    private void addOemDataUsageBytesTransferAtoms(@NonNull NetworkStatsExt statsExt,
            @NonNull List<StatsEvent> pulledData) {
        final NetworkStats.Entry entry = new NetworkStats.Entry(); // for recycling
        final int oemManaged = statsExt.oemManaged;
        for (final int transport : statsExt.transports) {
            for (int i = 0; i < statsExt.stats.size(); i++) {
                statsExt.stats.getValues(i, entry);
                pulledData.add(FrameworkStatsLog.buildStatsEvent(
                        FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER, entry.uid, (entry.set > 0),
                        oemManaged, transport, entry.rxBytes, entry.rxPackets, entry.txBytes,
                        entry.txPackets));
            }
        }
    }

    @NonNull private List<NetworkStatsExt> getDataUsageBytesTransferSnapshotForOemManaged() {
        final int[] transports = new int[] {MATCH_ETHERNET, MATCH_MOBILE_WILDCARD,
                MATCH_WIFI_WILDCARD};
        final int[] oemManagedTypes = new int[] {OEM_PAID | OEM_PRIVATE, OEM_PAID, OEM_PRIVATE};

        final List<NetworkStatsExt> ret = new ArrayList<>();

        for (final int transport : transports) {
            for (final int oemManaged : oemManagedTypes) {
                /* A null subscriberId will set wildcard=true, since we aren't trying to select a
                   specific ssid or subscriber. */
                final NetworkTemplate template = new NetworkTemplate(transport,
                        /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null,
                        METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL,
                        oemManaged);
                final NetworkStats stats = getUidNetworkStatsSnapshotForTemplate(template, true);
                if (stats != null) {
                    ret.add(new NetworkStatsExt(sliceNetworkStatsByUidTagAndMetered(stats),
                            new int[] {transport}, /*slicedByFgbg=*/true, /*slicedByTag=*/true,
                            /*slicedByMetered=*/true, TelephonyManager.NETWORK_TYPE_UNKNOWN,
                            /*subInfo=*/null, oemManaged));
                }
            }
        }

        return ret;
    }

    /**
     * Create a snapshot of NetworkStats for a given transport.
     */
@@ -1229,7 +1292,8 @@ public class StatsPullAtomService extends SystemService {
            if (stats != null) {
                ret.add(new NetworkStatsExt(sliceNetworkStatsByFgbg(stats),
                        new int[] {TRANSPORT_CELLULAR}, /*slicedByFgbg=*/true,
                        /*slicedByTag=*/false, /*slicedByMetered=*/false, ratType, subInfo));
                        /*slicedByTag=*/false, /*slicedByMetered=*/false, ratType, subInfo,
                        OEM_MANAGED_ALL));
            }
        }
        return ret;
@@ -1374,6 +1438,19 @@ public class StatsPullAtomService extends SystemService {
        );
    }

    private void registerOemManagedBytesTransfer() {
        int tagId = FrameworkStatsLog.OEM_MANAGED_BYTES_TRANSFER;
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
                .setAdditiveFields(new int[] {5, 6, 7, 8})
                .build();
        mStatsManager.setPullAtomCallback(
                tagId,
                metadata,
                BackgroundThread.getExecutor(),
                mStatsCallbackImpl
        );
    }

    private void registerBluetoothBytesTransfer() {
        int tagId = FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER;
        PullAtomMetadata metadata = new PullAtomMetadata.Builder()
+8 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.stats.pull.netstats;

import static android.net.NetworkTemplate.OEM_MANAGED_ALL;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.NetworkStats;
@@ -37,17 +39,18 @@ public class NetworkStatsExt {
    public final boolean slicedByTag;
    public final boolean slicedByMetered;
    public final int ratType;
    public final int oemManaged;
    @Nullable
    public final SubInfo subInfo;

    public NetworkStatsExt(@NonNull NetworkStats stats, int[] transports, boolean slicedByFgbg) {
        this(stats, transports, slicedByFgbg, /*slicedByTag=*/false, /*slicedByMetered=*/false,
                TelephonyManager.NETWORK_TYPE_UNKNOWN, /*subInfo=*/null);
                TelephonyManager.NETWORK_TYPE_UNKNOWN, /*subInfo=*/null, OEM_MANAGED_ALL);
    }

    public NetworkStatsExt(@NonNull NetworkStats stats, int[] transports, boolean slicedByFgbg,
            boolean slicedByTag, boolean slicedByMetered, int ratType,
            @Nullable SubInfo subInfo) {
            @Nullable SubInfo subInfo, int oemManaged) {
        this.stats = stats;

        // Sort transports array so that we can test for equality without considering order.
@@ -59,6 +62,7 @@ public class NetworkStatsExt {
        this.slicedByMetered = slicedByMetered;
        this.ratType = ratType;
        this.subInfo = subInfo;
        this.oemManaged = oemManaged;
    }

    /**
@@ -67,6 +71,7 @@ public class NetworkStatsExt {
    public boolean hasSameSlicing(@NonNull NetworkStatsExt other) {
        return Arrays.equals(transports, other.transports) && slicedByFgbg == other.slicedByFgbg
                && slicedByTag == other.slicedByTag && slicedByMetered == other.slicedByMetered
                && ratType == other.ratType && Objects.equals(subInfo, other.subInfo);
                && ratType == other.ratType && Objects.equals(subInfo, other.subInfo)
                && oemManaged == other.oemManaged;
    }
}