From 35ac46b92e627c16245d8cdec6fd4260b4c0f8ac Mon Sep 17 00:00:00 2001 From: tianyifeng Date: Tue, 23 Jan 2024 10:05:40 -0800 Subject: [PATCH] Change the behaviour in MediaMetadata.Builder.populate Populate both `artworkUri` and `artworkData` in `MediaMetadata.Builder.populate(MediaMetadata)` when at least one of them is non-null. Issue: androidx/media#964 PiperOrigin-RevId: 600826103 --- RELEASENOTES.md | 3 ++ .../androidx/media3/common/MediaMetadata.java | 13 +++++--- .../media3/common/MediaMetadataTest.java | 31 ++++++++++++++++++- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 04fa2a68c30..92ea1bcfbe3 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -3,6 +3,9 @@ ### Unreleased changes * Common Library: + * Populate both `artworkUri` and `artworkData` in + `MediaMetadata.Builder.populate(MediaMetadata)` when at least one of + them is non-null ([#964](https://github.com/androidx/media/issues/964)). * ExoPlayer: * Prevent subclassing `CompositeSequenceableLoader`. This component was [previously made extensible](https://github.com/androidx/media/commit/0de57cbfae7165dd3bb829e323d089cd312b4b1b) diff --git a/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java b/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java index dcf0d4cb399..0078334d63d 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java +++ b/libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java @@ -462,7 +462,12 @@ public Builder populateFromMetadata(List metadataList) { return this; } - /** Populates all the fields from {@code mediaMetadata}, provided they are non-null. */ + /** + * Populates all the fields from {@code mediaMetadata}. + * + *

Fields are populated when they are non-null with an exception that both {@code artworkUri} + * and {@code artworkData} are populated, when at least one of them is non-null. + */ @SuppressWarnings("deprecation") // Populating deprecated fields. @CanIgnoreReturnValue @UnstableApi @@ -497,11 +502,9 @@ public Builder populate(@Nullable MediaMetadata mediaMetadata) { if (mediaMetadata.overallRating != null) { setOverallRating(mediaMetadata.overallRating); } - if (mediaMetadata.artworkData != null) { - setArtworkData(mediaMetadata.artworkData, mediaMetadata.artworkDataType); - } - if (mediaMetadata.artworkUri != null) { + if (mediaMetadata.artworkUri != null || mediaMetadata.artworkData != null) { setArtworkUri(mediaMetadata.artworkUri); + setArtworkData(mediaMetadata.artworkData, mediaMetadata.artworkDataType); } if (mediaMetadata.trackNumber != null) { setTrackNumber(mediaMetadata.trackNumber); diff --git a/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java b/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java index db67d74d18b..5a247d5d8ab 100644 --- a/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/MediaMetadataTest.java @@ -89,7 +89,7 @@ public void builderSetArtworkData_setsArtworkData() { } @Test - public void builderSetArworkUri_setsArtworkUri() { + public void builderSetArtworkUri_setsArtworkUri() { Uri uri = Uri.parse("https://www.google.com"); MediaMetadata mediaMetadata = new MediaMetadata.Builder().setArtworkUri(uri).build(); @@ -107,6 +107,35 @@ public void populate_populatesEveryField() { assertThat(populated.extras.getString(EXTRAS_KEY)).isEqualTo(EXTRAS_VALUE); } + @Test + public void populate_withArtworkUriOnly_updatesBothArtWorkUriAndArtworkData() { + Uri artWorkUri = Uri.parse("https://www.test.com"); + MediaMetadata mediaMetadata = new MediaMetadata.Builder().setArtworkUri(artWorkUri).build(); + MediaMetadata originalMediaMetadata = getFullyPopulatedMediaMetadata(); + + MediaMetadata populatedMediaMetadata = + originalMediaMetadata.buildUpon().populate(mediaMetadata).build(); + + assertThat(populatedMediaMetadata.artworkUri).isEqualTo(artWorkUri); + assertThat(populatedMediaMetadata.artworkData).isNull(); + } + + @Test + public void populate_withArtworkDataOnly_updatesBothArtWorkUriAndArtworkData() { + byte[] artworkData = new byte[] {35, 12, 6, 77}; + MediaMetadata mediaMetadata = + new MediaMetadata.Builder() + .setArtworkData(artworkData, MediaMetadata.PICTURE_TYPE_MEDIA) + .build(); + MediaMetadata originalMediaMetadata = getFullyPopulatedMediaMetadata(); + + MediaMetadata populatedMediaMetadata = + originalMediaMetadata.buildUpon().populate(mediaMetadata).build(); + + assertThat(populatedMediaMetadata.artworkData).isEqualTo(artworkData); + assertThat(populatedMediaMetadata.artworkUri).isNull(); + } + @Test public void toBundleSkipsDefaultValues_fromBundleRestoresThem() { MediaMetadata mediaMetadata = new MediaMetadata.Builder().build();