From e4b03b589f747bf74a43d3101537615f9f739694 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Tue, 24 Mar 2020 11:41:09 -0700 Subject: [PATCH] Pipe through attributeId to notification app-op The noteOp API without attributeId is deprecated. For @UnsupportedApi Binder calls we need to keep the old name there. Test: TH Bug: 136595429 Change-Id: Ib758b431c0842bb16ce8e8fb3a33d4524ab0878c --- .../android/app/INotificationManager.aidl | 6 ++- .../NotificationManagerService.java | 38 ++++++++++++++++--- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 948546b184736..f590eb914aac1 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -123,10 +123,14 @@ interface INotificationManager // INotificationListener method. @UnsupportedAppUsage StatusBarNotification[] getActiveNotifications(String callingPkg); + StatusBarNotification[] getActiveNotificationsWithAttribution(String callingPkg, + String callingAttributionTag); @UnsupportedAppUsage StatusBarNotification[] getHistoricalNotifications(String callingPkg, int count, boolean includeSnoozed); + StatusBarNotification[] getHistoricalNotificationsWithAttribution(String callingPkg, + String callingAttributionTag, int count, boolean includeSnoozed); - NotificationHistory getNotificationHistory(String callingPkg); + NotificationHistory getNotificationHistory(String callingPkg, String callingAttributionTag); void registerListener(in INotificationListener listener, in ComponentName component, int userid); void unregisterListener(in INotificationListener listener, int userid); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index f65f187eddc5b..9fde7ce37eec5 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3638,6 +3638,15 @@ public class NotificationManagerService extends SystemService { handleSavePolicyFile(); } + /** + * @deprecated Use {@link #getActiveNotificationsWithAttribution(String, String)} instead. + */ + @Deprecated + @Override + public StatusBarNotification[] getActiveNotifications(String callingPkg) { + return getActiveNotificationsWithAttribution(callingPkg, null); + } + /** * System-only API for getting a list of current (i.e. not cleared) notifications. * @@ -3645,7 +3654,8 @@ public class NotificationManagerService extends SystemService { * @returns A list of all the notifications, in natural order. */ @Override - public StatusBarNotification[] getActiveNotifications(String callingPkg) { + public StatusBarNotification[] getActiveNotificationsWithAttribution(String callingPkg, + String callingAttributionTag) { // enforce() will ensure the calling uid has the correct permission getContext().enforceCallingOrSelfPermission( android.Manifest.permission.ACCESS_NOTIFICATIONS, @@ -3655,7 +3665,8 @@ public class NotificationManagerService extends SystemService { int uid = Binder.getCallingUid(); // noteOp will check to make sure the callingPkg matches the uid - if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg) + if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg, + callingAttributionTag, null) == AppOpsManager.MODE_ALLOWED) { synchronized (mNotificationLock) { tmp = new StatusBarNotification[mNotificationList.size()]; @@ -3737,12 +3748,24 @@ public class NotificationManagerService extends SystemService { } /** - * System-only API for getting a list of recent (cleared, no longer shown) notifications. + * @deprecated Use {@link #getHistoricalNotificationsWithAttribution} instead. */ + @Deprecated @Override @RequiresPermission(android.Manifest.permission.ACCESS_NOTIFICATIONS) public StatusBarNotification[] getHistoricalNotifications(String callingPkg, int count, boolean includeSnoozed) { + return getHistoricalNotificationsWithAttribution(callingPkg, null, count, + includeSnoozed); + } + + /** + * System-only API for getting a list of recent (cleared, no longer shown) notifications. + */ + @Override + @RequiresPermission(android.Manifest.permission.ACCESS_NOTIFICATIONS) + public StatusBarNotification[] getHistoricalNotificationsWithAttribution(String callingPkg, + String callingAttributionTag, int count, boolean includeSnoozed) { // enforce() will ensure the calling uid has the correct permission getContext().enforceCallingOrSelfPermission( android.Manifest.permission.ACCESS_NOTIFICATIONS, @@ -3752,7 +3775,8 @@ public class NotificationManagerService extends SystemService { int uid = Binder.getCallingUid(); // noteOp will check to make sure the callingPkg matches the uid - if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg) + if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg, + callingAttributionTag, null) == AppOpsManager.MODE_ALLOWED) { synchronized (mArchive) { tmp = mArchive.getArray(count, includeSnoozed); @@ -3768,7 +3792,8 @@ public class NotificationManagerService extends SystemService { @Override @WorkerThread @RequiresPermission(android.Manifest.permission.ACCESS_NOTIFICATIONS) - public NotificationHistory getNotificationHistory(String callingPkg) { + public NotificationHistory getNotificationHistory(String callingPkg, + String callingAttributionTag) { // enforce() will ensure the calling uid has the correct permission getContext().enforceCallingOrSelfPermission( android.Manifest.permission.ACCESS_NOTIFICATIONS, @@ -3776,7 +3801,8 @@ public class NotificationManagerService extends SystemService { int uid = Binder.getCallingUid(); // noteOp will check to make sure the callingPkg matches the uid - if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg) + if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg, + callingAttributionTag, null) == AppOpsManager.MODE_ALLOWED) { IntArray currentUserIds = mUserProfiles.getCurrentProfileIds(); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "notifHistoryReadHistory");