Implement system API for monitoring uid importance changes.
Changed the permission for registerUidObserver to be
PACKAGE_USAGE_STATS, which better matches the semantics of this
API and is accessible to system apps.
Test: Added testUidImportanceListener()
Change-Id: Ib47d02bd654fbe399a9c92550c89ecbd38f928dc
diff --git a/api/current.txt b/api/current.txt
index 2e99eaf..22871fa 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11800,14 +11800,14 @@
method public deprecated boolean clipRegion(android.graphics.Region);
method public void concat(android.graphics.Matrix);
method public void drawARGB(int, int, int, int);
- method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
+ method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
method public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
method public void drawCircle(float, float, float, android.graphics.Paint);
method public void drawColor(int);
@@ -11815,28 +11815,28 @@
method public void drawLine(float, float, float, float, android.graphics.Paint);
method public void drawLines(float[], int, int, android.graphics.Paint);
method public void drawLines(float[], android.graphics.Paint);
- method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawOval(android.graphics.RectF, android.graphics.Paint);
+ method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawPaint(android.graphics.Paint);
method public void drawPath(android.graphics.Path, android.graphics.Paint);
method public void drawPicture(android.graphics.Picture);
- method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPicture(android.graphics.Picture, android.graphics.RectF);
+ method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPoint(float, float, android.graphics.Paint);
method public void drawPoints(float[], int, int, android.graphics.Paint);
method public void drawPoints(float[], android.graphics.Paint);
method public deprecated void drawPosText(char[], int, int, float[], android.graphics.Paint);
method public deprecated void drawPosText(java.lang.String, float[], android.graphics.Paint);
method public void drawRGB(int, int, int);
- method public void drawRect(float, float, float, float, android.graphics.Paint);
- method public void drawRect(android.graphics.Rect, android.graphics.Paint);
method public void drawRect(android.graphics.RectF, android.graphics.Paint);
- method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
+ method public void drawRect(android.graphics.Rect, android.graphics.Paint);
+ method public void drawRect(float, float, float, float, android.graphics.Paint);
method public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
+ method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
method public void drawText(char[], int, int, float, float, android.graphics.Paint);
- method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
+ method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
@@ -32103,6 +32103,15 @@
field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.document/directory";
}
+ public static final class DocumentsContract.Path implements android.os.Parcelable {
+ ctor public DocumentsContract.Path(java.lang.String, java.util.List<java.lang.String>);
+ method public int describeContents();
+ method public java.util.List<java.lang.String> getPath();
+ method public java.lang.String getRootId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.provider.DocumentsContract.Path> CREATOR;
+ }
+
public static final class DocumentsContract.Root {
field public static final java.lang.String COLUMN_AVAILABLE_BYTES = "available_bytes";
field public static final java.lang.String COLUMN_CAPACITY_BYTES = "capacity_bytes";
@@ -32120,15 +32129,6 @@
field public static final int FLAG_SUPPORTS_SEARCH = 8; // 0x8
}
- public static final class DocumentsContract.Path implements android.os.Parcelable {
- ctor public DocumentsContract.Path(java.lang.String, java.util.List<java.lang.String>);
- method public int describeContents();
- method public java.util.List<java.lang.String> getPath();
- method public java.lang.String getRootId();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.provider.DocumentsContract.Path> CREATOR;
- }
-
public abstract class DocumentsProvider extends android.content.ContentProvider {
ctor public DocumentsProvider();
method public java.lang.String copyDocument(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
diff --git a/api/system-current.txt b/api/system-current.txt
index d077808..a8a725e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -3819,6 +3819,7 @@
public class ActivityManager {
method public int addAppTask(android.app.Activity, android.content.Intent, android.app.ActivityManager.TaskDescription, android.graphics.Bitmap);
+ method public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
method public boolean clearApplicationUserData();
method public void clearWatchHeapLimit();
method public void dumpPackageState(java.io.FileDescriptor, java.lang.String);
@@ -3849,6 +3850,7 @@
method public void killUid(int, java.lang.String);
method public void moveTaskToFront(int, int);
method public void moveTaskToFront(int, int, android.os.Bundle);
+ method public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public deprecated void restartPackage(java.lang.String);
method public static void setVrThread(int);
method public void setWatchHeapLimit(long);
@@ -3883,6 +3885,10 @@
field public long totalMem;
}
+ public static abstract interface ActivityManager.OnUidImportanceListener {
+ method public abstract void onUidImportance(int, int);
+ }
+
public static class ActivityManager.ProcessErrorStateInfo implements android.os.Parcelable {
ctor public ActivityManager.ProcessErrorStateInfo();
method public int describeContents();
@@ -12251,14 +12257,14 @@
method public deprecated boolean clipRegion(android.graphics.Region);
method public void concat(android.graphics.Matrix);
method public void drawARGB(int, int, int, int);
- method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
+ method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
method public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
method public void drawCircle(float, float, float, android.graphics.Paint);
method public void drawColor(int);
@@ -12266,28 +12272,28 @@
method public void drawLine(float, float, float, float, android.graphics.Paint);
method public void drawLines(float[], int, int, android.graphics.Paint);
method public void drawLines(float[], android.graphics.Paint);
- method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawOval(android.graphics.RectF, android.graphics.Paint);
+ method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawPaint(android.graphics.Paint);
method public void drawPath(android.graphics.Path, android.graphics.Paint);
method public void drawPicture(android.graphics.Picture);
- method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPicture(android.graphics.Picture, android.graphics.RectF);
+ method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPoint(float, float, android.graphics.Paint);
method public void drawPoints(float[], int, int, android.graphics.Paint);
method public void drawPoints(float[], android.graphics.Paint);
method public deprecated void drawPosText(char[], int, int, float[], android.graphics.Paint);
method public deprecated void drawPosText(java.lang.String, float[], android.graphics.Paint);
method public void drawRGB(int, int, int);
- method public void drawRect(float, float, float, float, android.graphics.Paint);
- method public void drawRect(android.graphics.Rect, android.graphics.Paint);
method public void drawRect(android.graphics.RectF, android.graphics.Paint);
- method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
+ method public void drawRect(android.graphics.Rect, android.graphics.Paint);
+ method public void drawRect(float, float, float, float, android.graphics.Paint);
method public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
+ method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
method public void drawText(char[], int, int, float, float, android.graphics.Paint);
- method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
+ method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
diff --git a/api/test-current.txt b/api/test-current.txt
index fdaf7a3..50dfa2a 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -3699,6 +3699,7 @@
public class ActivityManager {
method public int addAppTask(android.app.Activity, android.content.Intent, android.app.ActivityManager.TaskDescription, android.graphics.Bitmap);
+ method public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
method public boolean clearApplicationUserData();
method public void clearWatchHeapLimit();
method public void dumpPackageState(java.io.FileDescriptor, java.lang.String);
@@ -3712,6 +3713,7 @@
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
+ method public int getPackageImportance(java.lang.String);
method public android.os.Debug.MemoryInfo[] getProcessMemoryInfo(int[]);
method public java.util.List<android.app.ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
method public deprecated java.util.List<android.app.ActivityManager.RecentTaskInfo> getRecentTasks(int, int) throws java.lang.SecurityException;
@@ -3726,6 +3728,7 @@
method public void killBackgroundProcesses(java.lang.String);
method public void moveTaskToFront(int, int);
method public void moveTaskToFront(int, int, android.os.Bundle);
+ method public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public deprecated void restartPackage(java.lang.String);
method public static void setVrThread(int);
method public void setWatchHeapLimit(long);
@@ -3760,6 +3763,10 @@
field public long totalMem;
}
+ public static abstract interface ActivityManager.OnUidImportanceListener {
+ method public abstract void onUidImportance(int, int);
+ }
+
public static class ActivityManager.ProcessErrorStateInfo implements android.os.Parcelable {
ctor public ActivityManager.ProcessErrorStateInfo();
method public int describeContents();
@@ -11818,14 +11825,14 @@
method public deprecated boolean clipRegion(android.graphics.Region);
method public void concat(android.graphics.Matrix);
method public void drawARGB(int, int, int, int);
- method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
+ method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
method public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
method public void drawCircle(float, float, float, android.graphics.Paint);
method public void drawColor(int);
@@ -11833,28 +11840,28 @@
method public void drawLine(float, float, float, float, android.graphics.Paint);
method public void drawLines(float[], int, int, android.graphics.Paint);
method public void drawLines(float[], android.graphics.Paint);
- method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawOval(android.graphics.RectF, android.graphics.Paint);
+ method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawPaint(android.graphics.Paint);
method public void drawPath(android.graphics.Path, android.graphics.Paint);
method public void drawPicture(android.graphics.Picture);
- method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPicture(android.graphics.Picture, android.graphics.RectF);
+ method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPoint(float, float, android.graphics.Paint);
method public void drawPoints(float[], int, int, android.graphics.Paint);
method public void drawPoints(float[], android.graphics.Paint);
method public deprecated void drawPosText(char[], int, int, float[], android.graphics.Paint);
method public deprecated void drawPosText(java.lang.String, float[], android.graphics.Paint);
method public void drawRGB(int, int, int);
- method public void drawRect(float, float, float, float, android.graphics.Paint);
- method public void drawRect(android.graphics.Rect, android.graphics.Paint);
method public void drawRect(android.graphics.RectF, android.graphics.Paint);
- method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
+ method public void drawRect(android.graphics.Rect, android.graphics.Paint);
+ method public void drawRect(float, float, float, float, android.graphics.Paint);
method public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
+ method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
method public void drawText(char[], int, int, float, float, android.graphics.Paint);
- method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
+ method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index bdca086..9af7d8b 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -22,6 +22,7 @@
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Canvas;
@@ -61,6 +62,7 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.DisplayMetrics;
import android.util.Singleton;
import android.util.Size;
@@ -87,6 +89,49 @@
private final Context mContext;
private final Handler mHandler;
+ static final class UidObserver extends IUidObserver.Stub {
+ final OnUidImportanceListener mListener;
+ final int mImportanceCutpoint;
+ int mLastImportance;
+
+ UidObserver(OnUidImportanceListener listener, int importanceCutpoint) {
+ mListener = listener;
+ mImportanceCutpoint = importanceCutpoint;
+ }
+
+ @Override
+ public void onUidStateChanged(int uid, int procState) {
+ final boolean lastAboveCut = mLastImportance <= mImportanceCutpoint;
+ final int importance = RunningAppProcessInfo.procStateToImportance(procState);
+ final boolean newAboveCut = importance <= mImportanceCutpoint;
+ /*
+ Log.d(TAG, "Uid " + uid + " state change from " + mLastImportance + " to "
+ + importance + " @ cut " + mImportanceCutpoint
+ + ": lastAbove=" + lastAboveCut + " newAbove=" + newAboveCut);
+ */
+ mLastImportance = importance;
+ if (lastAboveCut != newAboveCut) {
+ mListener.onUidImportance(uid, importance);
+ }
+ }
+
+ @Override
+ public void onUidGone(int uid) {
+ mLastImportance = RunningAppProcessInfo.IMPORTANCE_GONE;
+ mListener.onUidImportance(uid, RunningAppProcessInfo.IMPORTANCE_GONE);
+ }
+
+ @Override
+ public void onUidActive(int uid) {
+ }
+
+ @Override
+ public void onUidIdle(int uid) {
+ }
+ }
+
+ final ArrayMap<OnUidImportanceListener, UidObserver> mImportanceListeners = new ArrayMap<>();
+
/**
* Defines acceptable types of bugreports.
* @hide
@@ -3045,11 +3090,11 @@
* running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned.
* @hide
*/
- @SystemApi
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
public int getPackageImportance(String packageName) {
try {
- int procState = ActivityManagerNative.getDefault().getPackageProcessState(packageName,
+ int procState = getService().getPackageProcessState(packageName,
mContext.getOpPackageName());
return RunningAppProcessInfo.procStateToImportance(procState);
} catch (RemoteException e) {
@@ -3058,6 +3103,83 @@
}
/**
+ * Callback to get reports about changes to the importance of a uid. Use with
+ * {@link #addOnUidImportanceListener}.
+ * @hide
+ */
+ @SystemApi @TestApi
+ public interface OnUidImportanceListener {
+ /**
+ * The importance if a given uid has changed. Will be one of the importance
+ * values in {@link RunningAppProcessInfo};
+ * {@link RunningAppProcessInfo#IMPORTANCE_GONE IMPORTANCE_GONE} will be reported
+ * when the uid is no longer running at all. This callback will happen on a thread
+ * from a thread pool, not the main UI thread.
+ * @param uid The uid whose importance has changed.
+ * @param importance The new importance value as per {@link RunningAppProcessInfo}.
+ */
+ void onUidImportance(int uid, int importance);
+ }
+
+ /**
+ * Start monitoring changes to the imoportance of 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}.
+ *
+ * <p>The caller must hold the {@link android.Manifest.permission#PACKAGE_USAGE_STATS}
+ * permission to use this feature.</p>
+ *
+ * @throws IllegalArgumentException If the listener is already registered.
+ * @throws SecurityException If the caller does not hold
+ * {@link android.Manifest.permission#PACKAGE_USAGE_STATS}.
+ * @hide
+ */
+ @SystemApi @TestApi
+ public void addOnUidImportanceListener(OnUidImportanceListener listener,
+ int importanceCutpoint) {
+ synchronized (this) {
+ if (mImportanceListeners.containsKey(listener)) {
+ throw new IllegalArgumentException("Listener already registered: " + listener);
+ }
+ // TODO: implement the cut point in the system process to avoid IPCs.
+ UidObserver observer = new UidObserver(listener, importanceCutpoint);
+ try {
+ getService().registerUidObserver(observer,
+ UID_OBSERVER_PROCSTATE | UID_OBSERVER_GONE, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ mImportanceListeners.put(listener, observer);
+ }
+ }
+
+ /**
+ * Remove an importance listener that was previously registered with
+ * {@link #addOnUidImportanceListener}.
+ *
+ * @throws IllegalArgumentException If the listener is not registered.
+ * @hide
+ */
+ @SystemApi @TestApi
+ public void removeOnUidImportanceListener(OnUidImportanceListener listener) {
+ synchronized (this) {
+ UidObserver observer = mImportanceListeners.remove(listener);
+ if (observer == null) {
+ throw new IllegalArgumentException("Listener not registered: " + listener);
+ }
+ try {
+ getService().unregisterUidObserver(observer);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
* Return global memory state information for the calling process. This
* does not fill in all fields of the {@link RunningAppProcessInfo}. The
* only fields that will be filled in are
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 2498459..92d67b7 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -431,7 +431,7 @@
* etc.
*/
void keyguardGoingAway(int flags) = 296;
- void registerUidObserver(in IUidObserver observer, int which) = 297;
+ void registerUidObserver(in IUidObserver observer, int which, String callingPackage) = 297;
void unregisterUidObserver(in IUidObserver observer) = 298;
boolean isAssistDataAllowedOnCurrentActivity() = 299;
boolean showAssistFromActivity(in IBinder token, in Bundle args) = 300;
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 20cca16..8e01e9e 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -938,7 +938,7 @@
try {
ActivityManagerNative.getDefault().registerUidObserver(new UidObserver(),
- ActivityManager.UID_OBSERVER_IDLE);
+ ActivityManager.UID_OBSERVER_IDLE, null);
} catch (RemoteException e) {
// ignored; both services live in system_server
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index dd417d9..2d6832d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -12245,9 +12245,11 @@
}
@Override
- public void registerUidObserver(IUidObserver observer, int which) {
- enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
- "registerUidObserver()");
+ public void registerUidObserver(IUidObserver observer, int which, String callingPackage) {
+ if (!hasUsageStatsPermission(callingPackage)) {
+ enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
+ "registerUidObserver");
+ }
synchronized (this) {
mUidObservers.register(observer, which);
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 970da99..a37dfed 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -824,7 +824,7 @@
try {
ActivityManagerNative.getDefault().registerUidObserver(mUidObserver,
ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE
- | ActivityManager.UID_OBSERVER_IDLE);
+ | ActivityManager.UID_OBSERVER_IDLE, null);
} catch (RemoteException e) {
// ignored; both services live in system_server
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 2bccfee..d8103fc 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -611,7 +611,8 @@
try {
mActivityManager.registerUidObserver(mUidObserver,
- ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE);
+ ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE,
+ null);
mNetworkManager.registerObserver(mAlertObserver);
} catch (RemoteException e) {
// ignored; both services live in system_server
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 3b5abe8..37acf5c 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -3677,7 +3677,7 @@
@VisibleForTesting
void injectRegisterUidObserver(IUidObserver observer, int which) {
try {
- ActivityManagerNative.getDefault().registerUidObserver(observer, which);
+ ActivityManagerNative.getDefault().registerUidObserver(observer, which, null);
} catch (RemoteException shouldntHappen) {
}
}
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 25a421e..42d9412 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -246,7 +246,7 @@
Log.d(TAG, "set mUidObserver to " + mUidObserver);
return null;
}
- }).when(mActivityManager).registerUidObserver(any(), anyInt());
+ }).when(mActivityManager).registerUidObserver(any(), anyInt(), null);
mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mStatsService,
mNetworkManager, mIpm, mTime, mPolicyDir, true);