/* * 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.IntRange; import android.annotation.NonNull; import android.annotation.SystemApi; 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. * * @see UsageStatsManager#queryBroadcastResponseStats(String, long) * @see UsageStatsManager#clearBroadcastResponseStats(String, long) * @hide */ @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; /** * 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(); mNotificationsCancelledCount = in.readInt(); } /** * @return the name of the package that the stats in this object correspond to. */ @NonNull public String getPackageName() { 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. * * Note that the returned count will only include the broadcasts that the caller explicitly * requested to record using * {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}. * * @return the total number of broadcasts that were dispatched to the app. */ @IntRange(from = 0) public int getBroadcastsDispatchedCount() { return mBroadcastsDispatchedCount; } /** * Returns the total number of notifications posted by the app soon after receiving a * broadcast. * * Note that the returned count will only include the notifications that correspond to the * broadcasts that the caller explicitly requested to record using * {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}. * * @return the total number of notifications posted by the app soon after receiving * a broadcast. */ @IntRange(from = 0) public int getNotificationsPostedCount() { return mNotificationsPostedCount; } /** * Returns the total number of notifications updated by the app soon after receiving a * broadcast. * * Note that the returned count will only include the notifications that correspond to the * broadcasts that the caller explicitly requested to record using * {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}. * * @return the total number of notifications updated by the app soon after receiving * a broadcast. */ @IntRange(from = 0) public int getNotificationsUpdatedCount() { return mNotificationsUpdatedCount; } /** * Returns the total number of notifications cancelled by the app soon after receiving a * broadcast. * * Note that the returned count will only include the notifications that correspond to the * broadcasts that the caller explicitly requested to record using * {@link BroadcastOptions#recordResponseEventWhileInBackground(long)}. * * @return the total number of notifications cancelled by the app soon after receiving * a broadcast. */ @IntRange(from = 0) public int getNotificationsCancelledCount() { return mNotificationsCancelledCount; } /** @hide */ public void incrementBroadcastsDispatchedCount(@IntRange(from = 0) int count) { mBroadcastsDispatchedCount += count; } /** @hide */ public void incrementNotificationsPostedCount(@IntRange(from = 0) int count) { mNotificationsPostedCount += count; } /** @hide */ public void incrementNotificationsUpdatedCount(@IntRange(from = 0) int count) { mNotificationsUpdatedCount += count; } /** @hide */ public void incrementNotificationsCancelledCount(@IntRange(from = 0) int count) { mNotificationsCancelledCount += count; } /** @hide */ public void addCounts(@NonNull BroadcastResponseStats stats) { incrementBroadcastsDispatchedCount(stats.getBroadcastsDispatchedCount()); incrementNotificationsPostedCount(stats.getNotificationsPostedCount()); incrementNotificationsUpdatedCount(stats.getNotificationsUpdatedCount()); 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 {" + "package=" + mPackageName + ",id=" + mId + ",broadcastsSent=" + mBroadcastsDispatchedCount + ",notificationsPosted=" + mNotificationsPostedCount + ",notificationsUpdated=" + mNotificationsUpdatedCount + ",notificationsCancelled=" + mNotificationsCancelledCount + "}"; } @Override public @ContentsFlags int describeContents() { return 0; } @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); dest.writeInt(mNotificationsCancelledCount); } public static final @NonNull Creator CREATOR = new Creator() { @Override public @NonNull BroadcastResponseStats createFromParcel(@NonNull Parcel source) { return new BroadcastResponseStats(source); } @Override public @NonNull BroadcastResponseStats[] newArray(int size) { return new BroadcastResponseStats[size]; } }; }