From 5d3c98716a37f4599d145bb862f0602a72c7b985 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 25 Aug 2021 13:10:24 -0400 Subject: [PATCH] Check user when snoozing Test: NMSTest Bug: 195031703 Bug: 195111725 Change-Id: Ic37f192b42332c9facea28fe6bdfb3888169ea83 --- .../NotificationManagerService.java | 14 ++++++- .../NotificationManagerServiceTest.java | 38 ++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 207baf5393456..1ca037ea168e5 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -8756,10 +8756,22 @@ public class NotificationManagerService extends SystemService { void snoozeNotificationInt(String key, long duration, String snoozeCriterionId, ManagedServiceInfo listener) { - String listenerName = listener == null ? null : listener.component.toShortString(); + if (listener == null) { + return; + } + String listenerName = listener.component.toShortString(); if ((duration <= 0 && snoozeCriterionId == null) || key == null) { return; } + synchronized (mNotificationLock) { + final NotificationRecord r = findInCurrentAndSnoozedNotificationByKeyLocked(key); + if (r == null) { + return; + } + if (!listener.enabledAndUserMatches(r.getSbn().getNormalizedUserId())){ + return; + } + } if (DBG) { Slog.d(TAG, String.format("snooze event(%s, %d, %s, %s)", key, duration, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 7bbf3e6c3b2e4..f660af02a0f69 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -516,7 +516,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isAdjustmentAllowed(anyString())).thenReturn(true); - mWorkerHandler = mService.new WorkerHandler(mTestableLooper.getLooper()); + mWorkerHandler = spy(mService.new WorkerHandler(mTestableLooper.getLooper())); mService.init(mWorkerHandler, mRankingHandler, mPackageManager, mPackageManagerClient, mockLightsManager, mListeners, mAssistants, mConditionProviders, mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, mGroupHelper, mAm, mAtm, @@ -2702,6 +2702,42 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertFalse(noManService.hasCompanionDevice(mListener)); } + @Test + public void testCrossUserSnooze() { + NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 10); + mService.addNotification(r); + NotificationRecord r2 = generateNotificationRecord(mTestNotificationChannel, 0); + mService.addNotification(r2); + + mListener = mock(ManagedServices.ManagedServiceInfo.class); + mListener.component = new ComponentName(PKG, PKG); + when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false); + when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener); + + mService.snoozeNotificationInt(r.getKey(), 1000, null, mListener); + + verify(mWorkerHandler, never()).post( + any(NotificationManagerService.SnoozeNotificationRunnable.class)); + } + + @Test + public void testSameUserSnooze() { + NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 10); + mService.addNotification(r); + NotificationRecord r2 = generateNotificationRecord(mTestNotificationChannel, 0); + mService.addNotification(r2); + + mListener = mock(ManagedServices.ManagedServiceInfo.class); + mListener.component = new ComponentName(PKG, PKG); + when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true); + when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener); + + mService.snoozeNotificationInt(r2.getKey(), 1000, null, mListener); + + verify(mWorkerHandler).post( + any(NotificationManagerService.SnoozeNotificationRunnable.class)); + } + @Test public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() throws Exception { final NotificationRecord notification = generateNotificationRecord(