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 c87a1b6619..8074b80d4b 100644 --- a/libraries/common/src/main/java/androidx/media3/common/MediaItem.java +++ b/libraries/common/src/main/java/androidx/media3/common/MediaItem.java @@ -900,7 +900,7 @@ public final class MediaItem implements Bundleable { private static final String FIELD_FORCED_SESSION_TRACK_TYPES = Util.intToStringMaxRadix(6); private static final String FIELD_KEY_SET_ID = Util.intToStringMaxRadix(7); - /** Object that can restore {@link DrmConfiguration} from a {@link Bundle}. */ + /** An object that can restore {@link DrmConfiguration} from a {@link Bundle}. */ @UnstableApi public static final Creator CREATOR = DrmConfiguration::fromBundle; @@ -968,7 +968,7 @@ public final class MediaItem implements Bundleable { } /** Configuration for playing back linear ads with a media item. */ - public static final class AdsConfiguration { + public static final class AdsConfiguration implements Bundleable { /** Builder for {@link AdsConfiguration} instances. */ public static final class Builder { @@ -1052,6 +1052,39 @@ public final class MediaItem implements Bundleable { result = 31 * result + (adsId != null ? adsId.hashCode() : 0); return result; } + + // Bundleable implementation. + + private static final String FIELD_AD_TAG_URI = Util.intToStringMaxRadix(0); + + /** + * An object that can restore {@link AdsConfiguration} from a {@link Bundle}. + * + *

The {@link #adsId} of a restored instance will always be {@code null}. + */ + @UnstableApi + public static final Creator CREATOR = AdsConfiguration::fromBundle; + + @UnstableApi + private static AdsConfiguration fromBundle(Bundle bundle) { + @Nullable Uri adTagUri = bundle.getParcelable(FIELD_AD_TAG_URI); + checkNotNull(adTagUri); + return new AdsConfiguration.Builder(adTagUri).build(); + } + + /** + * {@inheritDoc} + * + *

It omits the {@link #adsId} field. The {@link #adsId} of an instance restored from such a + * bundle by {@link #CREATOR} will be {@code null}. + */ + @UnstableApi + @Override + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putParcelable(FIELD_AD_TAG_URI, adTagUri); + return bundle; + } } /** Properties for local playback. */ @@ -1403,7 +1436,7 @@ public final class MediaItem implements Bundleable { return bundle; } - /** Object that can restore {@link LiveConfiguration} from a {@link Bundle}. */ + /** An object that can restore {@link LiveConfiguration} from a {@link Bundle}. */ @UnstableApi public static final Creator CREATOR = bundle -> @@ -1601,7 +1634,7 @@ public final class MediaItem implements Bundleable { private static final String FIELD_LABEL = Util.intToStringMaxRadix(5); private static final String FIELD_ID = Util.intToStringMaxRadix(6); - /** Object that can restore {@link SubtitleConfiguration} from a {@link Bundle}. */ + /** An object that can restore {@link SubtitleConfiguration} from a {@link Bundle}. */ @UnstableApi public static final Creator CREATOR = SubtitleConfiguration::fromBundle; @@ -1895,7 +1928,7 @@ public final class MediaItem implements Bundleable { return bundle; } - /** Object that can restore {@link ClippingConfiguration} from a {@link Bundle}. */ + /** An object that can restore {@link ClippingConfiguration} from a {@link Bundle}. */ @UnstableApi public static final Creator CREATOR = bundle -> @@ -2055,7 +2088,7 @@ public final class MediaItem implements Bundleable { return bundle; } - /** Object that can restore {@link RequestMetadata} from a {@link Bundle}. */ + /** An object that can restore {@link RequestMetadata} from a {@link Bundle}. */ @UnstableApi public static final Creator CREATOR = bundle -> @@ -2194,7 +2227,7 @@ public final class MediaItem implements Bundleable { } /** - * Object that can restore {@link MediaItem} from a {@link Bundle}. + * An object that can restore {@link MediaItem} from a {@link Bundle}. * *

The {@link #localConfiguration} of a restored instance will always be {@code null}. */ 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 cb48c4b1cb..18e7d60ef4 100644 --- a/libraries/common/src/test/java/androidx/media3/common/MediaItemTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/MediaItemTest.java @@ -593,6 +593,21 @@ public class MediaItemTest { assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isEqualTo(adsId); } + @Test + public void createAdsConfigurationInstance_roundTripViaBundle_yieldsEqualInstanceExceptAdsId() { + Uri adTagUri = Uri.parse(URI_STRING + "/ad"); + MediaItem.AdsConfiguration adsConfiguration = + new MediaItem.AdsConfiguration.Builder(adTagUri) + .setAdsId("Something that will be lost") + .build(); + + MediaItem.AdsConfiguration adsConfigurationFromBundle = + MediaItem.AdsConfiguration.CREATOR.fromBundle(adsConfiguration.toBundle()); + + assertThat(adsConfigurationFromBundle.adTagUri).isEqualTo(adsConfiguration.adTagUri); + assertThat(adsConfigurationFromBundle.adsId).isNull(); + } + @Test public void builderSetMediaMetadata_setsMetadata() { MediaMetadata mediaMetadata = new MediaMetadata.Builder().setTitle("title").build();