1fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang/* 2fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Copyright 2018 The Android Open Source Project 3fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 4fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Licensed under the Apache License, Version 2.0 (the "License"); 5fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * you may not use this file except in compliance with the License. 6fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * You may obtain a copy of the License at 7fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 8fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * http://www.apache.org/licenses/LICENSE-2.0 9fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 10fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Unless required by applicable law or agreed to in writing, software 11fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * distributed under the License is distributed on an "AS IS" BASIS, 12fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * See the License for the specific language governing permissions and 14fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * limitations under the License. 15fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 16fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 17fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangpackage androidx.media; 18fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 19fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.content.Context; 20fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport android.net.Uri; 21fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 22fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.annotation.NonNull; 23fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.annotation.Nullable; 24fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport androidx.core.util.Preconditions; 25fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 26fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.io.FileDescriptor; 27fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.net.CookieHandler; 28fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.net.CookieManager; 29fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.net.HttpCookie; 30fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.ArrayList; 31fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.HashMap; 32fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.List; 33fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangimport java.util.Map; 34fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 35fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang/** 36b5cd541ef41913184be2b85527925ca7eee98f6cJaewan Kim * Structure for data source descriptor. Used by {@link MediaItem2}. 37b5cd541ef41913184be2b85527925ca7eee98f6cJaewan Kim * <p> 38b5cd541ef41913184be2b85527925ca7eee98f6cJaewan Kim * Users should use {@link Builder} to change {@link DataSourceDesc}. 39fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 40b5cd541ef41913184be2b85527925ca7eee98f6cJaewan Kim * @see MediaItem2 41fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 42fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kangpublic final class DataSourceDesc { 43fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /* No data source has been set yet */ 44fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public static final int TYPE_NONE = 0; 45fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /* data source is type of MediaDataSource */ 46fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public static final int TYPE_CALLBACK = 1; 47fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /* data source is type of FileDescriptor */ 48fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public static final int TYPE_FD = 2; 49fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /* data source is type of Uri */ 50fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public static final int TYPE_URI = 3; 51fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 52088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim // intentionally less than long.MAX_VALUE. 53088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim // Declare this first to avoid 'illegal forward reference'. 54088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim private static final long LONG_MAX = 0x7ffffffffffffffL; 55088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim 56088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim /** 57088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim * Used when a position is unknown. 58088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim * 59088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim * @see #getEndPosition() 60088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim */ 61088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public static final long POSITION_UNKNOWN = LONG_MAX; 62088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim 63088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim /** 64088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim * Used when the length of file descriptor is unknown. 65088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim * 66088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim * @see #getFileDescriptorLength() 67088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim */ 68088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public static final long FD_LENGTH_UNKNOWN = LONG_MAX; 69fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 70fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private int mType = TYPE_NONE; 71fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 72fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private Media2DataSource mMedia2DataSource; 73fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 74fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private FileDescriptor mFD; 75fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private long mFDOffset = 0; 76088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim private long mFDLength = FD_LENGTH_UNKNOWN; 77fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 78fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private Uri mUri; 79fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private Map<String, String> mUriHeader; 80fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private List<HttpCookie> mUriCookies; 81fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private Context mUriContext; 82fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 83fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private String mMediaId; 84fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private long mStartPositionMs = 0; 85088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim private long mEndPositionMs = POSITION_UNKNOWN; 86fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 87fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private DataSourceDesc() { 88fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 89fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 90fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 91fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the media Id of data source. 92fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the media Id of data source 93fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 94088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @Nullable String getMediaId() { 95fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mMediaId; 96fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 97fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 98fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 99fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the position in milliseconds at which the playback will start. 100fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the position in milliseconds at which the playback will start 101fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 102fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public long getStartPosition() { 103fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mStartPositionMs; 104fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 105fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 106fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 107fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the position in milliseconds at which the playback will end. 108088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim * {@link #POSITION_UNKNOWN} means ending at the end of source content. 109fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the position in milliseconds at which the playback will end 110fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 111fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public long getEndPosition() { 112fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mEndPositionMs; 113fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 114fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 115fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 116fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the type of data source. 117fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the type of data source 118fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 119fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public int getType() { 120fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mType; 121fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 122fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 123fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 124fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the Media2DataSource of this data source. 125fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * It's meaningful only when {@code getType} returns {@link #TYPE_CALLBACK}. 126fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the Media2DataSource of this data source 127fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 128088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @Nullable Media2DataSource getMedia2DataSource() { 129fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mMedia2DataSource; 130fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 131fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 132fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 133fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the FileDescriptor of this data source. 134fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * It's meaningful only when {@code getType} returns {@link #TYPE_FD}. 135fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the FileDescriptor of this data source 136fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 137088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @Nullable FileDescriptor getFileDescriptor() { 138fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mFD; 139fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 140fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 141fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 142fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the offset associated with the FileDescriptor of this data source. 143fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * It's meaningful only when {@code getType} returns {@link #TYPE_FD} and it has 144fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * been set by the {@link Builder}. 145fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the offset associated with the FileDescriptor of this data source 146fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 147fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public long getFileDescriptorOffset() { 148fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mFDOffset; 149fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 150fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 151fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 152fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the content length associated with the FileDescriptor of this data source. 153fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * It's meaningful only when {@code getType} returns {@link #TYPE_FD}. 154088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim * {@link #FD_LENGTH_UNKNOWN} means same as the length of source content. 155fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the content length associated with the FileDescriptor of this data source 156fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 157fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public long getFileDescriptorLength() { 158fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mFDLength; 159fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 160fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 161fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 162fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the Uri of this data source. 163fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * It's meaningful only when {@code getType} returns {@link #TYPE_URI}. 164fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the Uri of this data source 165fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 166088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @Nullable Uri getUri() { 167fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mUri; 168fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 169fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 170fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 171fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the Uri headers of this data source. 172fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * It's meaningful only when {@code getType} returns {@link #TYPE_URI}. 173fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the Uri headers of this data source 174fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 175088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @Nullable Map<String, String> getUriHeaders() { 176fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (mUriHeader == null) { 177fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return null; 178fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 179fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return new HashMap<String, String>(mUriHeader); 180fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 181fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 182fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 183fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the Uri cookies of this data source. 184fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * It's meaningful only when {@code getType} returns {@link #TYPE_URI}. 185fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the Uri cookies of this data source 186fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 187088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @Nullable List<HttpCookie> getUriCookies() { 188fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (mUriCookies == null) { 189fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return null; 190fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 191fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return new ArrayList<HttpCookie>(mUriCookies); 192fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 193fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 194fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 195fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Return the Context used for resolving the Uri of this data source. 196fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * It's meaningful only when {@code getType} returns {@link #TYPE_URI}. 197fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the Context used for resolving the Uri of this data source 198fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 199088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @Nullable Context getUriContext() { 200fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return mUriContext; 201fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 202fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 203fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 204fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Builder class for {@link DataSourceDesc} objects. 205fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 206fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public static class Builder { 207fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private int mType = TYPE_NONE; 208fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 209fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private Media2DataSource mMedia2DataSource; 210fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 211fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private FileDescriptor mFD; 212fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private long mFDOffset = 0; 213088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim private long mFDLength = FD_LENGTH_UNKNOWN; 214fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 215fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private Uri mUri; 216fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private Map<String, String> mUriHeader; 217fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private List<HttpCookie> mUriCookies; 218fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private Context mUriContext; 219fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 220fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private String mMediaId; 221fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private long mStartPositionMs = 0; 222088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim private long mEndPositionMs = POSITION_UNKNOWN; 223fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 224fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 225fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Constructs a new Builder with the defaults. 226fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 227fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang public Builder() { 228fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 229fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 230fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 231fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Constructs a new Builder from a given {@link DataSourceDesc} instance 232fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param dsd the {@link DataSourceDesc} object whose data will be reused 233fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * in the new Builder. 234fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 235088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public Builder(@NonNull DataSourceDesc dsd) { 236fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mType = dsd.mType; 237fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mMedia2DataSource = dsd.mMedia2DataSource; 238fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFD = dsd.mFD; 239fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFDOffset = dsd.mFDOffset; 240fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFDLength = dsd.mFDLength; 241fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUri = dsd.mUri; 242fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriHeader = dsd.mUriHeader; 243fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriCookies = dsd.mUriCookies; 244fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriContext = dsd.mUriContext; 245fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 246fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mMediaId = dsd.mMediaId; 247fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mStartPositionMs = dsd.mStartPositionMs; 248fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mEndPositionMs = dsd.mEndPositionMs; 249fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 250fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 251fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 252fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Combines all of the fields that have been set and return a new 253fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * {@link DataSourceDesc} object. <code>IllegalStateException</code> will be 254fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * thrown if there is conflict between fields. 255fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 256fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return a new {@link DataSourceDesc} object 257fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 258088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull DataSourceDesc build() { 259fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (mType != TYPE_CALLBACK 260fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang && mType != TYPE_FD 261fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang && mType != TYPE_URI) { 262fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang throw new IllegalStateException("Illegal type: " + mType); 263fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 264fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (mStartPositionMs > mEndPositionMs) { 265fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang throw new IllegalStateException("Illegal start/end position: " 266fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang + mStartPositionMs + " : " + mEndPositionMs); 267fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 268fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 269fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang DataSourceDesc dsd = new DataSourceDesc(); 270fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mType = mType; 271fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mMedia2DataSource = mMedia2DataSource; 272fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mFD = mFD; 273fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mFDOffset = mFDOffset; 274fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mFDLength = mFDLength; 275fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mUri = mUri; 276fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mUriHeader = mUriHeader; 277fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mUriCookies = mUriCookies; 278fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mUriContext = mUriContext; 279fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 280fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mMediaId = mMediaId; 281fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mStartPositionMs = mStartPositionMs; 282fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang dsd.mEndPositionMs = mEndPositionMs; 283fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 284fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return dsd; 285fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 286fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 287fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 288fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Sets the media Id of this data source. 289fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 290fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param mediaId the media Id of this data source 291fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the same Builder instance. 292fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 293088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull Builder setMediaId(String mediaId) { 294fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mMediaId = mediaId; 295fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return this; 296fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 297fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 298fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 299fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Sets the start position in milliseconds at which the playback will start. 300fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Any negative number is treated as 0. 301fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 302fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param position the start position in milliseconds at which the playback will start 303fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the same Builder instance. 304fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 305fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 306088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull Builder setStartPosition(long position) { 307fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (position < 0) { 308fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang position = 0; 309fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 310fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mStartPositionMs = position; 311fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return this; 312fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 313fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 314fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 315fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Sets the end position in milliseconds at which the playback will end. 316fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Any negative number is treated as maximum length of the data source. 317fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 318fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param position the end position in milliseconds at which the playback will end 319fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the same Builder instance. 320fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 321088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull Builder setEndPosition(long position) { 322fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (position < 0) { 323088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim position = POSITION_UNKNOWN; 324fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 325fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mEndPositionMs = position; 326fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return this; 327fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 328fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 329fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 330fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Sets the data source (Media2DataSource) to use. 331fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 332fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param m2ds the Media2DataSource for the media you want to play 333fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the same Builder instance. 334fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @throws NullPointerException if m2ds is null. 335fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 336088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull Builder setDataSource(@NonNull Media2DataSource m2ds) { 337fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Preconditions.checkNotNull(m2ds); 338fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang resetDataSource(); 339fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mType = TYPE_CALLBACK; 340fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mMedia2DataSource = m2ds; 341fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return this; 342fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 343fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 344fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 345fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Sets the data source (FileDescriptor) to use. The FileDescriptor must be 346fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * seekable (N.B. a LocalSocket is not seekable). It is the caller's responsibility 347fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * to close the file descriptor after the source has been used. 348fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 349fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param fd the FileDescriptor for the file you want to play 350fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the same Builder instance. 351fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @throws NullPointerException if fd is null. 352fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 353088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull Builder setDataSource(@NonNull FileDescriptor fd) { 354fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Preconditions.checkNotNull(fd); 355fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang resetDataSource(); 356fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mType = TYPE_FD; 357fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFD = fd; 358fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return this; 359fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 360fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 361fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 362fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Sets the data source (FileDescriptor) to use. The FileDescriptor must be 363fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * seekable (N.B. a LocalSocket is not seekable). It is the caller's responsibility 364fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * to close the file descriptor after the source has been used. 365fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 366fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Any negative number for offset is treated as 0. 367fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Any negative number for length is treated as maximum length of the data source. 368fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 369fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param fd the FileDescriptor for the file you want to play 370fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param offset the offset into the file where the data to be played starts, in bytes 371fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param length the length in bytes of the data to be played 372fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the same Builder instance. 373fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @throws NullPointerException if fd is null. 374fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 375088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull Builder setDataSource(@NonNull FileDescriptor fd, long offset, 376088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim long length) { 377fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Preconditions.checkNotNull(fd); 378fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (offset < 0) { 379fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang offset = 0; 380fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 381fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (length < 0) { 382088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim length = FD_LENGTH_UNKNOWN; 383fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 384fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang resetDataSource(); 385fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mType = TYPE_FD; 386fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFD = fd; 387fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFDOffset = offset; 388fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFDLength = length; 389fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return this; 390fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 391fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 392fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 393fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Sets the data source as a content Uri. 394fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 395fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param context the Context to use when resolving the Uri 396fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param uri the Content URI of the data you want to play 397fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the same Builder instance. 398fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @throws NullPointerException if context or uri is null. 399fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 400088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull Builder setDataSource(@NonNull Context context, @NonNull Uri uri) { 401fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Preconditions.checkNotNull(context, "context cannot be null"); 402fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Preconditions.checkNotNull(uri, "uri cannot be null"); 403fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang resetDataSource(); 404fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mType = TYPE_URI; 405fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUri = uri; 406fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriContext = context; 407fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return this; 408fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 409fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 410fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang /** 411fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * Sets the data source as a content Uri. 412fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 413fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * To provide cookies for the subsequent HTTP requests, you can install your own default 414b5cd541ef41913184be2b85527925ca7eee98f6cJaewan Kim * cookie handler and use other variants of setDataSource APIs instead. 415fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 416fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * <p><strong>Note</strong> that the cross domain redirection is allowed by default, 417fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * but that can be changed with key/value pairs through the headers parameter with 418fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * "android-allow-cross-domain-redirect" as the key and "0" or "1" as the value to 419fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * disallow or allow cross domain redirection. 420fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * 421fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param context the Context to use when resolving the Uri 422fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param uri the Content URI of the data you want to play 423fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param headers the headers to be sent together with the request for the data 424fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * The headers must not include cookies. Instead, use the cookies param. 425fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @param cookies the cookies to be sent together with the request 426fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @return the same Builder instance. 427fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @throws NullPointerException if context or uri is null. 428fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * @throws IllegalArgumentException if the cookie handler is not of CookieManager type 429fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang * when cookies are provided. 430fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang */ 431088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim public @NonNull Builder setDataSource(@NonNull Context context, @NonNull Uri uri, 432fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang @Nullable Map<String, String> headers, @Nullable List<HttpCookie> cookies) { 433fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Preconditions.checkNotNull(context, "context cannot be null"); 434fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang Preconditions.checkNotNull(uri); 435fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (cookies != null) { 436fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang CookieHandler cookieHandler = CookieHandler.getDefault(); 437fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (cookieHandler != null && !(cookieHandler instanceof CookieManager)) { 438fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang throw new IllegalArgumentException( 439fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang "The cookie handler has to be of CookieManager type " 440fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang + "when cookies are provided."); 441fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 442fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 443fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 444fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang resetDataSource(); 445fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mType = TYPE_URI; 446fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUri = uri; 447fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (headers != null) { 448fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriHeader = new HashMap<String, String>(headers); 449fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 450fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang if (cookies != null) { 451fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriCookies = new ArrayList<HttpCookie>(cookies); 452fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 453fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriContext = context; 454fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang return this; 455fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 456fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang 457fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang private void resetDataSource() { 458fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mType = TYPE_NONE; 459fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mMedia2DataSource = null; 460fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFD = null; 461fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mFDOffset = 0; 462088a4052ef5856e551bac28dbc939a62627b8a88Jaewan Kim mFDLength = FD_LENGTH_UNKNOWN; 463fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUri = null; 464fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriHeader = null; 465fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriCookies = null; 466fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang mUriContext = null; 467fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 468fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang } 469fbbf807584a0fbe7a01a0aa9920330cad45689aaInsun Kang}