From 27e26448ff8136daaa788d7c8db50b9ffe40df2f Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 11 Feb 2020 11:31:35 -0500 Subject: [PATCH 1/2] Optionally exclude snoozed notifs from dismissal archive Test: manual Bug: 137396965 Change-Id: I9238b3edc89a0c0821bcee38612dcb81b2f3f69c --- .../android/app/INotificationManager.aidl | 2 +- .../NotificationManagerService.java | 30 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 1d4a1acde434e..9aa6b870792d1 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -123,7 +123,7 @@ interface INotificationManager @UnsupportedAppUsage StatusBarNotification[] getActiveNotifications(String callingPkg); @UnsupportedAppUsage - StatusBarNotification[] getHistoricalNotifications(String callingPkg, int count); + StatusBarNotification[] getHistoricalNotifications(String callingPkg, int count, boolean includeSnoozed); NotificationHistory getNotificationHistory(String callingPkg); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index ea77c36c1498a..8067ebceca0f0 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -527,11 +527,11 @@ public class NotificationManagerService extends SystemService { private static class Archive { final int mBufferSize; - final ArrayDeque mBuffer; + final ArrayDeque> mBuffer; public Archive(int size) { mBufferSize = size; - mBuffer = new ArrayDeque(mBufferSize); + mBuffer = new ArrayDeque<>(mBufferSize); } public String toString() { @@ -544,7 +544,7 @@ public class NotificationManagerService extends SystemService { return sb.toString(); } - public void record(StatusBarNotification nr) { + public void record(StatusBarNotification nr, int reason) { if (mBuffer.size() == mBufferSize) { mBuffer.removeFirst(); } @@ -552,21 +552,24 @@ public class NotificationManagerService extends SystemService { // We don't want to store the heavy bits of the notification in the archive, // but other clients in the system process might be using the object, so we // store a (lightened) copy. - mBuffer.addLast(nr.cloneLight()); + mBuffer.addLast(new Pair<>(nr.cloneLight(), reason)); } - public Iterator descendingIterator() { + public Iterator> descendingIterator() { return mBuffer.descendingIterator(); } - public StatusBarNotification[] getArray(int count) { + public StatusBarNotification[] getArray(int count, boolean includeSnoozed) { if (count == 0) count = mBufferSize; final StatusBarNotification[] a = new StatusBarNotification[Math.min(count, mBuffer.size())]; - Iterator iter = descendingIterator(); + Iterator> iter = descendingIterator(); int i=0; while (iter.hasNext() && i < count) { - a[i++] = iter.next(); + Pair pair = iter.next(); + if (pair.second != REASON_SNOOZED || includeSnoozed) { + a[i++] = pair.first; + } } return a; } @@ -3638,7 +3641,8 @@ public class NotificationManagerService extends SystemService { */ @Override @RequiresPermission(android.Manifest.permission.ACCESS_NOTIFICATIONS) - public StatusBarNotification[] getHistoricalNotifications(String callingPkg, int count) { + public StatusBarNotification[] getHistoricalNotifications(String callingPkg, int count, + boolean includeSnoozed) { // enforce() will ensure the calling uid has the correct permission getContext().enforceCallingOrSelfPermission( android.Manifest.permission.ACCESS_NOTIFICATIONS, @@ -3651,7 +3655,7 @@ public class NotificationManagerService extends SystemService { if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg) == AppOpsManager.MODE_ALLOWED) { synchronized (mArchive) { - tmp = mArchive.getArray(count); + tmp = mArchive.getArray(count, includeSnoozed); } } return tmp; @@ -5199,10 +5203,10 @@ public class NotificationManagerService extends SystemService { pw.println(" mMaxPackageEnqueueRate=" + mMaxPackageEnqueueRate); } pw.println(" mArchive=" + mArchive.toString()); - Iterator iter = mArchive.descendingIterator(); + Iterator> iter = mArchive.descendingIterator(); int j=0; while (iter.hasNext()) { - final StatusBarNotification sbn = iter.next(); + final StatusBarNotification sbn = iter.next().first; if (filter != null && !filter.matches(sbn)) continue; pw.println(" " + sbn); if (++j >= 5) { @@ -7573,7 +7577,7 @@ public class NotificationManagerService extends SystemService { } // Save it for users of getHistoricalNotifications() - mArchive.record(r.getSbn()); + mArchive.record(r.getSbn(), reason); final long now = System.currentTimeMillis(); final LogMaker logMaker = r.getItemLogMaker() From bbee4670fe052378951e2aee1a2d70197c62931f Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 11 Feb 2020 13:05:35 -0500 Subject: [PATCH 2/2] Add tracing for notification history actions Test: perform actions in UI Fixes: 142387395 Change-Id: Ia586b8f015599b3a03d1d4d892f3258f93f11343 --- .../NotificationManagerService.java | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 8067ebceca0f0..103d1bdab4aa6 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -185,6 +185,7 @@ import android.os.ServiceManager; import android.os.ShellCallback; import android.os.SystemClock; import android.os.SystemProperties; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.VibrationEffect; @@ -2263,12 +2264,26 @@ public class NotificationManagerService extends SystemService { @Override public void onUnlockUser(@NonNull UserInfo userInfo) { - mHandler.post(() -> mHistoryManager.onUserUnlocked(userInfo.id)); + mHandler.post(() -> { + Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "notifHistoryUnlockUser"); + try { + mHistoryManager.onUserUnlocked(userInfo.id); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + } + }); } @Override public void onStopUser(@NonNull UserInfo userInfo) { - mHandler.post(() -> mHistoryManager.onUserStopped(userInfo.id)); + mHandler.post(() -> { + Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "notifHistoryStopUser"); + try { + mHistoryManager.onUserStopped(userInfo.id); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + } + }); } @GuardedBy("mNotificationLock") @@ -2595,17 +2610,22 @@ public class NotificationManagerService extends SystemService { mAppUsageStats.reportInterruptiveNotification(r.getSbn().getPackageName(), r.getChannel().getId(), getRealUserId(r.getSbn().getUserId())); - mHistoryManager.addNotification(new HistoricalNotification.Builder() - .setPackage(r.getSbn().getPackageName()) - .setUid(r.getSbn().getUid()) - .setChannelId(r.getChannel().getId()) - .setChannelName(r.getChannel().getName().toString()) - .setPostedTimeMs(System.currentTimeMillis()) - .setTitle(getHistoryTitle(r.getNotification())) - .setText(getHistoryText( - r.getSbn().getPackageContext(getContext()), r.getNotification())) - .setIcon(r.getNotification().getSmallIcon()) - .build()); + Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "notifHistoryAddItem"); + try { + mHistoryManager.addNotification(new HistoricalNotification.Builder() + .setPackage(r.getSbn().getPackageName()) + .setUid(r.getSbn().getUid()) + .setChannelId(r.getChannel().getId()) + .setChannelName(r.getChannel().getName().toString()) + .setPostedTimeMs(System.currentTimeMillis()) + .setTitle(getHistoryTitle(r.getNotification())) + .setText(getHistoryText( + r.getSbn().getPackageContext(getContext()), r.getNotification())) + .setIcon(r.getNotification().getSmallIcon()) + .build()); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + } r.setRecordedInterruption(true); } } @@ -3679,7 +3699,12 @@ public class NotificationManagerService extends SystemService { if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ACCESS_NOTIFICATIONS, uid, callingPkg) == AppOpsManager.MODE_ALLOWED) { IntArray currentUserIds = mUserProfiles.getCurrentProfileIds(); - return mHistoryManager.readNotificationHistory(currentUserIds.toArray()); + Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "notifHistoryReadHistory"); + try { + return mHistoryManager.readNotificationHistory(currentUserIds.toArray()); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + } } return new NotificationHistory(); }