From e53769318a7cc6ceee033847fe1b980872e8b24b Mon Sep 17 00:00:00 2001 From: Mark Fasheh Date: Mon, 20 Mar 2023 01:08:34 +0000 Subject: [PATCH] ActivityManager: Throw correct exception during Uid Frozen registration registerUidFrozenStateChangedCallback is throwing IllegalArgumentException, but the javadoc says it throws IllegalStateException. We want to follow the doc in this case so fix the function to throw IllegalStateException. While we're here we can add some missing permission and Null checks. We were also missing a description for onUidFrozenStateChanged, add one. Bug: 274010383 Test: Compiled Change-Id: Ie798ba87f043a8a45a8d3233d275ccab9f97d14f --- core/java/android/app/ActivityManager.java | 9 +++++++-- core/java/android/app/IActivityManager.aidl | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 981f14020370e..929c07bc1dc5a 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -234,7 +234,7 @@ public class ActivityManager { * Map of callbacks that have registered for {@link UidFrozenStateChanged} events. * Will be called when a Uid has become frozen or unfrozen. */ - final ArrayMap mFrozenStateChangedCallbacks = + private final ArrayMap mFrozenStateChangedCallbacks = new ArrayMap<>(); private final IUidFrozenStateChangedCallback mFrozenStateChangedCallback = @@ -284,6 +284,8 @@ public class ActivityManager { public @interface UidFrozenState {} /** + * Notify the client that the frozen states of an array of UIDs have changed. + * * @param uids The UIDs for which the frozen state has changed * @param frozenStates Frozen state for each UID index, Will be set to * {@link UidFrozenStateChangedCallback#UID_FROZEN_STATE_FROZEN} @@ -316,9 +318,11 @@ public class ActivityManager { public void registerUidFrozenStateChangedCallback( @NonNull Executor executor, @NonNull UidFrozenStateChangedCallback callback) { + Preconditions.checkNotNull(executor, "executor cannot be null"); + Preconditions.checkNotNull(callback, "callback cannot be null"); synchronized (mFrozenStateChangedCallbacks) { if (mFrozenStateChangedCallbacks.containsKey(callback)) { - throw new IllegalArgumentException("Callback already registered: " + callback); + throw new IllegalStateException("Callback already registered: " + callback); } mFrozenStateChangedCallbacks.put(callback, executor); if (mFrozenStateChangedCallbacks.size() > 1) { @@ -344,6 +348,7 @@ public class ActivityManager { @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public void unregisterUidFrozenStateChangedCallback( @NonNull UidFrozenStateChangedCallback callback) { + Preconditions.checkNotNull(callback, "callback cannot be null"); synchronized (mFrozenStateChangedCallbacks) { mFrozenStateChangedCallbacks.remove(callback); if (mFrozenStateChangedCallbacks.isEmpty()) { diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 2879062248a87..403acad6bba12 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -879,6 +879,8 @@ interface IActivityManager { /** Logs API state change to associate with an FGS, used for FGS Type Metrics */ void logFgsApiStateChanged(int apiType, int state, int appUid, int appPid); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)") void registerUidFrozenStateChangedCallback(in IUidFrozenStateChangedCallback callback); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)") void unregisterUidFrozenStateChangedCallback(in IUidFrozenStateChangedCallback callback); }