diff options
| -rw-r--r-- | core/api/system-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/app/ActivityManager.java | 41 | ||||
| -rw-r--r-- | core/java/android/app/IActivityManager.aidl | 1 | ||||
| -rw-r--r-- | core/java/android/app/activity_manager.aconfig | 9 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 7 |
5 files changed, 47 insertions, 12 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index c394ab7d9f7e..00755f28b12c 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -554,6 +554,7 @@ package android.app { public class ActivityManager { method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int); + method @FlaggedApi("android.app.uid_importance_listener_for_uids") @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(@NonNull android.app.ActivityManager.OnUidImportanceListener, int, @Nullable int[]); method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String); method @FlaggedApi("android.app.get_binding_uid_importance") @RequiresPermission(android.Manifest.permission.GET_BINDING_UID_IMPORTANCE) public int getBindingUidImportance(int); method @RequiresPermission(anyOf={"android.permission.INTERACT_ACROSS_USERS", "android.permission.INTERACT_ACROSS_USERS_FULL"}) public static int getCurrentUser(); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 1fd49ef43e93..5318bb722b5f 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -4402,7 +4402,7 @@ public class ActivityManager { } /** - * Start monitoring changes to the importance of uids running in the system. + * Start monitoring changes to the importance of all uids running in the system. * @param listener The listener callback that will receive change reports. * @param importanceCutpoint The level of importance in which the caller is interested * in differences. For example, if {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE} @@ -4422,17 +4422,48 @@ public class ActivityManager { @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(OnUidImportanceListener listener, @RunningAppProcessInfo.Importance int importanceCutpoint) { - synchronized (this) { + addOnUidImportanceListenerInternal(listener, importanceCutpoint, null /* uids */); + } + + /** + * Start monitoring changes to the importance of given uids running in the system. + * + * @param listener The listener callback that will receive change reports. + * @param importanceCutpoint The level of importance in which the caller is interested + * in differences. For example, if {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE} + * is used here, you will receive a call each time a uids importance transitions between + * being <= {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE} and + * > {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE}. + * @param uids The UIDs that this listener is interested with. A {@code null} value means + * all UIDs will be monitored by this listener, this will be equivalent to the + * {@link #addOnUidImportanceListener(OnUidImportanceListener, int)} in this case. + * + * @throws IllegalArgumentException If the listener is already registered. + * @hide + */ + @FlaggedApi(Flags.FLAG_UID_IMPORTANCE_LISTENER_FOR_UIDS) + @SystemApi + @SuppressLint("SamShouldBeLast") + @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) + public void addOnUidImportanceListener(@NonNull OnUidImportanceListener listener, + @RunningAppProcessInfo.Importance int importanceCutpoint, @Nullable int[] uids) { + addOnUidImportanceListenerInternal(listener, importanceCutpoint, uids); + } + + @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) + private void addOnUidImportanceListenerInternal(@NonNull OnUidImportanceListener listener, + @RunningAppProcessInfo.Importance int importanceCutpoint, @Nullable int[] uids) { + synchronized (mImportanceListeners) { if (mImportanceListeners.containsKey(listener)) { throw new IllegalArgumentException("Listener already registered: " + listener); } // TODO: implement the cut point in the system process to avoid IPCs. MyUidObserver observer = new MyUidObserver(listener, mContext); try { - getService().registerUidObserver(observer, + getService().registerUidObserverForUids(observer, UID_OBSERVER_PROCSTATE | UID_OBSERVER_GONE, RunningAppProcessInfo.importanceToProcState(importanceCutpoint), - mContext.getOpPackageName()); + mContext.getOpPackageName(), uids); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -4450,7 +4481,7 @@ public class ActivityManager { @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(OnUidImportanceListener listener) { - synchronized (this) { + synchronized (mImportanceListeners) { MyUidObserver observer = mImportanceListeners.remove(listener); if (observer == null) { throw new IllegalArgumentException("Listener not registered: " + listener); diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index b5d88e878d8d..47403d26c907 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -116,6 +116,7 @@ interface IActivityManager { * @throws RemoteException * @return Returns A binder token identifying the UidObserver registration. */ + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)") IBinder registerUidObserverForUids(in IUidObserver observer, int which, int cutpoint, String callingPackage, in int[] uids); diff --git a/core/java/android/app/activity_manager.aconfig b/core/java/android/app/activity_manager.aconfig index 4fc25fd8c699..c0b299b77806 100644 --- a/core/java/android/app/activity_manager.aconfig +++ b/core/java/android/app/activity_manager.aconfig @@ -19,4 +19,11 @@ flag { name: "app_restrictions_api" description: "API to track and query restrictions applied to apps" bug: "320150834" -}
\ No newline at end of file +} + +flag { + namespace: "backstage_power" + name: "uid_importance_listener_for_uids" + description: "API to add OnUidImportanceListener with targetted UIDs" + bug: "286258140" +} diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f6d954a69044..c9bd0b4c4648 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7823,12 +7823,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void registerUidObserver(IUidObserver observer, int which, int cutpoint, String callingPackage) { - if (!hasUsageStatsPermission(callingPackage)) { - enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, - "registerUidObserver"); - } - mUidObserverController.register(observer, which, cutpoint, callingPackage, - Binder.getCallingUid(), /*uids*/null); + registerUidObserverForUids(observer, which, cutpoint, callingPackage, null /* uids */); } /** |