From d8e8c8b21bcf76ae472f26f4d9fc21aa76c7c045 Mon Sep 17 00:00:00 2001 From: Tyler Gunn Date: Tue, 3 Jul 2018 12:38:49 -0700 Subject: [PATCH] Ensure Notification re-post with setOnlyAlertOnce(true) silences sound. Where a notification channel has an associated looping sound, it should be possible to re-post the notification with setOnlyAlertOnce(true) to cause the notification channel's sound to silence. When re-posting the notification, this CL fixes an issue where NotificationManagerService wouldn't call clearSoundLocked to stop playing the sound, resulting in the notification continuing to playing the sound associated with the notification channel. Test: Manual testing, updated unit test Bug: 110348674 Merged-In: I3ec26f0804bcf59f7356a2329b73ba8ed8f7ea51 Change-Id: I3ec26f0804bcf59f7356a2329b73ba8ed8f7ea51 --- .../NotificationManagerService.java | 2 ++ .../notification/BuzzBeepBlinkTest.java | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 5b2bc9e10fafa..1b4b5f12be2a5 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -4081,6 +4081,8 @@ public class NotificationManagerService extends SystemService { buzz = playVibration(record, vibration, hasValidSound); } + } else if ((record.getFlags() & Notification.FLAG_INSISTENT) != 0) { + hasValidSound = false; } } } diff --git a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java index 0b4d61fb783e0..5335e87f813de 100644 --- a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -191,6 +191,11 @@ public class BuzzBeepBlinkTest extends NotificationTestCase { true /* noisy */, false /* buzzy*/, false /* lights */); } + private NotificationRecord getInsistentBeepyOnceNotification() { + return getNotificationRecord(mId, true /* insistent */, true /* once */, + true /* noisy */, false /* buzzy*/, false /* lights */); + } + private NotificationRecord getInsistentBeepyLeanbackNotification() { return getLeanbackNotificationRecord(mId, true /* insistent */, false /* once */, true /* noisy */, false /* buzzy*/, false /* lights */); @@ -498,6 +503,24 @@ public class BuzzBeepBlinkTest extends NotificationTestCase { verifyNeverStopAudio(); } + /** + * Tests the case where the user re-posts a {@link Notification} with looping sound where + * {@link Notification.Builder#setOnlyAlertOnce(true)} has been called. This should silence + * the sound associated with the notification. + * @throws Exception + */ + @Test + public void testNoisyOnceUpdateDoesCancelAudio() throws Exception { + NotificationRecord r = getInsistentBeepyNotification(); + NotificationRecord s = getInsistentBeepyOnceNotification(); + s.isUpdate = true; + + mService.buzzBeepBlinkLocked(r); + mService.buzzBeepBlinkLocked(s); + + verifyStopAudio(); + } + @Test public void testQuietUpdateDoesNotCancelAudioFromOther() throws Exception { NotificationRecord r = getBeepyNotification();