Add MediaItem.DrmConfiguration.Builder and use it in MediaItem.Builder

PiperOrigin-RevId: 395896034
This commit is contained in:
ibaker 2021-09-10 12:00:12 +01:00 committed by Oliver Woodman
parent 7dff223d80
commit 9f3c2fb5e1
2 changed files with 327 additions and 143 deletions

View File

@ -26,13 +26,14 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.offline.StreamKey;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@ -71,14 +72,9 @@ public final class MediaItem implements Bundleable {
private boolean clipRelativeToLiveWindow;
private boolean clipRelativeToDefaultPosition;
private boolean clipStartsAtKeyFrame;
@Nullable private Uri drmLicenseUri;
private Map<String, String> drmLicenseRequestHeaders;
@Nullable private UUID drmUuid;
private boolean drmMultiSession;
private boolean drmPlayClearContentWithoutKey;
private boolean drmForceDefaultLicenseUri;
private List<Integer> drmSessionForClearTypes;
@Nullable private byte[] drmKeySetId;
// TODO: Change this to @Nullable DrmConfiguration once all the deprecated individual setters
// are removed.
private DrmConfiguration.Builder drmConfiguration;
private List<StreamKey> streamKeys;
@Nullable private String customCacheKey;
private List<Subtitle> subtitles;
@ -93,10 +89,10 @@ public final class MediaItem implements Bundleable {
private float liveMaxPlaybackSpeed;
/** Creates a builder. */
@SuppressWarnings("deprecation") // Temporarily uses DrmConfiguration.Builder() constructor.
public Builder() {
clipEndPositionMs = C.TIME_END_OF_SOURCE;
drmSessionForClearTypes = Collections.emptyList();
drmLicenseRequestHeaders = Collections.emptyMap();
drmConfiguration = new DrmConfiguration.Builder();
streamKeys = Collections.emptyList();
subtitles = Collections.emptyList();
liveTargetOffsetMs = C.TIME_UNSET;
@ -128,17 +124,10 @@ public final class MediaItem implements Bundleable {
streamKeys = playbackProperties.streamKeys;
subtitles = playbackProperties.subtitles;
tag = playbackProperties.tag;
@Nullable DrmConfiguration drmConfiguration = playbackProperties.drmConfiguration;
if (drmConfiguration != null) {
drmLicenseUri = drmConfiguration.licenseUri;
drmLicenseRequestHeaders = drmConfiguration.requestHeaders;
drmMultiSession = drmConfiguration.multiSession;
drmForceDefaultLicenseUri = drmConfiguration.forceDefaultLicenseUri;
drmPlayClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey;
drmSessionForClearTypes = drmConfiguration.sessionForClearTypes;
drmUuid = drmConfiguration.uuid;
drmKeySetId = drmConfiguration.getKeySetId();
}
drmConfiguration =
playbackProperties.drmConfiguration != null
? playbackProperties.drmConfiguration.buildUpon()
: new DrmConfiguration.Builder();
@Nullable AdsConfiguration adsConfiguration = playbackProperties.adsConfiguration;
if (adsConfiguration != null) {
adTagUri = adsConfiguration.adTagUri;
@ -243,149 +232,111 @@ public final class MediaItem implements Bundleable {
return this;
}
/** Sets the optional DRM configuration. */
public Builder setDrmConfiguration(@Nullable DrmConfiguration drmConfiguration) {
this.drmConfiguration =
drmConfiguration != null ? drmConfiguration.buildUpon() : new DrmConfiguration.Builder();
return this;
}
/**
* Sets the optional default DRM license server URI. If this URI is set, the {@link
* DrmConfiguration#uuid} needs to be specified as well.
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setLicenseUri(Uri)} instead.
*/
@Deprecated
public Builder setDrmLicenseUri(@Nullable Uri licenseUri) {
drmLicenseUri = licenseUri;
drmConfiguration.setLicenseUri(licenseUri);
return this;
}
/**
* Sets the optional default DRM license server URI. If this URI is set, the {@link
* DrmConfiguration#uuid} needs to be specified as well.
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setLicenseUri(String)} instead.
*/
@Deprecated
public Builder setDrmLicenseUri(@Nullable String licenseUri) {
drmLicenseUri = licenseUri == null ? null : Uri.parse(licenseUri);
drmConfiguration.setLicenseUri(licenseUri);
return this;
}
/**
* Sets the optional request headers attached to the DRM license request.
*
* <p>{@code null} or an empty {@link Map} can be used for a reset.
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setLicenseRequestHeaders(Map)} instead.
*/
@Deprecated
public Builder setDrmLicenseRequestHeaders(
@Nullable Map<String, String> licenseRequestHeaders) {
this.drmLicenseRequestHeaders =
licenseRequestHeaders != null && !licenseRequestHeaders.isEmpty()
? Collections.unmodifiableMap(new HashMap<>(licenseRequestHeaders))
: Collections.emptyMap();
drmConfiguration.setLicenseRequestHeaders(licenseRequestHeaders);
return this;
}
/**
* Sets the {@link UUID} of the protection scheme.
*
* <p>If {@code uuid} is null or unset then no {@link DrmConfiguration} object is created during
* {@link #build()} and no other {@code Builder} methods that would populate {@link
* MediaItem.PlaybackProperties#drmConfiguration} should be called.
*
* <p>This method should only be called if {@link #setUri} is passed a non-null value.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and pass the {@code uuid} to
* {@link DrmConfiguration.Builder#Builder(UUID)} instead.
*/
@Deprecated
public Builder setDrmUuid(@Nullable UUID uuid) {
drmUuid = uuid;
drmConfiguration.setNullableUuid(uuid);
return this;
}
/**
* Sets whether the DRM configuration is multi session enabled.
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setMultiSession(boolean)} instead.
*/
@Deprecated
public Builder setDrmMultiSession(boolean multiSession) {
drmMultiSession = multiSession;
drmConfiguration.setMultiSession(multiSession);
return this;
}
/**
* Sets whether to force use the default DRM license server URI even if the media specifies its
* own DRM license server URI.
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setForceDefaultLicenseUri(boolean)} instead.
*/
@Deprecated
public Builder setDrmForceDefaultLicenseUri(boolean forceDefaultLicenseUri) {
this.drmForceDefaultLicenseUri = forceDefaultLicenseUri;
drmConfiguration.setForceDefaultLicenseUri(forceDefaultLicenseUri);
return this;
}
/**
* Sets whether clear samples within protected content should be played when keys for the
* encrypted part of the content have yet to be loaded.
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setPlayClearContentWithoutKey(boolean)} instead.
*/
@Deprecated
public Builder setDrmPlayClearContentWithoutKey(boolean playClearContentWithoutKey) {
this.drmPlayClearContentWithoutKey = playClearContentWithoutKey;
drmConfiguration.setPlayClearContentWithoutKey(playClearContentWithoutKey);
return this;
}
/**
* Sets whether a DRM session should be used for clear tracks of type {@link C#TRACK_TYPE_VIDEO}
* and {@link C#TRACK_TYPE_AUDIO}.
*
* <p>This method overrides what has been set by previously calling {@link
* #setDrmSessionForClearTypes(List)}.
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setSessionForClearPeriods(boolean)} instead.
*/
@Deprecated
public Builder setDrmSessionForClearPeriods(boolean sessionForClearPeriods) {
this.setDrmSessionForClearTypes(
sessionForClearPeriods
? Arrays.asList(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO)
: Collections.emptyList());
drmConfiguration.setSessionForClearPeriods(sessionForClearPeriods);
return this;
}
/**
* Sets a list of {@link C.TrackType track types} for which to use a DRM session even when the
* tracks are in the clear.
*
* <p>For the common case of using a DRM session for {@link C#TRACK_TYPE_VIDEO} and {@link
* C#TRACK_TYPE_AUDIO} the {@link #setDrmSessionForClearPeriods(boolean)} can be used.
*
* <p>This method overrides what has been set by previously calling {@link
* #setDrmSessionForClearPeriods(boolean)}.
*
* <p>{@code null} or an empty {@link List} can be used for a reset.
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setSessionForClearTypes(List)} instead.
*/
@Deprecated
public Builder setDrmSessionForClearTypes(@Nullable List<Integer> sessionForClearTypes) {
this.drmSessionForClearTypes =
sessionForClearTypes != null && !sessionForClearTypes.isEmpty()
? Collections.unmodifiableList(new ArrayList<>(sessionForClearTypes))
: Collections.emptyList();
drmConfiguration.setSessionForClearTypes(sessionForClearTypes);
return this;
}
/**
* Sets the key set ID of the offline license.
*
* <p>The key set ID identifies an offline license. The ID is required to query, renew or
* release an existing offline license (see {@code DefaultDrmSessionManager#setMode(int
* mode,byte[] offlineLicenseKeySetId)}).
*
* <p>This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)}
* are passed non-null values.
* @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link
* DrmConfiguration.Builder#setKeySetId(byte[])} instead.
*/
@Deprecated
public Builder setDrmKeySetId(@Nullable byte[] keySetId) {
this.drmKeySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
drmConfiguration.setKeySetId(keySetId);
return this;
}
@ -568,7 +519,8 @@ public final class MediaItem implements Bundleable {
/** Returns a new {@link MediaItem} instance with the current builder values. */
public MediaItem build() {
checkState(drmLicenseUri == null || drmUuid != null);
// TODO: remove this check once all the deprecated individual DRM setters are removed.
checkState(drmConfiguration.licenseUri == null || drmConfiguration.uuid != null);
@Nullable PlaybackProperties playbackProperties = null;
@Nullable Uri uri = this.uri;
if (uri != null) {
@ -576,17 +528,7 @@ public final class MediaItem implements Bundleable {
new PlaybackProperties(
uri,
mimeType,
drmUuid != null
? new DrmConfiguration(
drmUuid,
drmLicenseUri,
drmLicenseRequestHeaders,
drmMultiSession,
drmForceDefaultLicenseUri,
drmPlayClearContentWithoutKey,
drmSessionForClearTypes,
drmKeySetId)
: null,
drmConfiguration.uuid != null ? drmConfiguration.build() : null,
adTagUri != null ? new AdsConfiguration(adTagUri, adsId) : null,
streamKeys,
customCacheKey,
@ -615,6 +557,165 @@ public final class MediaItem implements Bundleable {
/** DRM configuration for a media item. */
public static final class DrmConfiguration {
/** Builder for {@link DrmConfiguration}. */
public static final class Builder {
// TODO remove @Nullable annotation when the deprecated zero-arg constructor is removed.
@Nullable private UUID uuid;
@Nullable private Uri licenseUri;
private ImmutableMap<String, String> licenseRequestHeaders;
private boolean multiSession;
private boolean playClearContentWithoutKey;
private boolean forceDefaultLicenseUri;
private ImmutableList<Integer> sessionForClearTypes;
@Nullable private byte[] keySetId;
/**
* Constructs an instance.
*
* @param uuid The {@link UUID} of the protection scheme.
*/
public Builder(UUID uuid) {
this.uuid = uuid;
this.licenseRequestHeaders = ImmutableMap.of();
this.sessionForClearTypes = ImmutableList.of();
}
/**
* @deprecated This only exists to support the deprecated setters for individual DRM
* properties on {@link MediaItem.Builder}.
*/
@Deprecated
private Builder() {
this.licenseRequestHeaders = ImmutableMap.of();
this.sessionForClearTypes = ImmutableList.of();
}
private Builder(DrmConfiguration drmConfiguration) {
this.uuid = drmConfiguration.uuid;
this.licenseUri = drmConfiguration.licenseUri;
this.licenseRequestHeaders = drmConfiguration.requestHeaders;
this.multiSession = drmConfiguration.multiSession;
this.playClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey;
this.forceDefaultLicenseUri = drmConfiguration.forceDefaultLicenseUri;
this.sessionForClearTypes = drmConfiguration.sessionForClearTypes;
this.keySetId = drmConfiguration.keySetId;
}
/** Sets the {@link UUID} of the protection scheme. */
public Builder setUuid(UUID uuid) {
this.uuid = uuid;
return this;
}
/**
* @deprecated This only exists to support the deprecated {@link
* MediaItem.Builder#setDrmUuid(UUID)}.
*/
@Deprecated
private Builder setNullableUuid(@Nullable UUID uuid) {
this.uuid = uuid;
return this;
}
/** Sets the optional default DRM license server URI. */
public Builder setLicenseUri(@Nullable Uri licenseUri) {
this.licenseUri = licenseUri;
return this;
}
/** Sets the optional default DRM license server URI. */
public Builder setLicenseUri(@Nullable String licenseUri) {
this.licenseUri = licenseUri == null ? null : Uri.parse(licenseUri);
return this;
}
/** Sets the optional request headers attached to DRM license requests. */
public Builder setLicenseRequestHeaders(@Nullable Map<String, String> licenseRequestHeaders) {
this.licenseRequestHeaders =
licenseRequestHeaders != null
? ImmutableMap.copyOf(licenseRequestHeaders)
: ImmutableMap.of();
return this;
}
/** Sets whether multi session is enabled. */
public Builder setMultiSession(boolean multiSession) {
this.multiSession = multiSession;
return this;
}
/**
* Sets whether to always use the default DRM license server URI even if the media specifies
* its own DRM license server URI.
*/
public Builder setForceDefaultLicenseUri(boolean forceDefaultLicenseUri) {
this.forceDefaultLicenseUri = forceDefaultLicenseUri;
return this;
}
/**
* Sets whether clear samples within protected content should be played when keys for the
* encrypted part of the content have yet to be loaded.
*/
public Builder setPlayClearContentWithoutKey(boolean playClearContentWithoutKey) {
this.playClearContentWithoutKey = playClearContentWithoutKey;
return this;
}
/**
* Sets whether a DRM session should be used for clear tracks of type {@link
* C#TRACK_TYPE_VIDEO} and {@link C#TRACK_TYPE_AUDIO}.
*
* <p>This method overrides what has been set by previously calling {@link
* #setSessionForClearTypes(List)}.
*/
public Builder setSessionForClearPeriods(boolean sessionForClearPeriods) {
this.setSessionForClearTypes(
sessionForClearPeriods
? ImmutableList.of(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO)
: ImmutableList.of());
return this;
}
/**
* Sets a list of {@link C}{@code .TRACK_TYPE_*} constants for which to use a DRM session even
* when the tracks are in the clear.
*
* <p>For the common case of using a DRM session for {@link C#TRACK_TYPE_VIDEO} and {@link
* C#TRACK_TYPE_AUDIO} the {@link #setSessionForClearPeriods(boolean)} can be used.
*
* <p>This method overrides what has been set by previously calling {@link
* #setSessionForClearPeriods(boolean)}.
*
* <p>{@code null} or an empty {@link List} can be used for a reset.
*/
public Builder setSessionForClearTypes(@Nullable List<Integer> sessionForClearTypes) {
this.sessionForClearTypes =
sessionForClearTypes != null
? ImmutableList.copyOf(sessionForClearTypes)
: ImmutableList.of();
return this;
}
/**
* Sets the key set ID of the offline license.
*
* <p>The key set ID identifies an offline license. The ID is required to query, renew or
* release an existing offline license (see {@code DefaultDrmSessionManager#setMode(int
* mode,byte[] offlineLicenseKeySetId)}).
*/
public Builder setKeySetId(@Nullable byte[] keySetId) {
this.keySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
return this;
}
public DrmConfiguration build() {
return new DrmConfiguration(this);
}
}
/** The UUID of the protection scheme. */
public final UUID uuid;
@ -625,7 +726,7 @@ public final class MediaItem implements Bundleable {
@Nullable public final Uri licenseUri;
/** The headers to attach to the request to the DRM license server. */
public final Map<String, String> requestHeaders;
public final ImmutableMap<String, String> requestHeaders;
/** Whether the DRM configuration is multi session enabled. */
public final boolean multiSession;
@ -643,28 +744,23 @@ public final class MediaItem implements Bundleable {
public final boolean forceDefaultLicenseUri;
/** The types of clear tracks for which to use a DRM session. */
public final List<Integer> sessionForClearTypes;
public final ImmutableList<Integer> sessionForClearTypes;
@Nullable private final byte[] keySetId;
private DrmConfiguration(
UUID uuid,
@Nullable Uri licenseUri,
Map<String, String> requestHeaders,
boolean multiSession,
boolean forceDefaultLicenseUri,
boolean playClearContentWithoutKey,
List<Integer> drmSessionForClearTypes,
@Nullable byte[] keySetId) {
Assertions.checkArgument(!(forceDefaultLicenseUri && licenseUri == null));
this.uuid = uuid;
this.licenseUri = licenseUri;
this.requestHeaders = requestHeaders;
this.multiSession = multiSession;
this.forceDefaultLicenseUri = forceDefaultLicenseUri;
this.playClearContentWithoutKey = playClearContentWithoutKey;
this.sessionForClearTypes = drmSessionForClearTypes;
this.keySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
private DrmConfiguration(Builder builder) {
checkState(!(builder.forceDefaultLicenseUri && builder.licenseUri == null));
this.uuid = checkNotNull(builder.uuid);
this.licenseUri = builder.licenseUri;
this.requestHeaders = builder.licenseRequestHeaders;
this.multiSession = builder.multiSession;
this.forceDefaultLicenseUri = builder.forceDefaultLicenseUri;
this.playClearContentWithoutKey = builder.playClearContentWithoutKey;
this.sessionForClearTypes = builder.sessionForClearTypes;
this.keySetId =
builder.keySetId != null
? Arrays.copyOf(builder.keySetId, builder.keySetId.length)
: null;
}
/** Returns the key set ID of the offline license. */
@ -673,6 +769,10 @@ public final class MediaItem implements Bundleable {
return keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
}
public Builder buildUpon() {
return new Builder(this);
}
@Override
public boolean equals(@Nullable Object obj) {
if (this == obj) {

View File

@ -22,6 +22,7 @@ import android.net.Uri;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.offline.StreamKey;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@ -77,14 +78,15 @@ public class MediaItemTest {
}
@Test
public void builderSetDrmConfig_isNullByDefault() {
public void builder_drmConfigIsNullByDefault() {
// Null value by default.
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNull();
}
@Test
public void builderSetDrmConfig_setsAllProperties() {
@SuppressWarnings("deprecation") // Testing deprecated methods
public void builderSetDrmPropertiesIndividually() {
Uri licenseUri = Uri.parse(URI_STRING);
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Referer", "http://www.google.com");
@ -92,14 +94,14 @@ public class MediaItemTest {
MediaItem mediaItem =
new MediaItem.Builder()
.setUri(URI_STRING)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri)
.setDrmLicenseRequestHeaders(requestHeaders)
.setDrmMultiSession(true)
.setDrmForceDefaultLicenseUri(true)
.setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.setDrmSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO))
.setDrmKeySetId(keySetId)
.setDrmUuid(C.WIDEVINE_UUID)
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
@ -116,6 +118,73 @@ public class MediaItemTest {
}
@Test
@SuppressWarnings("deprecation") // Testing deprecated methods
public void builderSetDrmConfigurationOverwritesIndividualProperties() {
Uri licenseUri = Uri.parse(URI_STRING);
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Referer", "http://www.google.com");
byte[] keySetId = new byte[] {1, 2, 3};
MediaItem mediaItem =
new MediaItem.Builder()
.setUri(URI_STRING)
.setDrmLicenseUri(licenseUri)
.setDrmLicenseRequestHeaders(requestHeaders)
.setDrmMultiSession(true)
.setDrmForceDefaultLicenseUri(true)
.setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.setDrmKeySetId(keySetId)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.CLEARKEY_UUID).build())
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
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.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();
}
@Test
public void builderSetDrmConfiguration() {
Uri licenseUri = Uri.parse(URI_STRING);
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Referer", "http://www.google.com");
byte[] keySetId = new byte[] {1, 2, 3};
MediaItem mediaItem =
new MediaItem.Builder()
.setUri(URI_STRING)
.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(licenseUri)
.setLicenseRequestHeaders(requestHeaders)
.setMultiSession(true)
.setForceDefaultLicenseUri(true)
.setPlayClearContentWithoutKey(true)
.setSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO))
.setKeySetId(keySetId)
.build())
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri);
assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders)
.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)
.containsExactly(C.TRACK_TYPE_AUDIO);
assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isEqualTo(keySetId);
}
@Test
@SuppressWarnings("deprecation") // Testing deprecated methods
public void builderSetDrmSessionForClearPeriods_setsAudioAndVideoTracks() {
Uri licenseUri = Uri.parse(URI_STRING);
MediaItem mediaItem =
@ -132,6 +201,21 @@ public class MediaItemTest {
}
@Test
public void drmConfigurationBuilderSetSessionForClearPeriods_overridesSetSessionForClearTypes() {
Uri licenseUri = Uri.parse(URI_STRING);
MediaItem.DrmConfiguration drmConfiguration =
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(licenseUri)
.setSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO))
.setSessionForClearPeriods(true)
.build();
assertThat(drmConfiguration.sessionForClearTypes)
.containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO);
}
@Test
@SuppressWarnings("deprecation") // Testing deprecated methods
public void builderSetDrmUuid_notCalled_throwsIllegalStateException() {
assertThrows(
IllegalStateException.class,