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}