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

Commit d807ffe4 authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Add an API to bulk query broadcast response stats for all pkgs.

Bug: 217567456
Test: atest tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
Change-Id: I12853fdfb8a7b70eac935cf6aab23a388d2b7005
parent f13ace95
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -2507,9 +2507,10 @@ package android.app.time {
package android.app.usage {
  public final class BroadcastResponseStats implements android.os.Parcelable {
    ctor public BroadcastResponseStats(@NonNull String);
    ctor public BroadcastResponseStats(@NonNull String, @IntRange(from=1) long);
    method public int describeContents();
    method @IntRange(from=0) public int getBroadcastsDispatchedCount();
    method @IntRange(from=1) public long getId();
    method @IntRange(from=0) public int getNotificationsCancelledCount();
    method @IntRange(from=0) public int getNotificationsPostedCount();
    method @IntRange(from=0) public int getNotificationsUpdatedCount();
@@ -2566,13 +2567,13 @@ package android.app.usage {
  }
  public final class UsageStatsManager {
    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void clearBroadcastResponseStats(@NonNull String, @IntRange(from=1) long);
    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void clearBroadcastResponseStats(@Nullable String, @IntRange(from=0) long);
    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getAppStandbyBucket(String);
    method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public java.util.Map<java.lang.String,java.lang.Integer> getAppStandbyBuckets();
    method @RequiresPermission(allOf={android.Manifest.permission.INTERACT_ACROSS_USERS, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long getLastTimeAnyComponentUsed(@NonNull String);
    method public int getUsageSource();
    method @RequiresPermission(android.Manifest.permission.BIND_CARRIER_SERVICES) public void onCarrierPrivilegedAppsChanged();
    method @NonNull @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public android.app.usage.BroadcastResponseStats queryBroadcastResponseStats(@NonNull String, @IntRange(from=1) long);
    method @NonNull @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public java.util.List<android.app.usage.BroadcastResponseStats> queryBroadcastResponseStats(@Nullable String, @IntRange(from=0) long);
    method @RequiresPermission(allOf={android.Manifest.permission.SUSPEND_APPS, android.Manifest.permission.OBSERVE_APP_USAGE}) public void registerAppUsageLimitObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @Nullable android.app.PendingIntent);
    method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerAppUsageObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent);
    method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerUsageSessionObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @NonNull android.app.PendingIntent, @Nullable android.app.PendingIntent);
+52 −2
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.app.BroadcastOptions;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.Objects;

/**
 * Class containing a collection of stats related to response events started from an app
 * after receiving a broadcast.
@@ -32,17 +34,30 @@ import android.os.Parcelable;
@SystemApi
public final class BroadcastResponseStats implements Parcelable {
    private final String mPackageName;
    private final long mId;
    private int mBroadcastsDispatchedCount;
    private int mNotificationsPostedCount;
    private int mNotificationsUpdatedCount;
    private int mNotificationsCancelledCount;

    public BroadcastResponseStats(@NonNull String packageName) {
    /**
     * Creates a new {@link BroadcastResponseStats} object that contain the stats for broadcasts
     * with {@code id} (specified using
     * {@link BroadcastOptions#recordResponseEventWhileInBackground(long)} by the sender) that
     * were sent to {@code packageName}.
     *
     * @param packageName the name of the package that broadcasts were sent to.
     * @param id the ID specified by the sender using
     *           {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}.
     */
    public BroadcastResponseStats(@NonNull String packageName, @IntRange(from = 1) long id) {
        mPackageName = packageName;
        mId = id;
    }

    private BroadcastResponseStats(@NonNull Parcel in) {
        mPackageName = in.readString8();
        mId = in.readLong();
        mBroadcastsDispatchedCount = in.readInt();
        mNotificationsPostedCount = in.readInt();
        mNotificationsUpdatedCount = in.readInt();
@@ -57,6 +72,14 @@ public final class BroadcastResponseStats implements Parcelable {
        return mPackageName;
    }

    /**
     * @return the ID of the broadcasts that the stats in this object correspond to.
     */
    @IntRange(from = 1)
    public long getId() {
        return mId;
    }

    /**
     * Returns the total number of broadcasts that were dispatched to the app by the caller.
     *
@@ -147,10 +170,36 @@ public final class BroadcastResponseStats implements Parcelable {
        incrementNotificationsCancelledCount(stats.getNotificationsCancelledCount());
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || !(obj instanceof BroadcastResponseStats)) {
            return false;
        }
        final BroadcastResponseStats other = (BroadcastResponseStats) obj;
        return this.mBroadcastsDispatchedCount == other.mBroadcastsDispatchedCount
                && this.mNotificationsPostedCount == other.mNotificationsPostedCount
                && this.mNotificationsUpdatedCount == other.mNotificationsUpdatedCount
                && this.mNotificationsCancelledCount == other.mNotificationsCancelledCount
                && this.mId == other.mId
                && this.mPackageName.equals(other.mPackageName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mPackageName, mId, mBroadcastsDispatchedCount,
                mNotificationsPostedCount, mNotificationsUpdatedCount,
                mNotificationsCancelledCount);
    }

    @Override
    public @NonNull String toString() {
        return "stats {"
                + "broadcastsSent=" + mBroadcastsDispatchedCount
                + "package=" + mPackageName
                + ",id=" + mId
                + ",broadcastsSent=" + mBroadcastsDispatchedCount
                + ",notificationsPosted=" + mNotificationsPostedCount
                + ",notificationsUpdated=" + mNotificationsUpdatedCount
                + ",notificationsCancelled=" + mNotificationsCancelledCount
@@ -165,6 +214,7 @@ public final class BroadcastResponseStats implements Parcelable {
    @Override
    public void writeToParcel(@NonNull Parcel dest, @WriteFlags int flags) {
        dest.writeString8(mPackageName);
        dest.writeLong(mId);
        dest.writeInt(mBroadcastsDispatchedCount);
        dest.writeInt(mNotificationsPostedCount);
        dest.writeInt(mNotificationsUpdatedCount);
+20 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.app.usage;

/** {@hide} */
parcelable BroadcastResponseStatsList;
 No newline at end of file
+83 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.app.usage;

import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/** @hide */
public final class BroadcastResponseStatsList implements Parcelable {
    private List<BroadcastResponseStats> mBroadcastResponseStats;

    public BroadcastResponseStatsList(
            @NonNull List<BroadcastResponseStats> broadcastResponseStats) {
        mBroadcastResponseStats = broadcastResponseStats;
    }

    private BroadcastResponseStatsList(@NonNull Parcel in) {
        mBroadcastResponseStats = new ArrayList<>();
        final byte[] bytes = in.readBlob();
        final Parcel data = Parcel.obtain();
        try {
            data.unmarshall(bytes, 0, bytes.length);
            data.setDataPosition(0);
            data.readTypedList(mBroadcastResponseStats, BroadcastResponseStats.CREATOR);
        } finally {
            data.recycle();
        }
    }

    @NonNull
    public List<BroadcastResponseStats> getList() {
        return mBroadcastResponseStats == null ? Collections.emptyList() : mBroadcastResponseStats;
    }

    @Override
    public @ContentsFlags int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, @WriteFlags int flags) {
        final Parcel data = Parcel.obtain();
        try {
            data.writeTypedList(mBroadcastResponseStats);
            dest.writeBlob(data.marshall());
        } finally {
            data.recycle();
        }
    }

    public static final @NonNull Creator<BroadcastResponseStatsList> CREATOR =
            new Creator<BroadcastResponseStatsList>() {
                @Override
                public @NonNull BroadcastResponseStatsList createFromParcel(
                        @NonNull Parcel source) {
                    return new BroadcastResponseStatsList(source);
                }

                @Override
                public @NonNull BroadcastResponseStatsList[] newArray(int size) {
                    return new BroadcastResponseStatsList[size];
                }
            };
}
+4 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.app.usage;

import android.app.PendingIntent;
import android.app.usage.BroadcastResponseStats;
import android.app.usage.BroadcastResponseStatsList;
import android.app.usage.UsageEvents;
import android.content.pm.ParceledListSlice;

@@ -73,9 +74,11 @@ interface IUsageStatsManager {
    void forceUsageSourceSettingRead();
    long getLastTimeAnyComponentUsed(String packageName, String callingPackage);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)")
    BroadcastResponseStats queryBroadcastResponseStats(
    BroadcastResponseStatsList queryBroadcastResponseStats(
            String packageName, long id, String callingPackage, int userId);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)")
    void clearBroadcastResponseStats(String packageName, long id, String callingPackage,
            int userId);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)")
    void clearBroadcastEvents(String callingPackage, int userId);
}
Loading