Rename MediaItem.PlaybackProperties to LocalConfiguration

This aligns with other MediaItem.FooConfiguration class names and also
more clearly represents that this class encapsulates information used
for local playback that is lost when serializing MediaItem between
processes.

The old class and fields are kept (deprecated) for backwards
compatibility.

PiperOrigin-RevId: 398742708
This commit is contained in:
ibaker 2021-09-24 17:00:56 +01:00 committed by Oliver Woodman
parent a720380e77
commit 0cd1031dcd
2 changed files with 121 additions and 86 deletions

View File

@ -99,19 +99,19 @@ public final class MediaItem implements Bundleable {
mediaId = mediaItem.mediaId;
mediaMetadata = mediaItem.mediaMetadata;
liveConfiguration = mediaItem.liveConfiguration.buildUpon();
@Nullable PlaybackProperties playbackProperties = mediaItem.playbackProperties;
if (playbackProperties != null) {
customCacheKey = playbackProperties.customCacheKey;
mimeType = playbackProperties.mimeType;
uri = playbackProperties.uri;
streamKeys = playbackProperties.streamKeys;
subtitles = playbackProperties.subtitles;
tag = playbackProperties.tag;
@Nullable LocalConfiguration localConfiguration = mediaItem.localConfiguration;
if (localConfiguration != null) {
customCacheKey = localConfiguration.customCacheKey;
mimeType = localConfiguration.mimeType;
uri = localConfiguration.uri;
streamKeys = localConfiguration.streamKeys;
subtitles = localConfiguration.subtitles;
tag = localConfiguration.tag;
drmConfiguration =
playbackProperties.drmConfiguration != null
? playbackProperties.drmConfiguration.buildUpon()
localConfiguration.drmConfiguration != null
? localConfiguration.drmConfiguration.buildUpon()
: new DrmConfiguration.Builder();
adsConfiguration = playbackProperties.adsConfiguration;
adsConfiguration = localConfiguration.adsConfiguration;
}
}
@ -128,9 +128,9 @@ public final class MediaItem implements Bundleable {
/**
* Sets the optional URI.
*
* <p>If {@code uri} is null or unset then no {@link PlaybackProperties} object is created
* <p>If {@code uri} is null or unset then no {@link LocalConfiguration} object is created
* during {@link #build()} and no other {@code Builder} methods that would populate {@link
* MediaItem#playbackProperties} should be called.
* MediaItem#localConfiguration} should be called.
*/
public Builder setUri(@Nullable String uri) {
return setUri(uri == null ? null : Uri.parse(uri));
@ -139,9 +139,9 @@ public final class MediaItem implements Bundleable {
/**
* Sets the optional URI.
*
* <p>If {@code uri} is null or unset then no {@link PlaybackProperties} object is created
* <p>If {@code uri} is null or unset then no {@link LocalConfiguration} object is created
* during {@link #build()} and no other {@code Builder} methods that would populate {@link
* MediaItem#playbackProperties} should be called.
* MediaItem#localConfiguration} should be called.
*/
public Builder setUri(@Nullable Uri uri) {
this.uri = uri;
@ -334,7 +334,7 @@ public final class MediaItem implements Bundleable {
* <p>{@code null} or an empty {@link List} can be used for a reset.
*
* <p>If {@link #setUri} is passed a non-null {@code uri}, the stream keys are used to create a
* {@link PlaybackProperties} object. Otherwise they will be ignored.
* {@link LocalConfiguration} object. Otherwise they will be ignored.
*/
public Builder setStreamKeys(@Nullable List<StreamKey> streamKeys) {
this.streamKeys =
@ -485,13 +485,14 @@ public final class MediaItem implements Bundleable {
}
/** Returns a new {@link MediaItem} instance with the current builder values. */
@SuppressWarnings("deprecation") // Using PlaybackProperties while it exists.
public MediaItem build() {
// TODO: remove this check once all the deprecated individual DRM setters are removed.
checkState(drmConfiguration.licenseUri == null || drmConfiguration.scheme != null);
@Nullable PlaybackProperties playbackProperties = null;
@Nullable PlaybackProperties localConfiguration = null;
@Nullable Uri uri = this.uri;
if (uri != null) {
playbackProperties =
localConfiguration =
new PlaybackProperties(
uri,
mimeType,
@ -505,7 +506,7 @@ public final class MediaItem implements Bundleable {
return new MediaItem(
mediaId != null ? mediaId : DEFAULT_MEDIA_ID,
clippingProperties.build(),
playbackProperties,
localConfiguration,
liveConfiguration.build(),
mediaMetadata != null ? mediaMetadata : MediaMetadata.EMPTY);
}
@ -861,7 +862,8 @@ public final class MediaItem implements Bundleable {
}
/** Properties for local playback. */
public static final class PlaybackProperties {
// TODO: Mark this final when PlaybackProperties is deleted.
public static class LocalConfiguration {
/** The {@link Uri}. */
public final Uri uri;
@ -896,7 +898,7 @@ public final class MediaItem implements Bundleable {
*/
@Nullable public final Object tag;
private PlaybackProperties(
private LocalConfiguration(
Uri uri,
@Nullable String mimeType,
@Nullable DrmConfiguration drmConfiguration,
@ -920,10 +922,10 @@ public final class MediaItem implements Bundleable {
if (this == obj) {
return true;
}
if (!(obj instanceof PlaybackProperties)) {
if (!(obj instanceof LocalConfiguration)) {
return false;
}
PlaybackProperties other = (PlaybackProperties) obj;
LocalConfiguration other = (LocalConfiguration) obj;
return uri.equals(other.uri)
&& Util.areEqual(mimeType, other.mimeType)
@ -949,6 +951,31 @@ public final class MediaItem implements Bundleable {
}
}
/** @deprecated Use {@link LocalConfiguration}. */
@Deprecated
public static final class PlaybackProperties extends LocalConfiguration {
private PlaybackProperties(
Uri uri,
@Nullable String mimeType,
@Nullable DrmConfiguration drmConfiguration,
@Nullable AdsConfiguration adsConfiguration,
List<StreamKey> streamKeys,
@Nullable String customCacheKey,
List<Subtitle> subtitles,
@Nullable Object tag) {
super(
uri,
mimeType,
drmConfiguration,
adsConfiguration,
streamKeys,
customCacheKey,
subtitles,
tag);
}
}
/** Live playback configuration. */
public static final class LiveConfiguration implements Bundleable {
@ -1555,8 +1582,13 @@ public final class MediaItem implements Bundleable {
/** Identifies the media item. */
public final String mediaId;
/** Optional playback properties. May be {@code null} if shared over process boundaries. */
@Nullable public final PlaybackProperties playbackProperties;
/**
* Optional configuration for local playback. May be {@code null} if shared over process
* boundaries.
*/
@Nullable public final LocalConfiguration localConfiguration;
/** @deprecated Use {@link #localConfiguration} instead. */
@Deprecated @Nullable public final PlaybackProperties playbackProperties;
/** The live playback configuration. */
public final LiveConfiguration liveConfiguration;
@ -1567,14 +1599,16 @@ public final class MediaItem implements Bundleable {
/** The clipping properties. */
public final ClippingProperties clippingProperties;
@SuppressWarnings("deprecation") // Using PlaybackProperties until it's deleted.
private MediaItem(
String mediaId,
ClippingProperties clippingProperties,
@Nullable PlaybackProperties playbackProperties,
@Nullable PlaybackProperties localConfiguration,
LiveConfiguration liveConfiguration,
MediaMetadata mediaMetadata) {
this.mediaId = mediaId;
this.playbackProperties = playbackProperties;
this.localConfiguration = localConfiguration;
this.playbackProperties = localConfiguration;
this.liveConfiguration = liveConfiguration;
this.mediaMetadata = mediaMetadata;
this.clippingProperties = clippingProperties;
@ -1598,7 +1632,7 @@ public final class MediaItem implements Bundleable {
return Util.areEqual(mediaId, other.mediaId)
&& clippingProperties.equals(other.clippingProperties)
&& Util.areEqual(playbackProperties, other.playbackProperties)
&& Util.areEqual(localConfiguration, other.localConfiguration)
&& Util.areEqual(liveConfiguration, other.liveConfiguration)
&& Util.areEqual(mediaMetadata, other.mediaMetadata);
}
@ -1606,7 +1640,7 @@ public final class MediaItem implements Bundleable {
@Override
public int hashCode() {
int result = mediaId.hashCode();
result = 31 * result + (playbackProperties != null ? playbackProperties.hashCode() : 0);
result = 31 * result + (localConfiguration != null ? localConfiguration.hashCode() : 0);
result = 31 * result + liveConfiguration.hashCode();
result = 31 * result + clippingProperties.hashCode();
result = 31 * result + mediaMetadata.hashCode();
@ -1633,7 +1667,7 @@ public final class MediaItem implements Bundleable {
/**
* {@inheritDoc}
*
* <p>It omits the {@link #playbackProperties} field. The {@link #playbackProperties} of an
* <p>It omits the {@link #localConfiguration} field. The {@link #localConfiguration} of an
* instance restored by {@link #CREATOR} will always be {@code null}.
*/
@Override
@ -1649,7 +1683,7 @@ public final class MediaItem implements Bundleable {
/**
* Object that can restore {@link MediaItem} from a {@link Bundle}.
*
* <p>The {@link #playbackProperties} of a restored instance will always be {@code null}.
* <p>The {@link #localConfiguration} of a restored instance will always be {@code null}.
*/
public static final Creator<MediaItem> CREATOR = MediaItem::fromBundle;

View File

@ -45,7 +45,7 @@ public class MediaItemTest {
MediaItem mediaItem = MediaItem.fromUri(uri);
assertThat(mediaItem.playbackProperties.uri).isEqualTo(uri);
assertThat(mediaItem.localConfiguration.uri).isEqualTo(uri);
assertThat(mediaItem.mediaMetadata).isNotNull();
}
@ -53,7 +53,7 @@ public class MediaItemTest {
public void builderWithUriAsString_setsUri() {
MediaItem mediaItem = MediaItem.fromUri(URI_STRING);
assertThat(mediaItem.playbackProperties.uri.toString()).isEqualTo(URI_STRING);
assertThat(mediaItem.localConfiguration.uri.toString()).isEqualTo(URI_STRING);
}
@Test
@ -67,7 +67,7 @@ public class MediaItemTest {
public void builderSetMimeType_isNullByDefault() {
MediaItem mediaItem = MediaItem.fromUri(URI_STRING);
assertThat(mediaItem.playbackProperties.mimeType).isNull();
assertThat(mediaItem.localConfiguration.mimeType).isNull();
}
@Test
@ -75,14 +75,14 @@ public class MediaItemTest {
MediaItem mediaItem =
new MediaItem.Builder().setUri(URI_STRING).setMimeType(MimeTypes.APPLICATION_MPD).build();
assertThat(mediaItem.playbackProperties.mimeType).isEqualTo(MimeTypes.APPLICATION_MPD);
assertThat(mediaItem.localConfiguration.mimeType).isEqualTo(MimeTypes.APPLICATION_MPD);
}
@Test
public void builder_drmConfigIsNullByDefault() {
// Null value by default.
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNull();
assertThat(mediaItem.localConfiguration.drmConfiguration).isNull();
}
@Test
@ -105,20 +105,20 @@ public class MediaItemTest {
.setDrmUuid(C.WIDEVINE_UUID)
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri);
assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders)
assertThat(mediaItem.localConfiguration.drmConfiguration).isNotNull();
assertThat(mediaItem.localConfiguration.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.localConfiguration.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.localConfiguration.drmConfiguration.licenseUri).isEqualTo(licenseUri);
assertThat(mediaItem.localConfiguration.drmConfiguration.requestHeaders)
.isEqualTo(requestHeaders);
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders)
assertThat(mediaItem.localConfiguration.drmConfiguration.licenseRequestHeaders)
.isEqualTo(requestHeaders);
assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes)
assertThat(mediaItem.localConfiguration.drmConfiguration.multiSession).isTrue();
assertThat(mediaItem.localConfiguration.drmConfiguration.forceDefaultLicenseUri).isTrue();
assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isTrue();
assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes)
.containsExactly(C.TRACK_TYPE_AUDIO);
assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isEqualTo(keySetId);
assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isEqualTo(keySetId);
}
@Test
@ -142,17 +142,17 @@ public class MediaItemTest {
.setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.CLEARKEY_UUID).build())
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.CLEARKEY_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.CLEARKEY_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isNull();
assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders).isEmpty();
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders).isEmpty();
assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isFalse();
assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isFalse();
assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isFalse();
assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes).isEmpty();
assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isNull();
assertThat(mediaItem.localConfiguration.drmConfiguration).isNotNull();
assertThat(mediaItem.localConfiguration.drmConfiguration.scheme).isEqualTo(C.CLEARKEY_UUID);
assertThat(mediaItem.localConfiguration.drmConfiguration.uuid).isEqualTo(C.CLEARKEY_UUID);
assertThat(mediaItem.localConfiguration.drmConfiguration.licenseUri).isNull();
assertThat(mediaItem.localConfiguration.drmConfiguration.requestHeaders).isEmpty();
assertThat(mediaItem.localConfiguration.drmConfiguration.licenseRequestHeaders).isEmpty();
assertThat(mediaItem.localConfiguration.drmConfiguration.multiSession).isFalse();
assertThat(mediaItem.localConfiguration.drmConfiguration.forceDefaultLicenseUri).isFalse();
assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isFalse();
assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes).isEmpty();
assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isNull();
}
@Test
@ -177,20 +177,20 @@ public class MediaItemTest {
.build())
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri);
assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders)
assertThat(mediaItem.localConfiguration.drmConfiguration).isNotNull();
assertThat(mediaItem.localConfiguration.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.localConfiguration.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.localConfiguration.drmConfiguration.licenseUri).isEqualTo(licenseUri);
assertThat(mediaItem.localConfiguration.drmConfiguration.requestHeaders)
.isEqualTo(requestHeaders);
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders)
assertThat(mediaItem.localConfiguration.drmConfiguration.licenseRequestHeaders)
.isEqualTo(requestHeaders);
assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes)
assertThat(mediaItem.localConfiguration.drmConfiguration.multiSession).isTrue();
assertThat(mediaItem.localConfiguration.drmConfiguration.forceDefaultLicenseUri).isTrue();
assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isTrue();
assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes)
.containsExactly(C.TRACK_TYPE_AUDIO);
assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isEqualTo(keySetId);
assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isEqualTo(keySetId);
}
@Test
@ -206,7 +206,7 @@ public class MediaItemTest {
.setDrmSessionForClearPeriods(true)
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes)
assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes)
.containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO);
}
@ -242,7 +242,7 @@ public class MediaItemTest {
MediaItem mediaItem =
new MediaItem.Builder().setUri(URI_STRING).setCustomCacheKey("key").build();
assertThat(mediaItem.playbackProperties.customCacheKey).isEqualTo("key");
assertThat(mediaItem.localConfiguration.customCacheKey).isEqualTo("key");
}
@Test
@ -254,7 +254,7 @@ public class MediaItemTest {
MediaItem mediaItem =
new MediaItem.Builder().setUri(URI_STRING).setStreamKeys(streamKeys).build();
assertThat(mediaItem.playbackProperties.streamKeys).isEqualTo(streamKeys);
assertThat(mediaItem.localConfiguration.streamKeys).isEqualTo(streamKeys);
}
@Test
@ -287,14 +287,14 @@ public class MediaItemTest {
MediaItem mediaItem =
new MediaItem.Builder().setUri(URI_STRING).setSubtitles(subtitles).build();
assertThat(mediaItem.playbackProperties.subtitles).isEqualTo(subtitles);
assertThat(mediaItem.localConfiguration.subtitles).isEqualTo(subtitles);
}
@Test
public void builderSetTag_isNullByDefault() {
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build();
assertThat(mediaItem.playbackProperties.tag).isNull();
assertThat(mediaItem.localConfiguration.tag).isNull();
}
@Test
@ -303,7 +303,7 @@ public class MediaItemTest {
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setTag(tag).build();
assertThat(mediaItem.playbackProperties.tag).isEqualTo(tag);
assertThat(mediaItem.localConfiguration.tag).isEqualTo(tag);
}
@Test
@ -430,8 +430,8 @@ public class MediaItemTest {
.setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
.build();
assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri);
assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isNull();
assertThat(mediaItem.localConfiguration.adsConfiguration.adTagUri).isEqualTo(adTagUri);
assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isNull();
}
@Test
@ -445,8 +445,8 @@ public class MediaItemTest {
.setAdsConfiguration(
new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adsId).build())
.build();
assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri);
assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isEqualTo(adsId);
assertThat(mediaItem.localConfiguration.adsConfiguration.adTagUri).isEqualTo(adTagUri);
assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isEqualTo(adsId);
}
@Test
@ -456,8 +456,8 @@ public class MediaItemTest {
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setAdTagUri(adTagUri).build();
assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri);
assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isNull();
assertThat(mediaItem.localConfiguration.adsConfiguration.adTagUri).isEqualTo(adTagUri);
assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isNull();
}
@Test
@ -469,8 +469,8 @@ public class MediaItemTest {
MediaItem mediaItem =
new MediaItem.Builder().setUri(URI_STRING).setAdTagUri(adTagUri, adsId).build();
assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri);
assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isEqualTo(adsId);
assertThat(mediaItem.localConfiguration.adsConfiguration.adTagUri).isEqualTo(adTagUri);
assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isEqualTo(adsId);
}
@Test
@ -596,6 +596,7 @@ public class MediaItemTest {
MediaItem copy = mediaItem.buildUpon().build();
assertThat(copy).isEqualTo(mediaItem);
assertThat(copy.localConfiguration).isEqualTo(mediaItem.playbackProperties);
}
@Test
@ -674,7 +675,7 @@ public class MediaItemTest {
.setClipStartsAtKeyFrame(true)
.build();
assertThat(mediaItem.playbackProperties).isNull();
assertThat(mediaItem.localConfiguration).isNull();
assertThat(MediaItem.CREATOR.fromBundle(mediaItem.toBundle())).isEqualTo(mediaItem);
}
@ -682,7 +683,7 @@ public class MediaItemTest {
public void roundTripViaBundle_withPlaybackProperties_dropsPlaybackProperties() {
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build();
assertThat(mediaItem.playbackProperties).isNotNull();
assertThat(MediaItem.CREATOR.fromBundle(mediaItem.toBundle()).playbackProperties).isNull();
assertThat(mediaItem.localConfiguration).isNotNull();
assertThat(MediaItem.CREATOR.fromBundle(mediaItem.toBundle()).localConfiguration).isNull();
}
}