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
This commit is contained in:
Tyler Gunn
2018-07-03 12:38:49 -07:00
parent b4919259ab
commit d8e8c8b21b
2 changed files with 25 additions and 0 deletions

View File

@@ -4081,6 +4081,8 @@ public class NotificationManagerService extends SystemService {
buzz = playVibration(record, vibration, hasValidSound);
}
} else if ((record.getFlags() & Notification.FLAG_INSISTENT) != 0) {
hasValidSound = false;
}
}
}

View File

@@ -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();