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

Commit a1e47e9f authored by Muhammad Qureshi's avatar Muhammad Qureshi
Browse files

Create REGISTER_STATS_PULL_ATOM permission

Create a permission to allow clients to register pull atom callbacks to
statsd. This permission should allow mainline modules and other platform
clients register puller callbacks, but is not intended for 3p apps.

Bug: 146462168
Test: atest CtsPermission2TestCases
Change-Id: Iea50d137e2cc9f34644c8aa9548a7445f5ec16b8
parent 394b62bc
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -476,7 +476,7 @@ public final class StatsManager {
    /**
     * Registers a callback for an atom when that atom is to be pulled. The stats service will
     * invoke pullData in the callback when the stats service determines that this atom needs to be
     * pulled.
     * pulled. This method should not be called by third-party apps.
     *
     * @param atomTag           The tag of the atom for this puller callback.
     * @param metadata          Optional metadata specifying the timeout, cool down time, and
@@ -485,6 +485,7 @@ public final class StatsManager {
     * @param executor          The executor in which to run the callback.
     *
     */
    @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM)
    public void registerPullAtomCallback(int atomTag, @Nullable PullAtomMetadata metadata,
            @NonNull @CallbackExecutor Executor executor,
            @NonNull StatsPullAtomCallback callback) {
@@ -510,11 +511,12 @@ public final class StatsManager {

    /**
     * Unregisters a callback for an atom when that atom is to be pulled. Note that any ongoing
     * pulls will still occur.
     * pulls will still occur. This method should not be called by third-party apps.
     *
     * @param atomTag           The tag of the atom of which to unregister
     *
     */
    @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM)
    public void unregisterPullAtomCallback(int atomTag) {
        synchronized (sLock) {
            try {
+11 −2
Original line number Diff line number Diff line
@@ -171,8 +171,8 @@ public class StatsManagerService extends IStatsManagerService.Stub {
    @Override
    public void registerPullAtomCallback(int atomTag, long coolDownNs, long timeoutNs,
            int[] additiveFields, IPullAtomCallback pullerCallback) {
        enforceRegisterStatsPullAtomPermission();
        int callingUid = Binder.getCallingUid();
        final long token = Binder.clearCallingIdentity();
        PullerKey key = new PullerKey(callingUid, atomTag);
        PullerValue val = new PullerValue(coolDownNs, timeoutNs, additiveFields, pullerCallback);

@@ -187,6 +187,7 @@ public class StatsManagerService extends IStatsManagerService.Stub {
            return;
        }

        final long token = Binder.clearCallingIdentity();
        try {
            statsd.registerPullAtomCallback(
                    callingUid, atomTag, coolDownNs, timeoutNs, additiveFields, pullerCallback);
@@ -199,8 +200,8 @@ public class StatsManagerService extends IStatsManagerService.Stub {

    @Override
    public void unregisterPullAtomCallback(int atomTag) {
        enforceRegisterStatsPullAtomPermission();
        int callingUid = Binder.getCallingUid();
        final long token = Binder.clearCallingIdentity();
        PullerKey key = new PullerKey(callingUid, atomTag);

        // Always remove the puller from StatsManagerService even if statsd is down. When statsd
@@ -214,6 +215,7 @@ public class StatsManagerService extends IStatsManagerService.Stub {
            return;
        }

        final long token = Binder.clearCallingIdentity();
        try {
            statsd.unregisterPullAtomCallback(callingUid, atomTag);
        } catch (RemoteException e) {
@@ -502,6 +504,13 @@ public class StatsManagerService extends IStatsManagerService.Stub {
        }
    }

    private void enforceRegisterStatsPullAtomPermission() {
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.REGISTER_STATS_PULL_ATOM,
                "Need REGISTER_STATS_PULL_ATOM permission.");
    }


    /**
     * Clients should call this if blocking until statsd to be ready is desired
     *
+3 −2
Original line number Diff line number Diff line
@@ -188,6 +188,7 @@ package android {
    field public static final String REGISTER_CALL_PROVIDER = "android.permission.REGISTER_CALL_PROVIDER";
    field public static final String REGISTER_CONNECTION_MANAGER = "android.permission.REGISTER_CONNECTION_MANAGER";
    field public static final String REGISTER_SIM_SUBSCRIPTION = "android.permission.REGISTER_SIM_SUBSCRIPTION";
    field public static final String REGISTER_STATS_PULL_ATOM = "android.permission.REGISTER_STATS_PULL_ATOM";
    field public static final String REMOTE_DISPLAY_PROVIDER = "android.permission.REMOTE_DISPLAY_PROVIDER";
    field public static final String REMOVE_DRM_CERTIFICATES = "android.permission.REMOVE_DRM_CERTIFICATES";
    field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
@@ -692,7 +693,7 @@ package android.app {
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] getRegisteredExperimentIds() throws android.app.StatsManager.StatsUnavailableException;
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
    method public void registerPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback);
    method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void registerPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback);
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
@@ -700,7 +701,7 @@ package android.app {
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
    method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
    method public void unregisterPullAtomCallback(int);
    method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void unregisterPullAtomCallback(int);
    field public static final String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
    field public static final String EXTRA_STATS_ACTIVE_CONFIG_KEYS = "android.app.extra.STATS_ACTIVE_CONFIG_KEYS";
    field public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
+5 −0
Original line number Diff line number Diff line
@@ -4057,6 +4057,11 @@
    <permission android:name="android.permission.STATSCOMPANION"
        android:protectionLevel="signature" />

    <!--@SystemApi @hide Allows an application to register stats pull atom callbacks.
    <p>Not for use by third-party applications.-->
    <permission android:name="android.permission.REGISTER_STATS_PULL_ATOM"
                android:protectionLevel="signature|privileged" />

    <!-- @SystemApi Allows an application to control the backup and restore process.
    <p>Not for use by third-party applications.
         @hide pending API council -->