diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 2c2d23f9e9..2992f9994e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -17,6 +17,8 @@ * Muxers: * IMA extension: * Session: + * Fix issue where `MediaItem.RequestMetadata` with just non-null extras is + not sent transmitted between media controllers and sessions. * UI: * Downloads: * OkHttp Extension: diff --git a/libraries/common/src/main/java/androidx/media3/common/MediaItem.java b/libraries/common/src/main/java/androidx/media3/common/MediaItem.java index 1bc3289afd..d6368c0104 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MediaItem.java +++ b/libraries/common/src/main/java/androidx/media3/common/MediaItem.java @@ -2267,8 +2267,8 @@ public final class MediaItem implements Bundleable { /** * Optional extras {@link Bundle}. * - *
Given the complexities of checking the equality of two {@link Bundle}s, this is not - * considered in the {@link #equals(Object)} or {@link #hashCode()}. + *
Given the complexities of checking the equality of two {@link Bundle}s, the contents of + * these extras are not considered in the {@link #equals(Object)} or {@link #hashCode()}. */ @Nullable public final Bundle extras; @@ -2292,13 +2292,16 @@ public final class MediaItem implements Bundleable { return false; } RequestMetadata that = (RequestMetadata) o; - return Util.areEqual(mediaUri, that.mediaUri) && Util.areEqual(searchQuery, that.searchQuery); + return Util.areEqual(mediaUri, that.mediaUri) + && Util.areEqual(searchQuery, that.searchQuery) + && ((extras == null) == (that.extras == null)); } @Override public int hashCode() { int result = mediaUri == null ? 0 : mediaUri.hashCode(); result = 31 * result + (searchQuery == null ? 0 : searchQuery.hashCode()); + result = 31 * result + (extras == null ? 0 : 1); return result; } diff --git a/libraries/common/src/test/java/androidx/media3/common/MediaItemTest.java b/libraries/common/src/test/java/androidx/media3/common/MediaItemTest.java index 81c1771ffb..e02a0b93a9 100644 --- a/libraries/common/src/test/java/androidx/media3/common/MediaItemTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/MediaItemTest.java @@ -1067,6 +1067,24 @@ public class MediaItemTest { assertThat(restoredMediaItem.localConfiguration).isEqualTo(mediaItem.localConfiguration); } + /** Regression test for internal b/323302460 */ + @Test + public void roundTripViaBundle_withJustNonNullRequestMetadataExtras_restoresAllData() { + Bundle extras = new Bundle(); + extras.putString("key", "value"); + MediaItem mediaItem = + new MediaItem.Builder() + .setMediaId("mediaId") + .setRequestMetadata(new RequestMetadata.Builder().setExtras(extras).build()) + .build(); + + MediaItem restoredItem = MediaItem.fromBundle(mediaItem.toBundle()); + + assertThat(restoredItem).isEqualTo(mediaItem); + assertThat(restoredItem.requestMetadata.extras).isNotNull(); + assertThat(restoredItem.requestMetadata.extras.get("key")).isEqualTo("value"); + } + @Test public void createDefaultMediaItemInstance_checksDefaultValues() { MediaItem mediaItem = new MediaItem.Builder().build();