From 09a8993b5636bcd29a176773e8f259b39426d0e9 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Fri, 7 May 2021 00:34:17 +0100 Subject: [PATCH] Add fields to MediaMetadata requested by MediaAPIs #minor-release PiperOrigin-RevId: 372448985 --- .../android/exoplayer2/MediaMetadata.java | 142 ++++++++++++++++-- 1 file changed, 131 insertions(+), 11 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java index bacea1c687..a76d147c37 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2; +import android.net.Uri; import android.os.Bundle; import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -39,6 +40,12 @@ public final class MediaMetadata implements Bundleable { @Nullable private CharSequence trackArtist; @Nullable private CharSequence albumTitle; @Nullable private CharSequence albumArtist; + @Nullable private CharSequence displayTitle; + @Nullable private CharSequence subtitle; + @Nullable private CharSequence description; + @Nullable private Uri mediaUri; + @Nullable private Rating userRating; + @Nullable private Rating overallRating; public Builder() {} @@ -47,6 +54,11 @@ public final class MediaMetadata implements Bundleable { this.trackArtist = mediaMetadata.trackArtist; this.albumTitle = mediaMetadata.albumTitle; this.albumArtist = mediaMetadata.albumArtist; + this.displayTitle = mediaMetadata.displayTitle; + this.subtitle = mediaMetadata.subtitle; + this.mediaUri = mediaMetadata.mediaUri; + this.userRating = mediaMetadata.userRating; + this.overallRating = mediaMetadata.overallRating; } /** @deprecated Use {@link #setTrackTitle(CharSequence)} instead. */ @@ -77,6 +89,36 @@ public final class MediaMetadata implements Bundleable { return this; } + public Builder setDisplayTitle(@Nullable CharSequence displayTitle) { + this.displayTitle = displayTitle; + return this; + } + + public Builder setSubtitle(@Nullable CharSequence subtitle) { + this.subtitle = subtitle; + return this; + } + + public Builder setDescription(@Nullable CharSequence description) { + this.description = description; + return this; + } + + public Builder setMediaUri(@Nullable Uri mediaUri) { + this.mediaUri = mediaUri; + return this; + } + + public Builder setUserRating(@Nullable Rating userRating) { + this.userRating = userRating; + return this; + } + + public Builder setOverallRating(@Nullable Rating overallRating) { + this.overallRating = overallRating; + return this; + } + /** * Sets all fields supported by the {@link Metadata.Entry entries} within the {@link Metadata}. * @@ -131,6 +173,12 @@ public final class MediaMetadata implements Bundleable { @Nullable public final CharSequence trackArtist; @Nullable public final CharSequence albumTitle; @Nullable public final CharSequence albumArtist; + @Nullable public final CharSequence displayTitle; + @Nullable public final CharSequence subtitle; + @Nullable public final CharSequence description; + @Nullable public final Uri mediaUri; + @Nullable public final Rating userRating; + @Nullable public final Rating overallRating; private MediaMetadata(Builder builder) { this.title = builder.trackTitle != null ? builder.trackTitle.toString() : null; @@ -138,6 +186,12 @@ public final class MediaMetadata implements Bundleable { this.trackArtist = builder.trackArtist; this.albumTitle = builder.albumTitle; this.albumArtist = builder.albumArtist; + this.displayTitle = builder.displayTitle; + this.subtitle = builder.subtitle; + this.description = builder.description; + this.mediaUri = builder.mediaUri; + this.userRating = builder.userRating; + this.overallRating = builder.overallRating; } /** Returns a new {@link Builder} instance with the current {@link MediaMetadata} fields. */ @@ -157,25 +211,58 @@ public final class MediaMetadata implements Bundleable { return Util.areEqual(trackTitle, that.trackTitle) && Util.areEqual(trackArtist, that.trackArtist) && Util.areEqual(albumTitle, that.albumTitle) - && Util.areEqual(albumArtist, that.albumArtist); + && Util.areEqual(albumArtist, that.albumArtist) + && Util.areEqual(displayTitle, that.displayTitle) + && Util.areEqual(subtitle, that.subtitle) + && Util.areEqual(description, that.description) + && Util.areEqual(mediaUri, that.mediaUri) + && Util.areEqual(userRating, that.userRating) + && Util.areEqual(overallRating, that.overallRating); } @Override public int hashCode() { - return Objects.hashCode(trackTitle, trackArtist, albumTitle, albumArtist); + return Objects.hashCode( + trackTitle, + trackArtist, + albumTitle, + albumArtist, + displayTitle, + subtitle, + description, + mediaUri, + userRating, + overallRating); } // Bundleable implementation. @Documented @Retention(RetentionPolicy.SOURCE) - @IntDef({FIELD_TRACK_TITLE, FIELD_TRACK_ARTIST, FIELD_ALBUM_TITLE, FIELD_ALBUM_ARTIST}) + @IntDef({ + FIELD_TRACK_TITLE, + FIELD_TRACK_ARTIST, + FIELD_ALBUM_TITLE, + FIELD_ALBUM_ARTIST, + FIELD_DISPLAY_TITLE, + FIELD_SUBTITLE, + FIELD_DESCRIPTION, + FIELD_MEDIA_URI, + FIELD_USER_RATING, + FIELD_OVERALL_RATING, + }) private @interface FieldNumber {} private static final int FIELD_TRACK_TITLE = 0; private static final int FIELD_TRACK_ARTIST = 1; private static final int FIELD_ALBUM_TITLE = 2; private static final int FIELD_ALBUM_ARTIST = 3; + private static final int FIELD_DISPLAY_TITLE = 4; + private static final int FIELD_SUBTITLE = 5; + private static final int FIELD_DESCRIPTION = 6; + private static final int FIELD_MEDIA_URI = 7; + private static final int FIELD_USER_RATING = 8; + private static final int FIELD_OVERALL_RATING = 9; @Override public Bundle toBundle() { @@ -184,18 +271,51 @@ public final class MediaMetadata implements Bundleable { bundle.putCharSequence(keyForField(FIELD_TRACK_ARTIST), trackArtist); bundle.putCharSequence(keyForField(FIELD_ALBUM_TITLE), albumTitle); bundle.putCharSequence(keyForField(FIELD_ALBUM_ARTIST), albumArtist); + bundle.putCharSequence(keyForField(FIELD_DISPLAY_TITLE), displayTitle); + bundle.putCharSequence(keyForField(FIELD_SUBTITLE), subtitle); + bundle.putCharSequence(keyForField(FIELD_DESCRIPTION), description); + bundle.putParcelable(keyForField(FIELD_MEDIA_URI), mediaUri); + + if (userRating != null) { + bundle.putBundle(keyForField(FIELD_USER_RATING), userRating.toBundle()); + } + if (overallRating != null) { + bundle.putBundle(keyForField(FIELD_OVERALL_RATING), overallRating.toBundle()); + } + return bundle; } /** Object that can restore {@link MediaMetadata} from a {@link Bundle}. */ - public static final Creator CREATOR = - bundle -> - new MediaMetadata.Builder() - .setTrackTitle(bundle.getCharSequence(keyForField(FIELD_TRACK_TITLE))) - .setTrackArtist(bundle.getCharSequence(keyForField(FIELD_TRACK_ARTIST))) - .setAlbumTitle(bundle.getCharSequence(keyForField(FIELD_ALBUM_TITLE))) - .setAlbumArtist(bundle.getCharSequence(keyForField(FIELD_ALBUM_ARTIST))) - .build(); + public static final Creator CREATOR = MediaMetadata::fromBundle; + + private static MediaMetadata fromBundle(Bundle bundle) { + Builder builder = new Builder(); + builder + .setTrackTitle(bundle.getCharSequence(keyForField(FIELD_TRACK_TITLE))) + .setTrackArtist(bundle.getCharSequence(keyForField(FIELD_TRACK_ARTIST))) + .setAlbumTitle(bundle.getCharSequence(keyForField(FIELD_ALBUM_TITLE))) + .setAlbumArtist(bundle.getCharSequence(keyForField(FIELD_ALBUM_ARTIST))) + .setDisplayTitle(bundle.getCharSequence(keyForField(FIELD_DISPLAY_TITLE))) + .setSubtitle(bundle.getCharSequence(keyForField(FIELD_SUBTITLE))) + .setDescription(bundle.getCharSequence(keyForField(FIELD_DESCRIPTION))) + .setMediaUri(bundle.getParcelable(keyForField(FIELD_MEDIA_URI))); + + if (bundle.containsKey(keyForField(FIELD_USER_RATING))) { + @Nullable Bundle fieldBundle = bundle.getBundle(keyForField(FIELD_USER_RATING)); + if (fieldBundle != null) { + builder.setUserRating(Rating.CREATOR.fromBundle(fieldBundle)); + } + } + if (bundle.containsKey(keyForField(FIELD_OVERALL_RATING))) { + @Nullable Bundle fieldBundle = bundle.getBundle(keyForField(FIELD_OVERALL_RATING)); + if (fieldBundle != null) { + builder.setUserRating(Rating.CREATOR.fromBundle(fieldBundle)); + } + } + + return builder.build(); + } private static String keyForField(@FieldNumber int field) { return Integer.toString(field, Character.MAX_RADIX);