From 3207e2fca7734211c5a5b1dad57330dc661c3840 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Thu, 20 Dec 2018 09:39:53 -0500 Subject: [PATCH] Fix NPE onNotificationRemoved - Handle it just in case - Pass through stats in progress for notifications canceled due to error Test: atest Change-Id: I0b55305532a57dcd242af0b4e2e0713e88ffbd2a Fixes: 119552458 --- .../ext/services/notification/Assistant.java | 2 +- .../NotificationManagerService.java | 2 +- .../NotificationManagerServiceTest.java | 22 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/ExtServices/src/android/ext/services/notification/Assistant.java b/packages/ExtServices/src/android/ext/services/notification/Assistant.java index 133d8ba8357be..54087d1c67ef4 100644 --- a/packages/ExtServices/src/android/ext/services/notification/Assistant.java +++ b/packages/ExtServices/src/android/ext/services/notification/Assistant.java @@ -294,7 +294,7 @@ public class Assistant extends NotificationAssistantService { synchronized (mkeyToImpressions) { ChannelImpressions ci = mkeyToImpressions.getOrDefault(key, createChannelImpressionsWithThresholds()); - if (stats.hasSeen()) { + if (stats != null && stats.hasSeen()) { ci.incrementViews(); updatedImpressions = true; } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index f76a93c73ee20..47d1bb9da3d29 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -4939,7 +4939,7 @@ public class NotificationManagerService extends SystemService { Slog.e(TAG, "Not posting notification without small icon: " + notification); if (old != null && !old.isCanceled) { mListeners.notifyRemovedLocked(r, - NotificationListenerService.REASON_ERROR, null); + NotificationListenerService.REASON_ERROR, r.getStats()); mHandler.post(new Runnable() { @Override public void run() { 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 371e8f4db9de2..83c1c76703382 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -3849,4 +3849,26 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.reportSeen(r); verify(mAppUsageStats, times(1)).reportEvent(anyString(), anyInt(), anyInt()); } + + @Test + public void testNotificationStats_notificationError() { + NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); + mService.addNotification(r); + + StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, "tag", mUid, 0, + new Notification.Builder(mContext, mTestNotificationChannel.getId()).build(), + new UserHandle(mUid), null, 0); + NotificationRecord update = new NotificationRecord(mContext, sbn, mTestNotificationChannel); + mService.addEnqueuedNotification(update); + assertNull(update.sbn.getNotification().getSmallIcon()); + + NotificationManagerService.PostNotificationRunnable runnable = + mService.new PostNotificationRunnable(update.getKey()); + runnable.run(); + waitForIdle(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(NotificationStats.class); + verify(mListeners).notifyRemovedLocked(any(), anyInt(), captor.capture()); + assertNotNull(captor.getValue()); + } }