Commit 041a0696 by bachinger Committed by Oliver Woodman

remove UriBundle

PiperOrigin-RevId: 299361095
parent 26d3914e
...@@ -489,7 +489,9 @@ public class PlayerActivity extends AppCompatActivity ...@@ -489,7 +489,9 @@ public class PlayerActivity extends AppCompatActivity
return null; return null;
} }
builder builder
.setDrmLicenseUri(createLicenseUriBundle(parameters.drmInfo)) .setDrmLicenseUri(parameters.drmInfo.drmLicenseUrl)
.setDrmLicenseRequestHeaders(
createLicenseHeaders(parameters.drmInfo.drmKeyRequestProperties))
.setDrmUuid(parameters.drmInfo.drmScheme) .setDrmUuid(parameters.drmInfo.drmScheme)
.setDrmMultiSession(parameters.drmInfo.drmMultiSession); .setDrmMultiSession(parameters.drmInfo.drmMultiSession);
drmSessionForClearTypes = parameters.drmInfo.drmSessionForClearTypes; drmSessionForClearTypes = parameters.drmInfo.drmSessionForClearTypes;
...@@ -509,16 +511,16 @@ public class PlayerActivity extends AppCompatActivity ...@@ -509,16 +511,16 @@ public class PlayerActivity extends AppCompatActivity
.createMediaSource(builder.build()); .createMediaSource(builder.build());
} }
private static MediaItem.UriBundle createLicenseUriBundle(Sample.DrmInfo drmInfo) { @Nullable
Uri licenseUri = Uri.parse(drmInfo.drmLicenseUrl); private Map<String, String> createLicenseHeaders(@Nullable String[] drmKeyRequestProperties) {
if (drmInfo.drmKeyRequestProperties == null || drmInfo.drmKeyRequestProperties.length == 0) { if (drmKeyRequestProperties == null || drmKeyRequestProperties.length == 0) {
return new MediaItem.UriBundle(licenseUri); return null;
} }
Map<String, String> headers = new HashMap<>(); Map<String, String> headers = new HashMap<>();
for (int i = 0; i < drmInfo.drmKeyRequestProperties.length; i += 2) { for (int i = 0; i < drmKeyRequestProperties.length; i += 2) {
headers.put(drmInfo.drmKeyRequestProperties[i], drmInfo.drmKeyRequestProperties[i + 1]); headers.put(drmKeyRequestProperties[i], drmKeyRequestProperties[i + 1]);
} }
return new MediaItem.UriBundle(licenseUri, headers); return headers;
} }
private void releasePlayer() { private void releasePlayer() {
......
...@@ -56,7 +56,8 @@ public final class MediaItem { ...@@ -56,7 +56,8 @@ public final class MediaItem {
@Nullable private String mediaId; @Nullable private String mediaId;
@Nullable private Uri sourceUri; @Nullable private Uri sourceUri;
@Nullable private String extension; @Nullable private String extension;
@Nullable private UriBundle drmLicenseUri; @Nullable private Uri drmLicenseUri;
private Map<String, String> drmLicenseRequestHeaders;
@Nullable private UUID drmUuid; @Nullable private UUID drmUuid;
private boolean drmMultiSession; private boolean drmMultiSession;
private List<StreamKey> streamKeys; private List<StreamKey> streamKeys;
...@@ -65,14 +66,13 @@ public final class MediaItem { ...@@ -65,14 +66,13 @@ public final class MediaItem {
/** Creates a builder. */ /** Creates a builder. */
public Builder() { public Builder() {
streamKeys = Collections.emptyList(); streamKeys = Collections.emptyList();
drmLicenseRequestHeaders = Collections.emptyMap();
} }
/** /**
* Sets the optional media id which identifies the media item. If not specified, {@code * Sets the optional media id which identifies the media item. If not specified, {@code
* #setSourceUri} must be called and the string representation of {@link * #setSourceUri} must be called and the string representation of {@link
* PlaybackProperties#sourceUri} is used as the media id. * PlaybackProperties#sourceUri} is used as the media id.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setMediaId(@Nullable String mediaId) { public Builder setMediaId(@Nullable String mediaId) {
this.mediaId = mediaId; this.mediaId = mediaId;
...@@ -81,8 +81,6 @@ public final class MediaItem { ...@@ -81,8 +81,6 @@ public final class MediaItem {
/** /**
* Sets the optional source uri. If not specified, {@link #setMediaId(String)} must be called. * Sets the optional source uri. If not specified, {@link #setMediaId(String)} must be called.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setSourceUri(@Nullable String sourceUri) { public Builder setSourceUri(@Nullable String sourceUri) {
return setSourceUri(sourceUri == null ? null : Uri.parse(sourceUri)); return setSourceUri(sourceUri == null ? null : Uri.parse(sourceUri));
...@@ -91,8 +89,6 @@ public final class MediaItem { ...@@ -91,8 +89,6 @@ public final class MediaItem {
/** /**
* Sets the optional source {@link Uri}. If not specified, {@link #setMediaId(String)} must be * Sets the optional source {@link Uri}. If not specified, {@link #setMediaId(String)} must be
* called. * called.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setSourceUri(@Nullable Uri sourceUri) { public Builder setSourceUri(@Nullable Uri sourceUri) {
this.sourceUri = sourceUri; this.sourceUri = sourceUri;
...@@ -107,8 +103,6 @@ public final class MediaItem { ...@@ -107,8 +103,6 @@ public final class MediaItem {
* *
* <p>If a {@link PlaybackProperties#sourceUri} is set, the extension is used to create a {@link * <p>If a {@link PlaybackProperties#sourceUri} is set, the extension is used to create a {@link
* PlaybackProperties} object. Otherwise it will be ignored. * PlaybackProperties} object. Otherwise it will be ignored.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setExtension(@Nullable String extension) { public Builder setExtension(@Nullable String extension) {
this.extension = extension; this.extension = extension;
...@@ -116,44 +110,40 @@ public final class MediaItem { ...@@ -116,44 +110,40 @@ public final class MediaItem {
} }
/** /**
* Sets the optional license server {@link UriBundle}. If a license uri is set, the {@link * Sets the optional license server {@link Uri}. If a license uri is set, the {@link
* DrmConfiguration#uuid} needs to be specified as well. * DrmConfiguration#uuid} needs to be specified as well.
* *
* <p>if a {@link PlaybackProperties#sourceUri} is set, the drm license uri is used to create a * <p>If a {@link PlaybackProperties#sourceUri} is set, the drm license uri is used to create a
* {@link PlaybackProperties} object. Otherwise it will be ignored. * {@link PlaybackProperties} object. Otherwise it will be ignored.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setDrmLicenseUri(@Nullable UriBundle licenseUri) { public Builder setDrmLicenseUri(@Nullable Uri licenseUri) {
drmLicenseUri = licenseUri; drmLicenseUri = licenseUri;
return this; return this;
} }
/** /**
* Sets the optional license server {@link Uri}. If a license uri is set, the {@link * Sets the optional license server uri as a {@link String}. If a license uri is set, the {@link
* DrmConfiguration#uuid} needs to be specified as well. * DrmConfiguration#uuid} needs to be specified as well.
* *
* <p>If a {@link PlaybackProperties#sourceUri} is set, the drm license uri is used to create a * <p>If a {@link PlaybackProperties#sourceUri} is set, the drm license uri is used to create a
* {@link PlaybackProperties} object. Otherwise it will be ignored. * {@link PlaybackProperties} object. Otherwise it will be ignored.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setDrmLicenseUri(@Nullable Uri licenseUri) { public Builder setDrmLicenseUri(@Nullable String licenseUri) {
drmLicenseUri = licenseUri == null ? null : new UriBundle(licenseUri); drmLicenseUri = licenseUri == null ? null : Uri.parse(licenseUri);
return this; return this;
} }
/** /**
* Sets the optional license server uri as a {@link String}. If a license uri is set, the {@link * Sets the optional request headers attached to the drm license request.
* DrmConfiguration#uuid} needs to be specified as well.
* *
* <p>If a {@link PlaybackProperties#sourceUri} is set, the drm license uri is used to create a * <p>If no valid drm configuration is specified, the drm license request headers are ignored.
* {@link PlaybackProperties} object. Otherwise it will be ignored.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setDrmLicenseUri(@Nullable String licenseUri) { public Builder setDrmLicenseRequestHeaders(
drmLicenseUri = licenseUri == null ? null : new UriBundle(Uri.parse(licenseUri)); @Nullable Map<String, String> drmLicenseRequestHeaders) {
this.drmLicenseRequestHeaders =
drmLicenseRequestHeaders != null && !drmLicenseRequestHeaders.isEmpty()
? drmLicenseRequestHeaders
: Collections.emptyMap();
return this; return this;
} }
...@@ -163,8 +153,6 @@ public final class MediaItem { ...@@ -163,8 +153,6 @@ public final class MediaItem {
* *
* <p>If a {@link PlaybackProperties#sourceUri} is set, the drm system uuid is used to create a * <p>If a {@link PlaybackProperties#sourceUri} is set, the drm system uuid is used to create a
* {@link PlaybackProperties} object. Otherwise it will be ignored. * {@link PlaybackProperties} object. Otherwise it will be ignored.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setDrmUuid(@Nullable UUID uuid) { public Builder setDrmUuid(@Nullable UUID uuid) {
drmUuid = uuid; drmUuid = uuid;
...@@ -176,8 +164,6 @@ public final class MediaItem { ...@@ -176,8 +164,6 @@ public final class MediaItem {
* *
* <p>If a {@link PlaybackProperties#sourceUri} is set, the drm multi session flag is used to * <p>If a {@link PlaybackProperties#sourceUri} is set, the drm multi session flag is used to
* create a {@link PlaybackProperties} object. Otherwise it will be ignored. * create a {@link PlaybackProperties} object. Otherwise it will be ignored.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setDrmMultiSession(boolean multiSession) { public Builder setDrmMultiSession(boolean multiSession) {
drmMultiSession = multiSession; drmMultiSession = multiSession;
...@@ -190,8 +176,6 @@ public final class MediaItem { ...@@ -190,8 +176,6 @@ public final class MediaItem {
* *
* <p>If a {@link PlaybackProperties#sourceUri} is set, the stream keys are used to create a * <p>If a {@link PlaybackProperties#sourceUri} is set, the stream keys are used to create a
* {@link PlaybackProperties} object. Otherwise it will be ignored. * {@link PlaybackProperties} object. Otherwise it will be ignored.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setStreamKeys(@Nullable List<StreamKey> streamKeys) { public Builder setStreamKeys(@Nullable List<StreamKey> streamKeys) {
this.streamKeys = this.streamKeys =
...@@ -208,8 +192,6 @@ public final class MediaItem { ...@@ -208,8 +192,6 @@ public final class MediaItem {
* *
* <p>If a {@link PlaybackProperties#sourceUri} is set, the tag is used to create a {@link * <p>If a {@link PlaybackProperties#sourceUri} is set, the tag is used to create a {@link
* PlaybackProperties} object. Otherwise it will be ignored. * PlaybackProperties} object. Otherwise it will be ignored.
*
* @throws IllegalStateException If {@link #build()} has already been called.
*/ */
public Builder setTag(@Nullable Object tag) { public Builder setTag(@Nullable Object tag) {
this.tag = tag; this.tag = tag;
...@@ -218,8 +200,6 @@ public final class MediaItem { ...@@ -218,8 +200,6 @@ public final class MediaItem {
/** /**
* Returns a new {@link MediaItem} instance with the current builder values. * Returns a new {@link MediaItem} instance with the current builder values.
*
* @throws IllegalStateException If a required property is not set.
*/ */
public MediaItem build() { public MediaItem build() {
Assertions.checkState(drmLicenseUri == null || drmUuid != null); Assertions.checkState(drmLicenseUri == null || drmUuid != null);
...@@ -230,7 +210,8 @@ public final class MediaItem { ...@@ -230,7 +210,8 @@ public final class MediaItem {
sourceUri, sourceUri,
extension, extension,
drmUuid != null drmUuid != null
? new DrmConfiguration(drmUuid, drmLicenseUri, drmMultiSession) ? new DrmConfiguration(
drmUuid, drmLicenseUri, drmLicenseRequestHeaders, drmMultiSession)
: null, : null,
streamKeys, streamKeys,
tag); tag);
...@@ -240,59 +221,6 @@ public final class MediaItem { ...@@ -240,59 +221,6 @@ public final class MediaItem {
} }
} }
/** Bundles a resource's URI with headers to attach to any request to that URI. */
public static final class UriBundle {
/** An empty {@link UriBundle}. */
public static final UriBundle EMPTY = new UriBundle(Uri.EMPTY);
/** A URI. */
public final Uri uri;
/** The headers to attach to any request for the given URI. */
public final Map<String, String> requestHeaders;
/**
* Creates an instance with no request headers.
*
* @param uri See {@link #uri}.
*/
public UriBundle(Uri uri) {
this(uri, Collections.emptyMap());
}
/**
* Creates an instance with the given URI and request headers.
*
* @param uri See {@link #uri}.
* @param requestHeaders See {@link #requestHeaders}.
*/
public UriBundle(Uri uri, Map<String, String> requestHeaders) {
this.uri = uri;
this.requestHeaders = Collections.unmodifiableMap(new HashMap<>(requestHeaders));
}
@Override
public boolean equals(@Nullable Object other) {
if (this == other) {
return true;
}
if (other == null || getClass() != other.getClass()) {
return false;
}
UriBundle uriBundle = (UriBundle) other;
return uri.equals(uriBundle.uri) && requestHeaders.equals(uriBundle.requestHeaders);
}
@Override
public int hashCode() {
int result = uri.hashCode();
result = 31 * result + requestHeaders.hashCode();
return result;
}
}
/** DRM configuration for a media item. */ /** DRM configuration for a media item. */
public static final class DrmConfiguration { public static final class DrmConfiguration {
...@@ -303,7 +231,10 @@ public final class MediaItem { ...@@ -303,7 +231,10 @@ public final class MediaItem {
* Optional license server {@link Uri}. If {@code null} then the license server must be * Optional license server {@link Uri}. If {@code null} then the license server must be
* specified by the media. * specified by the media.
*/ */
@Nullable public final UriBundle licenseUri; @Nullable public final Uri licenseUri;
/** The headers to attach to the request for the license uri. */
public final Map<String, String> requestHeaders;
/** Whether the drm configuration is multi session enabled. */ /** Whether the drm configuration is multi session enabled. */
public final boolean multiSession; public final boolean multiSession;
...@@ -313,11 +244,17 @@ public final class MediaItem { ...@@ -313,11 +244,17 @@ public final class MediaItem {
* *
* @param uuid See {@link #uuid}. * @param uuid See {@link #uuid}.
* @param licenseUri See {@link #licenseUri}. * @param licenseUri See {@link #licenseUri}.
* @param requestHeaders See {@link #requestHeaders}.
* @param multiSession See {@link #multiSession}. * @param multiSession See {@link #multiSession}.
*/ */
public DrmConfiguration(UUID uuid, @Nullable UriBundle licenseUri, boolean multiSession) { public DrmConfiguration(
UUID uuid,
@Nullable Uri licenseUri,
Map<String, String> requestHeaders,
boolean multiSession) {
this.uuid = uuid; this.uuid = uuid;
this.licenseUri = licenseUri; this.licenseUri = licenseUri;
this.requestHeaders = Collections.unmodifiableMap(new HashMap<>(requestHeaders));
this.multiSession = multiSession; this.multiSession = multiSession;
} }
...@@ -333,6 +270,7 @@ public final class MediaItem { ...@@ -333,6 +270,7 @@ public final class MediaItem {
DrmConfiguration other = (DrmConfiguration) obj; DrmConfiguration other = (DrmConfiguration) obj;
return uuid.equals(other.uuid) return uuid.equals(other.uuid)
&& Util.areEqual(licenseUri, other.licenseUri) && Util.areEqual(licenseUri, other.licenseUri)
&& Util.areEqual(requestHeaders, other.requestHeaders)
&& multiSession == other.multiSession; && multiSession == other.multiSession;
} }
...@@ -340,6 +278,7 @@ public final class MediaItem { ...@@ -340,6 +278,7 @@ public final class MediaItem {
public int hashCode() { public int hashCode() {
int result = uuid.hashCode(); int result = uuid.hashCode();
result = 31 * result + (licenseUri != null ? licenseUri.hashCode() : 0); result = 31 * result + (licenseUri != null ? licenseUri.hashCode() : 0);
result = 31 * result + requestHeaders.hashCode();
result = 31 * result + (multiSession ? 1 : 0); result = 31 * result + (multiSession ? 1 : 0);
return result; return result;
} }
......
...@@ -280,9 +280,8 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { ...@@ -280,9 +280,8 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
private MediaDrmCallback createHttpMediaDrmCallback(MediaItem.DrmConfiguration drmConfiguration) { private MediaDrmCallback createHttpMediaDrmCallback(MediaItem.DrmConfiguration drmConfiguration) {
Assertions.checkNotNull(drmConfiguration.licenseUri); Assertions.checkNotNull(drmConfiguration.licenseUri);
HttpMediaDrmCallback drmCallback = HttpMediaDrmCallback drmCallback =
new HttpMediaDrmCallback( new HttpMediaDrmCallback(drmConfiguration.licenseUri.toString(), drmHttpDataSourceFactory);
drmConfiguration.licenseUri.uri.toString(), drmHttpDataSourceFactory); for (Map.Entry<String, String> entry : drmConfiguration.requestHeaders.entrySet()) {
for (Map.Entry<String, String> entry : drmConfiguration.licenseUri.requestHeaders.entrySet()) {
drmCallback.setKeyRequestProperty(entry.getKey(), entry.getValue()); drmCallback.setKeyRequestProperty(entry.getKey(), entry.getValue());
} }
return drmCallback; return drmCallback;
......
...@@ -22,7 +22,9 @@ import android.net.Uri; ...@@ -22,7 +22,9 @@ import android.net.Uri;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.offline.StreamKey;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
...@@ -79,19 +81,23 @@ public class MediaItemTest { ...@@ -79,19 +81,23 @@ public class MediaItemTest {
@Test @Test
public void builderSetDrmConfig_setsAllProperties() { public void builderSetDrmConfig_setsAllProperties() {
MediaItem.UriBundle licenseUri = new MediaItem.UriBundle(Uri.parse(URI_STRING)); Uri licenseUri = Uri.parse(URI_STRING);
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Referer", "http://www.google.com");
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder() new MediaItem.Builder()
.setSourceUri(URI_STRING) .setSourceUri(URI_STRING)
.setDrmUuid(C.WIDEVINE_UUID) .setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri) .setDrmLicenseUri(licenseUri)
.setDrmLicenseRequestHeaders(requestHeaders)
.setDrmMultiSession(/* multiSession= */ true) .setDrmMultiSession(/* multiSession= */ true)
.build(); .build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID); assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri); assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri);
assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders)
.isEqualTo(requestHeaders);
assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue(); assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue();
} }
...@@ -103,7 +109,7 @@ public class MediaItemTest { ...@@ -103,7 +109,7 @@ public class MediaItemTest {
new MediaItem.Builder() new MediaItem.Builder()
.setSourceUri(URI_STRING) .setSourceUri(URI_STRING)
// missing uuid // missing uuid
.setDrmLicenseUri(new MediaItem.UriBundle(Uri.parse(URI_STRING))) .setDrmLicenseUri(Uri.parse(URI_STRING))
.build()); .build());
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment