summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/system-current.txt1
-rw-r--r--core/java/android/app/ActivityManager.java41
-rw-r--r--core/java/android/app/IActivityManager.aidl1
-rw-r--r--core/java/android/app/activity_manager.aconfig9
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java7
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 */);
}
/**