From 86874754becd233c2a84a6783d888f1d0c776f67 Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Fri, 21 Jul 2023 19:10:15 -0700 Subject: [PATCH] Allow checking if a pkg is exempted from bcast response tracking. Bug: 291793661 Test: atest tests/tests/app.usage/src/android/app/usage/cts/BroadcastResponseStatsTest.java Change-Id: I837eaaefa0d900a5b25e8a861f3b67aa4509f08f --- .../android/app/usage/IUsageStatsManager.aidl | 2 ++ .../android/app/usage/UsageStatsManager.java | 16 ++++++++++++++++ .../usage/BroadcastResponseStatsTracker.java | 13 +++++++++++++ .../android/server/usage/UsageStatsService.java | 12 ++++++++++++ 4 files changed, 43 insertions(+) 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) {