diff options
3 files changed, 42 insertions, 0 deletions
diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl index 4ae0a5733f08..3b5990181d8b 100644 --- a/core/java/android/permission/IPermissionManager.aidl +++ b/core/java/android/permission/IPermissionManager.aidl @@ -98,6 +98,8 @@ interface IPermissionManager { IBinder registerAttributionSource(in AttributionSourceState source); + int getNumRegisteredAttributionSources(int uid); + boolean isRegisteredAttributionSource(in AttributionSourceState source); int checkPermission(String packageName, String permissionName, String persistentDeviceId, diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index fe3fa8cf34f5..2daf4ac8226e 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -1675,6 +1675,21 @@ public final class PermissionManager { } /** + * Gets the number of currently registered attribution sources for a particular UID. This should + * only be used for testing purposes. + * @hide + */ + @RequiresPermission(Manifest.permission.UPDATE_APP_OPS_STATS) + public int getNumRegisteredAttributionSourcesForTest(int uid) { + try { + return mPermissionManager.getNumRegisteredAttributionSources(uid); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + return -1; + } + + /** * Revoke the POST_NOTIFICATIONS permission, without killing the app. This method must ONLY BE * USED in CTS or local tests. * diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index bd0501d920c4..20c5b5f8a308 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -462,6 +462,11 @@ public class PermissionManagerService extends IPermissionManager.Stub { } @Override + public int getNumRegisteredAttributionSources(int uid) { + return mAttributionSourceRegistry.getNumRegisteredAttributionSources(uid); + } + + @Override public List<String> getAutoRevokeExemptionRequestedPackages(int userId) { return getPackagesWithAutoRevokePolicy(AUTO_REVOKE_DISCOURAGED, userId); } @@ -938,6 +943,26 @@ public class PermissionManagerService extends IPermissionManager.Stub { } } + public int getNumRegisteredAttributionSources(int uid) { + mContext.enforceCallingOrSelfPermission(UPDATE_APP_OPS_STATS, + "getting the number of registered AttributionSources requires " + + "UPDATE_APP_OPS_STATS"); + // Influence the system to perform a garbage collection, so the provided number is as + // accurate as possible + System.gc(); + System.gc(); + synchronized (mLock) { + int[] numForUid = { 0 }; + mAttributions.forEach((key, value) -> { + if (value.getUid() == uid) { + numForUid[0]++; + } + + }); + return numForUid[0]; + } + } + private int resolveUid(int uid) { final VoiceInteractionManagerInternal vimi = LocalServices .getService(VoiceInteractionManagerInternal.class); |