diff options
author | Hugh Chen <hughchen@google.com> | 2020-12-08 06:30:56 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-12-08 06:30:56 +0000 |
commit | a06d339f9156fc947759262d406cb9f2788e9e70 (patch) | |
tree | eada1cfe80afb2c7cdca49c4dc416139097a8756 /packages/SystemUI | |
parent | c73db6328e107a0b21b707c756b6cf53e851c69b (diff) | |
parent | c2dd4429734dbb1af115253ab5a52503939af58e (diff) |
Fix output switcher didn't show album art am: c2dd442973
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13118156
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: I8c65d2bcaa7b2bf37f65a213d0bbf0e2c8c7a00f
Diffstat (limited to 'packages/SystemUI')
6 files changed, 98 insertions, 29 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 b9fa87252125..80928d6da978 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -18,10 +18,7 @@ package com.android.systemui.media.dialog; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.media.MediaMetadata; import android.media.MediaRoute2Info; @@ -49,6 +46,8 @@ import com.android.settingslib.media.MediaOutputSliceConstants; import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.statusbar.notification.NotificationEntryManager; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.ShadeController; import java.util.ArrayList; @@ -61,7 +60,7 @@ import javax.inject.Inject; /** * Controller for media output dialog */ -public class MediaOutputController implements LocalMediaManager.DeviceCallback{ +public class MediaOutputController implements LocalMediaManager.DeviceCallback { private static final String TAG = "MediaOutputController"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -73,6 +72,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback{ private final ActivityStarter mActivityStarter; private final List<MediaDevice> mGroupMediaDevices = new CopyOnWriteArrayList<>(); private final boolean mAboveStatusbar; + private final NotificationEntryManager mNotificationEntryManager; @VisibleForTesting final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>(); @@ -85,13 +85,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback{ @Inject public MediaOutputController(@NonNull Context context, String packageName, boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager - lbm, ShadeController shadeController, ActivityStarter starter) { + lbm, ShadeController shadeController, ActivityStarter starter, + NotificationEntryManager notificationEntryManager) { mContext = context; mPackageName = packageName; mMediaSessionManager = mediaSessionManager; mShadeController = shadeController; mActivityStarter = starter; mAboveStatusbar = aboveStatusbar; + mNotificationEntryManager = notificationEntryManager; InfoMediaManager imm = new InfoMediaManager(mContext, packageName, null, lbm); mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName); } @@ -197,7 +199,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback{ if (DEBUG) { Log.d(TAG, "Media meta data does not contain icon information"); } - return getPackageIcon(); + return getNotificationIcon(); } IconCompat getDeviceIconCompat(MediaDevice device) { @@ -213,24 +215,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback{ return BluetoothUtils.createIconWithDrawable(drawable); } - private IconCompat getPackageIcon() { + IconCompat getNotificationIcon() { if (TextUtils.isEmpty(mPackageName)) { return null; } - try { - final Drawable drawable = mContext.getPackageManager().getApplicationIcon(mPackageName); - if (drawable instanceof BitmapDrawable) { - return IconCompat.createWithBitmap(((BitmapDrawable) drawable).getBitmap()); - } - final Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), - drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(bitmap); - drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); - drawable.draw(canvas); - return IconCompat.createWithBitmap(bitmap); - } catch (PackageManager.NameNotFoundException e) { - if (DEBUG) { - Log.e(TAG, "Package is not found. Unable to get package icon."); + for (NotificationEntry entry + : mNotificationEntryManager.getActiveNotificationsForCurrentUser()) { + if (entry.getSbn().getNotification().hasMediaSession() + && TextUtils.equals(entry.getSbn().getPackageName(), mPackageName)) { + return IconCompat.createFromIcon(entry.getSbn().getNotification().getLargeIcon()); } } return null; diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt index e912b7d1b08f..7d1a7ced7472 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt @@ -20,6 +20,7 @@ import android.content.Context import android.media.session.MediaSessionManager import com.android.settingslib.bluetooth.LocalBluetoothManager import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.statusbar.notification.NotificationEntryManager import com.android.systemui.statusbar.phone.ShadeController import javax.inject.Inject @@ -31,7 +32,8 @@ class MediaOutputDialogFactory @Inject constructor( private val mediaSessionManager: MediaSessionManager, private val lbm: LocalBluetoothManager?, private val shadeController: ShadeController, - private val starter: ActivityStarter + private val starter: ActivityStarter, + private val notificationEntryManager: NotificationEntryManager ) { companion object { var mediaOutputDialog: MediaOutputDialog? = null @@ -41,7 +43,7 @@ class MediaOutputDialogFactory @Inject constructor( fun create(packageName: String, aboveStatusBar: Boolean) { mediaOutputDialog?.dismiss() mediaOutputDialog = MediaOutputController(context, packageName, aboveStatusBar, - mediaSessionManager, lbm, shadeController, starter).run { + mediaSessionManager, lbm, shadeController, starter, notificationEntryManager).run { MediaOutputDialog(context, aboveStatusBar, this) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java index 4639dcbb1685..c897d8a53e20 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java @@ -39,6 +39,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.phone.ShadeController; import org.junit.Before; @@ -58,6 +59,8 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { private LocalBluetoothManager mLocalBluetoothManager = mock(LocalBluetoothManager.class); private ShadeController mShadeController = mock(ShadeController.class); private ActivityStarter mStarter = mock(ActivityStarter.class); + private NotificationEntryManager mNotificationEntryManager = + mock(NotificationEntryManager.class); private MediaOutputBaseDialogImpl mMediaOutputBaseDialogImpl; private MediaOutputController mMediaOutputController; @@ -69,7 +72,8 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { @Before public void setUp() { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, - mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter); + mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, + mNotificationEntryManager); mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mMediaOutputController); mMediaOutputBaseDialogImpl.onCreate(new Bundle()); 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 0576667484df..6ceac131ed4b 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 @@ -27,15 +27,19 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Notification; import android.content.Context; +import android.graphics.drawable.Icon; import android.media.MediaDescription; import android.media.MediaMetadata; import android.media.RoutingSessionInfo; import android.media.session.MediaController; import android.media.session.MediaSessionManager; +import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.text.TextUtils; +import androidx.core.graphics.drawable.IconCompat; import androidx.test.filters.SmallTest; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; @@ -45,6 +49,8 @@ import com.android.settingslib.media.MediaDevice; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.statusbar.notification.NotificationEntryManager; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.ShadeController; import org.junit.Before; @@ -81,6 +87,8 @@ public class MediaOutputControllerTest extends SysuiTestCase { private RoutingSessionInfo mRemoteSessionInfo = mock(RoutingSessionInfo.class); private ShadeController mShadeController = mock(ShadeController.class); private ActivityStarter mStarter = mock(ActivityStarter.class); + private NotificationEntryManager mNotificationEntryManager = + mock(NotificationEntryManager.class); private Context mSpyContext; private MediaOutputController mMediaOutputController; @@ -100,8 +108,10 @@ public class MediaOutputControllerTest extends SysuiTestCase { MediaSessionManager.class); when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn( mCachedBluetoothDeviceManager); + mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, false, - mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter); + mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, + mNotificationEntryManager); mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; MediaDescription.Builder builder = new MediaDescription.Builder(); @@ -144,7 +154,8 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void start_withoutPackageName_verifyMediaControllerInit() { mMediaOutputController = new MediaOutputController(mSpyContext, null, false, - mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter); + mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, + mNotificationEntryManager); mMediaOutputController.start(mCb); @@ -164,7 +175,9 @@ public class MediaOutputControllerTest extends SysuiTestCase { @Test public void stop_withoutPackageName_verifyMediaControllerDeinit() { mMediaOutputController = new MediaOutputController(mSpyContext, null, false, - mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter); + mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, + mNotificationEntryManager); + mMediaOutputController.start(mCb); mMediaOutputController.stop(); @@ -423,4 +436,53 @@ public class MediaOutputControllerTest extends SysuiTestCase { } assertThat(newDevices.get(4).getId()).isEqualTo(TEST_DEVICE_5_ID); } + + @Test + public void getNotificationLargeIcon_withoutPackageName_returnsNull() { + mMediaOutputController = new MediaOutputController(mSpyContext, null, false, + mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, + mNotificationEntryManager); + + assertThat(mMediaOutputController.getNotificationIcon()).isNull(); + } + + @Test + public void getNotificationLargeIcon_withPackageNameAndMediaSession_returnsIconCompat() { + final List<NotificationEntry> entryList = new ArrayList<>(); + final NotificationEntry entry = mock(NotificationEntry.class); + final StatusBarNotification sbn = mock(StatusBarNotification.class); + final Notification notification = mock(Notification.class); + final Icon icon = mock(Icon.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(icon); + + assertThat(mMediaOutputController.getNotificationIcon() instanceof IconCompat).isTrue(); + } + + @Test + public void getNotificationLargeIcon_withPackageNameAndNoMediaSession_returnsNull() { + final List<NotificationEntry> entryList = new ArrayList<>(); + final NotificationEntry entry = mock(NotificationEntry.class); + final StatusBarNotification sbn = mock(StatusBarNotification.class); + final Notification notification = mock(Notification.class); + final Icon icon = mock(Icon.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(false); + when(notification.getLargeIcon()).thenReturn(icon); + + assertThat(mMediaOutputController.getNotificationIcon()).isNull(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java index 4b00d9eefd9c..de8ce55ddcbb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java @@ -34,6 +34,7 @@ import com.android.settingslib.media.LocalMediaManager; import com.android.settingslib.media.MediaDevice; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.phone.ShadeController; import org.junit.Before; @@ -57,6 +58,8 @@ public class MediaOutputDialogTest extends SysuiTestCase { private ActivityStarter mStarter = mock(ActivityStarter.class); private LocalMediaManager mLocalMediaManager = mock(LocalMediaManager.class); private MediaDevice mMediaDevice = mock(MediaDevice.class); + private NotificationEntryManager mNotificationEntryManager = + mock(NotificationEntryManager.class); private MediaOutputDialog mMediaOutputDialog; private MediaOutputController mMediaOutputController; @@ -65,7 +68,8 @@ public class MediaOutputDialogTest extends SysuiTestCase { @Before public void setUp() { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, - mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter); + mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, + mNotificationEntryManager); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputDialog = new MediaOutputDialog(mContext, false, mMediaOutputController); diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputGroupDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputGroupDialogTest.java index 10f2bd5e4699..581335027671 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputGroupDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputGroupDialogTest.java @@ -34,6 +34,7 @@ import com.android.settingslib.media.MediaDevice; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.phone.ShadeController; import org.junit.After; @@ -59,6 +60,8 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase { private LocalMediaManager mLocalMediaManager = mock(LocalMediaManager.class); private MediaDevice mMediaDevice = mock(MediaDevice.class); private MediaDevice mMediaDevice1 = mock(MediaDevice.class); + private NotificationEntryManager mNotificationEntryManager = + mock(NotificationEntryManager.class); private MediaOutputGroupDialog mMediaOutputGroupDialog; private MediaOutputController mMediaOutputController; @@ -67,7 +70,8 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase { @Before public void setUp() { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, - mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter); + mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, + mNotificationEntryManager); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false, mMediaOutputController); |