[go: nahoru, domu]

blob: f8e4f9548b499229b5ee89241f25bfe490e79425 [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.media2.common;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.util.Preconditions;
import androidx.versionedparcelable.ParcelUtils;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpCookie;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Structure for media item descriptor for {@link Uri}.
* <p>
* Users should use {@link Builder} to create {@link UriMediaItem}.
* <p>
* You cannot directly send this object across the process through {@link ParcelUtils}. See
* {@link MediaItem} for detail.
*
* @see MediaItem
*/
public class UriMediaItem extends MediaItem {
private final Uri mUri;
private final Map<String, String> mUriHeader;
private final List<HttpCookie> mUriCookies;
UriMediaItem(Builder builder) {
super(builder);
mUri = builder.mUri;
mUriHeader = builder.mUriHeader;
mUriCookies = builder.mUriCookies;
}
/**
* Return the Uri of this media item.
* @return the Uri of this media item
*/
@NonNull
public Uri getUri() {
return mUri;
}
/**
* Return the Uri headers of this media item.
* @return the Uri headers of this media item
*/
@Nullable
public Map<String, String> getUriHeaders() {
if (mUriHeader == null) {
return null;
}
return new HashMap<String, String>(mUriHeader);
}
/**
* Return the Uri cookies of this media item.
* @return the Uri cookies of this media item
*/
@Nullable
public List<HttpCookie> getUriCookies() {
if (mUriCookies == null) {
return null;
}
return new ArrayList<HttpCookie>(mUriCookies);
}
/**
* This Builder class simplifies the creation of a {@link UriMediaItem} object.
*/
public static final class Builder extends MediaItem.Builder {
@SuppressWarnings("WeakerAccess") /* synthetic access */
Uri mUri;
@SuppressWarnings("WeakerAccess") /* synthetic access */
Map<String, String> mUriHeader;
@SuppressWarnings("WeakerAccess") /* synthetic access */
List<HttpCookie> mUriCookies;
/**
* Creates a new Builder object with a content Uri.
*
* @param uri the Content URI of the data you want to play
*/
public Builder(@NonNull Uri uri) {
this(uri, null, null);
}
/**
* Creates a new Builder object with a content Uri.
*
* To provide cookies for the subsequent HTTP requests, you can install your own default
* cookie handler and use other variants of setMediaItem APIs instead.
*
* <p><strong>Note</strong> that the cross domain redirection is allowed by default,
* but that can be changed with key/value pairs through the headers parameter with
* "android-allow-cross-domain-redirect" as the key and "0" or "1" as the value to
* disallow or allow cross domain redirection.
*
* @param uri the Content URI of the data you want to play
* @param headers the headers to be sent together with the request for the data
* The headers must not include cookies. Instead, use the cookies param.
* @param cookies the cookies to be sent together with the request
* @throws IllegalArgumentException if the cookie handler is not of CookieManager type
* when cookies are provided.
*/
public Builder(@NonNull Uri uri, @Nullable Map<String, String> headers,
@Nullable List<HttpCookie> cookies) {
Preconditions.checkNotNull(uri, "uri cannot be null");
mUri = uri;
if (cookies != null) {
CookieHandler cookieHandler = CookieHandler.getDefault();
if (cookieHandler != null && !(cookieHandler instanceof CookieManager)) {
throw new IllegalArgumentException(
"The cookie handler has to be of CookieManager type "
+ "when cookies are provided");
}
}
mUri = uri;
if (headers != null) {
mUriHeader = new HashMap<String, String>(headers);
}
if (cookies != null) {
mUriCookies = new ArrayList<HttpCookie>(cookies);
}
}
// Override just to change return type.
@Override
@NonNull
public Builder setMetadata(@Nullable MediaMetadata metadata) {
return (Builder) super.setMetadata(metadata);
}
// Override just to change return type.
@Override
@NonNull
public Builder setStartPosition(long position) {
return (Builder) super.setStartPosition(position);
}
// Override just to change return type.
@Override
@NonNull
public Builder setEndPosition(long position) {
return (Builder) super.setEndPosition(position);
}
/**
* @return A new UriMediaItem with values supplied by the Builder.
*/
@Override
@NonNull
public UriMediaItem build() {
return new UriMediaItem(this);
}
}
}