From 0e97ae68b2654a70791782aa7a7cbe636ce1da3c Mon Sep 17 00:00:00 2001 From: Seungho Lee Date: Wed, 31 Oct 2018 21:49:09 +0900 Subject: [PATCH] Check if notification is valid before it finally vibrates because it can be canceled as soon as enqeued Test: Build and run StatusBarTest/_NotifyBuilder Test: Set notification sound and vibration Test: Make notification with + button, and cancel it with - button quickly TEst: Check notification not vibrating Change-Id: Ia21f45c165f863ed4143da3707b492c89e58387c Merged-In: Ia21f45c165f863ed4143da3707b492c89e58387c Signed-off-by: Seungho Lee --- .../notification/NotificationManagerService.java | 13 +++++++++++-- .../server/notification/BuzzBeepBlinkTest.java | 16 ++++++++++++++++ 2 files changed, 27 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 1284468947c25..480f36ee08bf4 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -4992,8 +4992,17 @@ public class NotificationManagerService extends SystemService { try { Thread.sleep(waitMs); } catch (InterruptedException e) { } - mVibrator.vibrate(record.sbn.getUid(), record.sbn.getOpPkg(), - effect, record.getAudioAttributes()); + + // Notifications might be canceled before it actually vibrates due to waitMs, + // so need to check the notification still valide for vibrate. + synchronized (mNotificationLock) { + if (mNotificationsByKey.get(record.getKey()) != null) { + mVibrator.vibrate(record.sbn.getUid(), record.sbn.getOpPkg(), + effect, record.getAudioAttributes()); + } else { + Slog.e(TAG, "No vibration for canceled notification : " + record.getKey()); + } + } }).start(); } else { mVibrator.vibrate(record.sbn.getUid(), record.sbn.getOpPkg(), diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java index bdba3d5cd6779..99d2b87c7c25a 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -917,6 +917,22 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { assertFalse(s.isInterruptive()); } + @Test + public void testCanceledNoisyNeverVibrate() throws Exception { + NotificationRecord r = getBuzzyBeepyNotification(); + + final int waitMs = mAudioManager.getFocusRampTimeMs( + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, + r.getAudioAttributes()); + + mService.buzzBeepBlinkLocked(r); + mService.clearNotifications(); + + verifyNeverVibrate(); + Thread.sleep(waitMs); + verifyNeverVibrate(); + } + @Test public void testEmptyUriSoundTreatedAsNoSound() throws Exception { NotificationChannel channel = new NotificationChannel("test", "test", IMPORTANCE_HIGH);