diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl index 429551722bfd8..49543a1e3d994 100644 --- a/core/java/android/app/usage/IUsageStatsManager.aidl +++ b/core/java/android/app/usage/IUsageStatsManager.aidl @@ -87,6 +87,8 @@ interface IUsageStatsManager { int userId); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RESPONSE_STATS)") void clearBroadcastEvents(String callingPackage, int userId); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.DUMP)") + boolean isPackageExemptedFromBroadcastResponseStats(String packageName, int userId); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG)") String getAppStandbyConstant(String key); } diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index 4b0ca28266565..ecf164394c315 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -1528,6 +1528,22 @@ public final class UsageStatsManager { } } + /** + * Checks whether the given {@code packageName} is exempted from broadcast response tracking. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.DUMP) + @UserHandleAware + public boolean isPackageExemptedFromBroadcastResponseStats(@NonNull String packageName) { + try { + return mService.isPackageExemptedFromBroadcastResponseStats(packageName, + mContext.getUserId()); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + /** @hide */ @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) @Nullable diff --git a/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java b/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java index c47d459f20c4a..d9cbea95e5637 100644 --- a/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java +++ b/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java @@ -292,6 +292,19 @@ class BroadcastResponseStatsTracker { } } + boolean isPackageExemptedFromBroadcastResponseStats(@NonNull String packageName, + @NonNull UserHandle user) { + synchronized (mLock) { + if (doesPackageHoldExemptedPermission(packageName, user)) { + return true; + } + if (doesPackageHoldExemptedRole(packageName, user)) { + return true; + } + return false; + } + } + boolean doesPackageHoldExemptedRole(@NonNull String packageName, @NonNull UserHandle user) { final List exemptedRoles = mAppStandby.getBroadcastResponseExemptedRoles(); synchronized (mLock) { diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 43cebe83c5382..e738d292a0f94 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -2866,6 +2866,18 @@ public class UsageStatsService extends SystemService implements mResponseStatsTracker.clearBroadcastEvents(callingUid, userId); } + @Override + public boolean isPackageExemptedFromBroadcastResponseStats(@NonNull String callingPackage, + @UserIdInt int userId) { + Objects.requireNonNull(callingPackage); + + getContext().enforceCallingOrSelfPermission( + android.Manifest.permission.DUMP, + "isPackageExemptedFromBroadcastResponseStats"); + return mResponseStatsTracker.isPackageExemptedFromBroadcastResponseStats( + callingPackage, UserHandle.of(userId)); + } + @Override @Nullable public String getAppStandbyConstant(@NonNull String key) {