diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 67abce015b..5816b1bd29 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -27,6 +27,8 @@ `HttpDataSource.Factory.setDefaultRequestProperties` instead. * Fix playback issues after seeking during an ad ([#8349](https://github.com/google/ExoPlayer/issues/8349)) + * Add `DefaultHttpDataSource.Factory` and deprecate + `DefaultHttpDataSourceFactory`. * Track selection: * Add option to specify multiple preferred audio or text languages. * Forward `Timeline` and `MediaPeriodId` to `TrackSelection.Factory`. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java index 12fea3898c..534378a635 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java @@ -132,12 +132,12 @@ public final class DefaultDataSource implements DataSource { boolean allowCrossProtocolRedirects) { this( context, - new DefaultHttpDataSource( - userAgent, - connectTimeoutMillis, - readTimeoutMillis, - allowCrossProtocolRedirects, - /* defaultRequestProperties= */ null)); + new DefaultHttpDataSource.Factory() + .setUserAgent(userAgent) + .setConnectTimeoutMs(connectTimeoutMillis) + .setReadTimeoutMs(readTimeoutMillis) + .setAllowCrossProtocolRedirects(allowCrossProtocolRedirects) + .createDataSource()); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java index 68ce25c47f..a13008c338 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java @@ -59,7 +59,7 @@ public final class DefaultDataSourceFactory implements Factory { */ public DefaultDataSourceFactory( Context context, String userAgent, @Nullable TransferListener listener) { - this(context, listener, new DefaultHttpDataSourceFactory(userAgent, listener)); + this(context, listener, new DefaultHttpDataSource.Factory().setUserAgent(userAgent)); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java index 94c02c7e83..15bee2c118 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.upstream; +import static com.google.android.exoplayer2.ExoPlayerLibraryInfo.DEFAULT_USER_AGENT; import static java.lang.Math.max; import static java.lang.Math.min; @@ -52,16 +53,148 @@ import java.util.zip.GZIPInputStream; * An {@link HttpDataSource} that uses Android's {@link HttpURLConnection}. * *
By default this implementation will not follow cross-protocol redirects (i.e. redirects from - * HTTP to HTTPS or vice versa). Cross-protocol redirects can be enabled by using the {@link - * #DefaultHttpDataSource(String, int, int, boolean, RequestProperties)} constructor and passing - * {@code true} for the {@code allowCrossProtocolRedirects} argument. + * HTTP to HTTPS or vice versa). Cross-protocol redirects can be enabled by passing {@code true} to + * {@link DefaultHttpDataSource.Factory#setAllowCrossProtocolRedirects(boolean)}. * *
Note: HTTP request headers will be set using all parameters passed via (in order of decreasing
- * priority) the {@code dataSpec}, {@link #setRequestProperty} and the default parameters used to
- * construct the instance.
+ * priority) the {@code dataSpec}, {@link #setRequestProperty} and the default properties that can
+ * be passed to {@link HttpDataSource.Factory#setDefaultRequestProperties(Map)}.
*/
public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSource {
+ /** {@link DataSource.Factory} for {@link DefaultHttpDataSource} instances. */
+ public static final class Factory implements HttpDataSource.Factory {
+
+ private final RequestProperties defaultRequestProperties;
+
+ @Nullable private TransferListener transferListener;
+ @Nullable private Predicate The default is {@link ExoPlayerLibraryInfo#DEFAULT_USER_AGENT}.
+ *
+ * @param userAgent The user agent that will be used.
+ * @return This factory.
+ */
+ public Factory setUserAgent(String userAgent) {
+ this.userAgent = userAgent;
+ return this;
+ }
+
+ /**
+ * Sets the connect timeout, in milliseconds.
+ *
+ * The default is {@link DefaultHttpDataSource#DEFAULT_CONNECT_TIMEOUT_MILLIS}.
+ *
+ * @param connectTimeoutMs The connect timeout, in milliseconds, that will be used.
+ * @return This factory.
+ */
+ public Factory setConnectTimeoutMs(int connectTimeoutMs) {
+ this.connectTimeoutMs = connectTimeoutMs;
+ return this;
+ }
+
+ /**
+ * Sets the read timeout, in milliseconds.
+ *
+ * The default is {@link DefaultHttpDataSource#DEFAULT_READ_TIMEOUT_MILLIS}.
+ *
+ * @param readTimeoutMs The connect timeout, in milliseconds, that will be used.
+ * @return This factory.
+ */
+ public Factory setReadTimeoutMs(int readTimeoutMs) {
+ this.readTimeoutMs = readTimeoutMs;
+ return this;
+ }
+
+ /**
+ * Sets whether to allow cross protocol redirects.
+ *
+ * The default is {@code false}.
+ *
+ * @param allowCrossProtocolRedirects Whether to allow cross protocol redirects.
+ * @return This factory.
+ */
+ public Factory setAllowCrossProtocolRedirects(boolean allowCrossProtocolRedirects) {
+ this.allowCrossProtocolRedirects = allowCrossProtocolRedirects;
+ return this;
+ }
+
+ /**
+ * Sets a content type {@link Predicate}. If a content type is rejected by the predicate then a
+ * {@link HttpDataSource.InvalidContentTypeException} is thrown from {@link
+ * DefaultHttpDataSource#open(DataSpec)}.
+ *
+ * The default is {@code null}.
+ *
+ * @param contentTypePredicate The content type {@link Predicate}, or {@code null} to clear a
+ * predicate that was previously set.
+ * @return This factory.
+ */
+ public Factory setContentTypePredicate(@Nullable Predicate The default is {@code null}.
+ *
+ * See {@link DataSource#addTransferListener(TransferListener)}.
+ *
+ * @param transferListener The listener that will be used.
+ * @return This factory.
+ */
+ public Factory setTransferListener(@Nullable TransferListener transferListener) {
+ this.transferListener = transferListener;
+ return this;
+ }
+
+ @Override
+ public DefaultHttpDataSource createDataSource() {
+ DefaultHttpDataSource dataSource =
+ new DefaultHttpDataSource(
+ userAgent,
+ connectTimeoutMs,
+ readTimeoutMs,
+ allowCrossProtocolRedirects,
+ defaultRequestProperties,
+ contentTypePredicate);
+ if (transferListener != null) {
+ dataSource.addTransferListener(transferListener);
+ }
+ return dataSource;
+ }
+ }
+
/** The default connection timeout, in milliseconds. */
public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8 * 1000;
/**
@@ -98,7 +231,9 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou
private long bytesSkipped;
private long bytesRead;
- /** Creates an instance. */
+ /** @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */
+ @SuppressWarnings("deprecation")
+ @Deprecated
public DefaultHttpDataSource() {
this(
ExoPlayerLibraryInfo.DEFAULT_USER_AGENT,
@@ -106,24 +241,16 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou
DEFAULT_READ_TIMEOUT_MILLIS);
}
- /**
- * Creates an instance.
- *
- * @param userAgent The User-Agent string that should be used.
- */
+ /** @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */
+ @SuppressWarnings("deprecation")
+ @Deprecated
public DefaultHttpDataSource(String userAgent) {
this(userAgent, DEFAULT_CONNECT_TIMEOUT_MILLIS, DEFAULT_READ_TIMEOUT_MILLIS);
}
- /**
- * Creates an instance.
- *
- * @param userAgent The User-Agent string that should be used.
- * @param connectTimeoutMillis The connection timeout, in milliseconds. A timeout of zero is
- * interpreted as an infinite timeout.
- * @param readTimeoutMillis The read timeout, in milliseconds. A timeout of zero is interpreted as
- * an infinite timeout.
- */
+ /** @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */
+ @SuppressWarnings("deprecation")
+ @Deprecated
public DefaultHttpDataSource(String userAgent, int connectTimeoutMillis, int readTimeoutMillis) {
this(
userAgent,
@@ -133,129 +260,45 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou
/* defaultRequestProperties= */ null);
}
- /**
- * Creates an instance.
- *
- * @param userAgent The User-Agent string that should be used.
- * @param connectTimeoutMillis The connection timeout, in milliseconds. A timeout of zero is
- * interpreted as an infinite timeout. Pass {@link #DEFAULT_CONNECT_TIMEOUT_MILLIS} to use the
- * default value.
- * @param readTimeoutMillis The read timeout, in milliseconds. A timeout of zero is interpreted as
- * an infinite timeout. Pass {@link #DEFAULT_READ_TIMEOUT_MILLIS} to use the default value.
- * @param allowCrossProtocolRedirects Whether cross-protocol redirects (i.e. redirects from HTTP
- * to HTTPS and vice versa) are enabled.
- * @param defaultRequestProperties The default request properties to be sent to the server as HTTP
- * headers or {@code null} if not required.
- */
+ /** @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */
+ @Deprecated
public DefaultHttpDataSource(
String userAgent,
int connectTimeoutMillis,
int readTimeoutMillis,
boolean allowCrossProtocolRedirects,
@Nullable RequestProperties defaultRequestProperties) {
- super(/* isNetwork= */ true);
- this.userAgent = Assertions.checkNotEmpty(userAgent);
- this.requestProperties = new RequestProperties();
- this.connectTimeoutMillis = connectTimeoutMillis;
- this.readTimeoutMillis = readTimeoutMillis;
- this.allowCrossProtocolRedirects = allowCrossProtocolRedirects;
- this.defaultRequestProperties = defaultRequestProperties;
- }
-
- /**
- * Creates an instance.
- *
- * @param userAgent The User-Agent string that should be used.
- * @param contentTypePredicate An optional {@link Predicate}. If a content type is rejected by the
- * predicate then a {@link HttpDataSource.InvalidContentTypeException} is thrown from {@link
- * #open(DataSpec)}.
- * @deprecated Use {@link #DefaultHttpDataSource(String)} and {@link
- * #setContentTypePredicate(Predicate)}.
- */
- @SuppressWarnings("deprecation")
- @Deprecated
- public DefaultHttpDataSource(String userAgent, @Nullable Predicate