From a45df2fdcb5c0d1e8c6eb8ab23e421e8d9233e68 Mon Sep 17 00:00:00 2001 From: rohks Date: Wed, 31 Aug 2022 17:23:20 +0000 Subject: [PATCH] Provide methods to override notification fields `contentTitle` and `contentText` can now be overridden. Issue: androidx/media#150 PiperOrigin-RevId: 471287701 --- .../DefaultMediaNotificationProvider.java | 40 +++++++++++++++- .../DefaultMediaNotificationProviderTest.java | 46 +++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/libraries/session/src/main/java/androidx/media3/session/DefaultMediaNotificationProvider.java b/libraries/session/src/main/java/androidx/media3/session/DefaultMediaNotificationProvider.java index 13941f45c7..d6b15c0151 100644 --- a/libraries/session/src/main/java/androidx/media3/session/DefaultMediaNotificationProvider.java +++ b/libraries/session/src/main/java/androidx/media3/session/DefaultMediaNotificationProvider.java @@ -281,7 +281,9 @@ public class DefaultMediaNotificationProvider implements MediaNotification.Provi // Set metadata info in the notification. MediaMetadata metadata = player.getMediaMetadata(); - builder.setContentTitle(metadata.title).setContentText(metadata.artist); + builder + .setContentTitle(getNotificationContentTitle(metadata)) + .setContentText(getNotificationContentText(metadata)); @Nullable ListenableFuture bitmapFuture = loadArtworkBitmap(metadata); if (bitmapFuture != null) { if (pendingOnBitmapLoadedFutureCallback != null) { @@ -504,6 +506,42 @@ public class DefaultMediaNotificationProvider implements MediaNotification.Provi return compactViewIndices; } + /** + * Returns the content title to be used to build the notification. + * + *

This method is called each time a new notification is built. + * + *

Override this method to customize which field of {@link MediaMetadata} is used for content + * title of the notification. + * + *

By default, the notification shows {@link MediaMetadata#title} as content title. + * + * @param metadata The media metadata from which content title is fetched. + * @return Notification content title. + */ + @Nullable + protected CharSequence getNotificationContentTitle(MediaMetadata metadata) { + return metadata.title; + } + + /** + * Returns the content text to be used to build the notification. + * + *

This method is called each time a new notification is built. + * + *

Override this method to customize which field of {@link MediaMetadata} is used for content + * text of the notification. + * + *

By default, the notification shows {@link MediaMetadata#artist} as content text. + * + * @param metadata The media metadata from which content text is fetched. + * @return Notification content text. + */ + @Nullable + protected CharSequence getNotificationContentText(MediaMetadata metadata) { + return metadata.artist; + } + private void ensureNotificationChannel() { if (Util.SDK_INT < 26 || notificationManager.getNotificationChannel(channelId) != null) { return; diff --git a/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java b/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java index 1bb95172da..a97777e3be 100644 --- a/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java +++ b/libraries/session/src/test/java/androidx/media3/session/DefaultMediaNotificationProviderTest.java @@ -510,6 +510,52 @@ public class DefaultMediaNotificationProviderTest { .isEqualTo(R.drawable.media3_icon_circular_play); } + @Test + public void setMediaMetadataTitle_notificationUsesItAsContentTitle() { + Context context = ApplicationProvider.getApplicationContext(); + DefaultMediaNotificationProvider defaultMediaNotificationProvider = + new DefaultMediaNotificationProvider.Builder(context).build(); + DefaultActionFactory defaultActionFactory = + new DefaultActionFactory(Robolectric.setupService(TestService.class)); + MediaSession mockMediaSession = + createMockMediaSessionForNotification( + new MediaMetadata.Builder().setTitle("title").build()); + + MediaNotification notification = + defaultMediaNotificationProvider.createNotification( + mockMediaSession, + ImmutableList.of(), + defaultActionFactory, + mock(MediaNotification.Provider.Callback.class)); + + boolean isMediaMetadataTitleEqualToNotificationContentTitle = + "title".contentEquals(NotificationCompat.getContentTitle(notification.notification)); + assertThat(isMediaMetadataTitleEqualToNotificationContentTitle).isTrue(); + } + + @Test + public void setMediaMetadataArtist_notificationUsesItAsContentText() { + Context context = ApplicationProvider.getApplicationContext(); + DefaultMediaNotificationProvider defaultMediaNotificationProvider = + new DefaultMediaNotificationProvider.Builder(context).build(); + DefaultActionFactory defaultActionFactory = + new DefaultActionFactory(Robolectric.setupService(TestService.class)); + MediaSession mockMediaSession = + createMockMediaSessionForNotification( + new MediaMetadata.Builder().setArtist("artist").build()); + + MediaNotification notification = + defaultMediaNotificationProvider.createNotification( + mockMediaSession, + ImmutableList.of(), + defaultActionFactory, + mock(MediaNotification.Provider.Callback.class)); + + boolean isMediaMetadataArtistEqualToNotificationContentText = + "artist".contentEquals(NotificationCompat.getContentText(notification.notification)); + assertThat(isMediaMetadataArtistEqualToNotificationContentText).isTrue(); + } + private static void assertHasNotificationChannel( List notificationChannels, String channelId, String channelName) { boolean found = false;