diff --git a/api/current.txt b/api/current.txt index 2e99eafc35133..22871fab9c069 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11800,14 +11800,14 @@ package android.graphics { 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 @@ package android.graphics { 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 @@ package android.provider { 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); + method public int describeContents(); + method public java.util.List getPath(); + method public java.lang.String getRootId(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator 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 @@ package android.provider { 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); - method public int describeContents(); - method public java.util.List getPath(); - method public java.lang.String getRootId(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator 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 d077808322e59..a8a725eda7716 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3819,6 +3819,7 @@ package android.app { 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 @@ package android.app { 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 @@ package android.app { 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 @@ package android.graphics { 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 @@ package android.graphics { 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 fdaf7a3b72d76..50dfa2a9c77ee 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3699,6 +3699,7 @@ package android.app { 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 @@ package android.app { 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 getProcessesInErrorState(); method public deprecated java.util.List getRecentTasks(int, int) throws java.lang.SecurityException; @@ -3726,6 +3728,7 @@ package android.app { 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 @@ package android.app { 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 @@ package android.graphics { 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 @@ package android.graphics { 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 bdca086f675d6..9af7d8bae314b 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -22,6 +22,7 @@ import android.annotation.NonNull; 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.ServiceManager; 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 @@ public class ActivityManager { 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 mImportanceListeners = new ArrayMap<>(); + /** * Defines acceptable types of bugreports. * @hide @@ -3045,11 +3090,11 @@ public class ActivityManager { * 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) { @@ -3057,6 +3102,83 @@ public class ActivityManager { } } + /** + * 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}. + * + *

The caller must hold the {@link android.Manifest.permission#PACKAGE_USAGE_STATS} + * permission to use this feature.

+ * + * @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 diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 2498459300a36..92d67b7d9f741 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -431,7 +431,7 @@ interface IActivityManager { * 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 20cca16991c9d..8e01e9eae3760 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -938,7 +938,7 @@ class AlarmManagerService extends SystemService { 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 dd417d937c53f..2d6832d32af58 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 @@ public class ActivityManagerService extends IActivityManager.Stub } @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 970da99cc2f90..a37dfed7c8299 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 @@ public final class JobSchedulerService extends com.android.server.SystemService 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 2bccfee1770a7..d8103fc3b39ea 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { 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 3b5abe8b36c5d..37acf5cc4a0fd 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 @@ public class ShortcutService extends IShortcutService.Stub { @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 25a421e0a8824..42d94124d0fe1 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 @@ public class NetworkPolicyManagerServiceTest { 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);