From 083c989950420d47458072646adf173a4f4bb024 Mon Sep 17 00:00:00 2001 From: timhypeng Date: Wed, 28 Oct 2020 12:58:12 +0800 Subject: [PATCH] Fix NPE when notification icon is empty -Check notification icon before using Bug: 162998388 Test: atest MediaOutputControllerTest Merged-In: Ie3db32f3e6387f338c77faa741b2df54473a3675 Change-Id: Ie3db32f3e6387f338c77faa741b2df54473a3675 --- .../media/dialog/MediaOutputController.java | 11 +++++++++-- .../dialog/MediaOutputControllerTest.java | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java index 80928d6da9788..451bd42bd053d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -16,10 +16,12 @@ package com.android.systemui.media.dialog; +import android.app.Notification; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.media.MediaMetadata; import android.media.MediaRoute2Info; import android.media.RoutingSessionInfo; @@ -221,9 +223,14 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { } for (NotificationEntry entry : mNotificationEntryManager.getActiveNotificationsForCurrentUser()) { - if (entry.getSbn().getNotification().hasMediaSession() + final Notification notification = entry.getSbn().getNotification(); + if (notification.hasMediaSession() && TextUtils.equals(entry.getSbn().getPackageName(), mPackageName)) { - return IconCompat.createFromIcon(entry.getSbn().getNotification().getLargeIcon()); + final Icon icon = notification.getLargeIcon(); + if (icon == null) { + break; + } + return IconCompat.createFromIcon(icon); } } return null; diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java index 6ceac131ed4b3..0d352c1b42d90 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java @@ -446,6 +446,25 @@ public class MediaOutputControllerTest extends SysuiTestCase { assertThat(mMediaOutputController.getNotificationIcon()).isNull(); } + @Test + public void getNotificationLargeIcon_withoutLargeIcon_returnsNull() { + final List entryList = new ArrayList<>(); + final NotificationEntry entry = mock(NotificationEntry.class); + final StatusBarNotification sbn = mock(StatusBarNotification.class); + final Notification notification = mock(Notification.class); + entryList.add(entry); + + when(mNotificationEntryManager.getActiveNotificationsForCurrentUser()) + .thenReturn(entryList); + when(entry.getSbn()).thenReturn(sbn); + when(sbn.getNotification()).thenReturn(notification); + when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME); + when(notification.hasMediaSession()).thenReturn(true); + when(notification.getLargeIcon()).thenReturn(null); + + assertThat(mMediaOutputController.getNotificationIcon()).isNull(); + } + @Test public void getNotificationLargeIcon_withPackageNameAndMediaSession_returnsIconCompat() { final List entryList = new ArrayList<>();