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

Commit a44a2100 authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Android (Google) Code Review
Browse files

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

parents 639fa579 d807ffe4
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