From fe8996e634c5c3bbee0cf1cce1eb6383748f610e Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 23 Mar 2022 10:05:27 +0000 Subject: [PATCH] Allow stable API users to customise the DataSource used Also stabilise the 3 HTTP-based DataSource implementations: * DefaultHttpDataSource * OkHttpDataSource * CronetDataSource PiperOrigin-RevId: 436690643 --- .../media3/datasource/BaseDataSource.java | 1 + .../media3/datasource/DataSource.java | 7 +++- .../datasource/DefaultHttpDataSource.java | 28 +++++++++++++-- .../media3/datasource/HttpDataSource.java | 1 + .../datasource/cronet/CronetDataSource.java | 34 +++++++++++++++++-- .../media3/datasource/cronet/CronetUtil.java | 2 +- .../datasource/okhttp/OkHttpDataSource.java | 20 ++++++++++- .../source/DefaultMediaSourceFactory.java | 1 - 8 files changed, 84 insertions(+), 10 deletions(-) diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/BaseDataSource.java b/libraries/datasource/src/main/java/androidx/media3/datasource/BaseDataSource.java index 4a826df2c2..55d721bce7 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/BaseDataSource.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/BaseDataSource.java @@ -48,6 +48,7 @@ public abstract class BaseDataSource implements DataSource { this.listeners = new ArrayList<>(/* initialCapacity= */ 1); } + @UnstableApi @Override public final void addTransferListener(TransferListener transferListener) { checkNotNull(transferListener); diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/DataSource.java b/libraries/datasource/src/main/java/androidx/media3/datasource/DataSource.java index e1a34d7883..fc93269055 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/DataSource.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/DataSource.java @@ -26,13 +26,13 @@ import java.util.List; import java.util.Map; /** Reads data from URI-identified resources. */ -@UnstableApi public interface DataSource extends DataReader { /** A factory for {@link DataSource} instances. */ interface Factory { /** Creates a {@link DataSource} instance. */ + @UnstableApi DataSource createDataSource(); } @@ -41,6 +41,7 @@ public interface DataSource extends DataReader { * * @param transferListener A {@link TransferListener}. */ + @UnstableApi void addTransferListener(TransferListener transferListener); /** @@ -72,6 +73,7 @@ public interface DataSource extends DataReader { * unresolved. For all other requests, the value returned will be equal to the request's * {@link DataSpec#length}. */ + @UnstableApi long open(DataSpec dataSpec) throws IOException; /** @@ -82,6 +84,7 @@ public interface DataSource extends DataReader { * * @return The {@link Uri} from which data is being read, or null if the source is not open. */ + @UnstableApi @Nullable Uri getUri(); @@ -91,6 +94,7 @@ public interface DataSource extends DataReader { * *

Key look-up in the returned map is case-insensitive. */ + @UnstableApi default Map> getResponseHeaders() { return Collections.emptyMap(); } @@ -101,5 +105,6 @@ public interface DataSource extends DataReader { * * @throws IOException If an error occurs closing the source. */ + @UnstableApi void close() throws IOException; } diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java b/libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java index 4b6a9f0772..59d8d4a40f 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java @@ -60,7 +60,6 @@ import java.util.zip.GZIPInputStream; * priority) the {@code dataSpec}, {@link #setRequestProperty} and the default properties that can * be passed to {@link HttpDataSource.Factory#setDefaultRequestProperties(Map)}. */ -@UnstableApi public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSource { /** {@link DataSource.Factory} for {@link DefaultHttpDataSource} instances. */ @@ -83,6 +82,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS; } + @UnstableApi @Override public final Factory setDefaultRequestProperties(Map defaultRequestProperties) { this.defaultRequestProperties.clearAndSet(defaultRequestProperties); @@ -99,6 +99,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou * agent of the underlying platform. * @return This factory. */ + @UnstableApi public Factory setUserAgent(@Nullable String userAgent) { this.userAgent = userAgent; return this; @@ -112,6 +113,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou * @param connectTimeoutMs The connect timeout, in milliseconds, that will be used. * @return This factory. */ + @UnstableApi public Factory setConnectTimeoutMs(int connectTimeoutMs) { this.connectTimeoutMs = connectTimeoutMs; return this; @@ -125,6 +127,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou * @param readTimeoutMs The connect timeout, in milliseconds, that will be used. * @return This factory. */ + @UnstableApi public Factory setReadTimeoutMs(int readTimeoutMs) { this.readTimeoutMs = readTimeoutMs; return this; @@ -138,6 +141,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou * @param allowCrossProtocolRedirects Whether to allow cross protocol redirects. * @return This factory. */ + @UnstableApi public Factory setAllowCrossProtocolRedirects(boolean allowCrossProtocolRedirects) { this.allowCrossProtocolRedirects = allowCrossProtocolRedirects; return this; @@ -154,6 +158,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou * predicate that was previously set. * @return This factory. */ + @UnstableApi public Factory setContentTypePredicate(@Nullable Predicate contentTypePredicate) { this.contentTypePredicate = contentTypePredicate; return this; @@ -169,6 +174,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou * @param transferListener The listener that will be used. * @return This factory. */ + @UnstableApi public Factory setTransferListener(@Nullable TransferListener transferListener) { this.transferListener = transferListener; return this; @@ -178,11 +184,13 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou * Sets whether we should keep the POST method and body when we have HTTP 302 redirects for a * POST request. */ + @UnstableApi public Factory setKeepPostFor302Redirects(boolean keepPostFor302Redirects) { this.keepPostFor302Redirects = keepPostFor302Redirects; return this; } + @UnstableApi @Override public DefaultHttpDataSource createDataSource() { DefaultHttpDataSource dataSource = @@ -202,9 +210,9 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou } /** The default connection timeout, in milliseconds. */ - public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8 * 1000; + @UnstableApi public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8 * 1000; /** The default read timeout, in milliseconds. */ - public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8 * 1000; + @UnstableApi public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8 * 1000; private static final String TAG = "DefaultHttpDataSource"; private static final int MAX_REDIRECTS = 20; // Same limit as okhttp. @@ -232,6 +240,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou /** * @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */ + @UnstableApi @SuppressWarnings("deprecation") @Deprecated public DefaultHttpDataSource() { @@ -241,6 +250,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou /** * @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */ + @UnstableApi @SuppressWarnings("deprecation") @Deprecated public DefaultHttpDataSource(@Nullable String userAgent) { @@ -250,6 +260,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou /** * @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */ + @UnstableApi @SuppressWarnings("deprecation") @Deprecated public DefaultHttpDataSource( @@ -265,6 +276,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou /** * @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */ + @UnstableApi @Deprecated public DefaultHttpDataSource( @Nullable String userAgent, @@ -305,22 +317,26 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou * @deprecated Use {@link DefaultHttpDataSource.Factory#setContentTypePredicate(Predicate)} * instead. */ + @UnstableApi @Deprecated public void setContentTypePredicate(@Nullable Predicate contentTypePredicate) { this.contentTypePredicate = contentTypePredicate; } + @UnstableApi @Override @Nullable public Uri getUri() { return connection == null ? null : Uri.parse(connection.getURL().toString()); } + @UnstableApi @Override public int getResponseCode() { return connection == null || responseCode <= 0 ? -1 : responseCode; } + @UnstableApi @Override public Map> getResponseHeaders() { if (connection == null) { @@ -337,6 +353,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou return new NullFilteringHeadersMap(connection.getHeaderFields()); } + @UnstableApi @Override public void setRequestProperty(String name, String value) { checkNotNull(name); @@ -344,18 +361,21 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou requestProperties.set(name, value); } + @UnstableApi @Override public void clearRequestProperty(String name) { checkNotNull(name); requestProperties.remove(name); } + @UnstableApi @Override public void clearAllRequestProperties() { requestProperties.clear(); } /** Opens the source to read the specified data. */ + @UnstableApi @Override public long open(DataSpec dataSpec) throws HttpDataSourceException { this.dataSpec = dataSpec; @@ -474,6 +494,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou return bytesToRead; } + @UnstableApi @Override public int read(byte[] buffer, int offset, int length) throws HttpDataSourceException { try { @@ -484,6 +505,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou } } + @UnstableApi @Override public void close() throws HttpDataSourceException { try { diff --git a/libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java b/libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java index 967a00b49c..ddc9518a8e 100644 --- a/libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java +++ b/libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java @@ -172,6 +172,7 @@ public interface HttpDataSource extends DataSource { } /** A {@link Predicate} that rejects content types often used for pay-walls. */ + @UnstableApi Predicate REJECT_PAYWALL_TYPES = contentType -> { if (contentType == null) { diff --git a/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetDataSource.java b/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetDataSource.java index 4d5988398e..505a65033c 100644 --- a/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetDataSource.java +++ b/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetDataSource.java @@ -68,7 +68,6 @@ import org.chromium.net.UrlResponseInfo; * priority) the {@code dataSpec}, {@link #setRequestProperty} and the default parameters used to * construct the instance. */ -@UnstableApi public class CronetDataSource extends BaseDataSource implements HttpDataSource { static { @@ -132,6 +131,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * CronetEngine}, or {@link DefaultHttpDataSource} for cases where {@link * CronetEngineWrapper#getCronetEngine()} would have returned {@code null}. */ + @UnstableApi @Deprecated public Factory(CronetEngineWrapper cronetEngineWrapper, Executor executor) { this.cronetEngine = cronetEngineWrapper.getCronetEngine(); @@ -142,6 +142,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS; } + @UnstableApi @Override public final Factory setDefaultRequestProperties(Map defaultRequestProperties) { this.defaultRequestProperties.clearAndSet(defaultRequestProperties); @@ -161,6 +162,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * agent of the underlying {@link CronetEngine}. * @return This factory. */ + @UnstableApi public Factory setUserAgent(@Nullable String userAgent) { this.userAgent = userAgent; if (internalFallbackFactory != null) { @@ -179,6 +181,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * UrlRequest.Builder#REQUEST_PRIORITY_*} constants. * @return This factory. */ + @UnstableApi public Factory setRequestPriority(int requestPriority) { this.requestPriority = requestPriority; return this; @@ -192,6 +195,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * @param connectTimeoutMs The connect timeout, in milliseconds, that will be used. * @return This factory. */ + @UnstableApi public Factory setConnectionTimeoutMs(int connectTimeoutMs) { this.connectTimeoutMs = connectTimeoutMs; if (internalFallbackFactory != null) { @@ -208,6 +212,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * @param resetTimeoutOnRedirects Whether the connect timeout is reset when a redirect occurs. * @return This factory. */ + @UnstableApi public Factory setResetTimeoutOnRedirects(boolean resetTimeoutOnRedirects) { this.resetTimeoutOnRedirects = resetTimeoutOnRedirects; return this; @@ -223,6 +228,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * to the redirect url in the "Cookie" header. * @return This factory. */ + @UnstableApi public Factory setHandleSetCookieRequests(boolean handleSetCookieRequests) { this.handleSetCookieRequests = handleSetCookieRequests; return this; @@ -236,6 +242,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * @param readTimeoutMs The connect timeout, in milliseconds, that will be used. * @return This factory. */ + @UnstableApi public Factory setReadTimeoutMs(int readTimeoutMs) { this.readTimeoutMs = readTimeoutMs; if (internalFallbackFactory != null) { @@ -254,6 +261,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * predicate that was previously set. * @return This factory. */ + @UnstableApi public Factory setContentTypePredicate(@Nullable Predicate contentTypePredicate) { this.contentTypePredicate = contentTypePredicate; if (internalFallbackFactory != null) { @@ -266,6 +274,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * Sets whether we should keep the POST method and body when we have HTTP 302 redirects for a * POST request. */ + @UnstableApi public Factory setKeepPostFor302Redirects(boolean keepPostFor302Redirects) { this.keepPostFor302Redirects = keepPostFor302Redirects; if (internalFallbackFactory != null) { @@ -284,6 +293,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * @param transferListener The listener that will be used. * @return This factory. */ + @UnstableApi public Factory setTransferListener(@Nullable TransferListener transferListener) { this.transferListener = transferListener; if (internalFallbackFactory != null) { @@ -303,12 +313,14 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * @deprecated Do not use {@link CronetDataSource} or its factory in cases where a suitable * {@link CronetEngine} is not available. Use the fallback factory directly in such cases. */ + @UnstableApi @Deprecated public Factory setFallbackFactory(@Nullable HttpDataSource.Factory fallbackFactory) { this.fallbackFactory = fallbackFactory; return this; } + @UnstableApi @Override public HttpDataSource createDataSource() { if (cronetEngine == null) { @@ -337,6 +349,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { } /** Thrown when an error is encountered when trying to open a {@link CronetDataSource}. */ + @UnstableApi public static final class OpenException extends HttpDataSourceException { /** @@ -389,9 +402,9 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { } /** The default connection timeout, in milliseconds. */ - public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8 * 1000; + @UnstableApi public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = 8 * 1000; /** The default read timeout, in milliseconds. */ - public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8 * 1000; + @UnstableApi public static final int DEFAULT_READ_TIMEOUT_MILLIS = 8 * 1000; /* package */ final UrlRequest.Callback urlRequestCallback; @@ -436,6 +449,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { private volatile long currentConnectTimeoutMs; + @UnstableApi protected CronetDataSource( CronetEngine cronetEngine, Executor executor, @@ -473,6 +487,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * @param contentTypePredicate The content type {@link Predicate}, or {@code null} to clear a * predicate that was previously set. */ + @UnstableApi @Deprecated public void setContentTypePredicate(@Nullable Predicate contentTypePredicate) { this.contentTypePredicate = contentTypePredicate; @@ -480,21 +495,25 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { // HttpDataSource implementation. + @UnstableApi @Override public void setRequestProperty(String name, String value) { requestProperties.set(name, value); } + @UnstableApi @Override public void clearRequestProperty(String name) { requestProperties.remove(name); } + @UnstableApi @Override public void clearAllRequestProperties() { requestProperties.clear(); } + @UnstableApi @Override public int getResponseCode() { return responseInfo == null || responseInfo.getHttpStatusCode() <= 0 @@ -502,17 +521,20 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { : responseInfo.getHttpStatusCode(); } + @UnstableApi @Override public Map> getResponseHeaders() { return responseInfo == null ? Collections.emptyMap() : responseInfo.getAllHeaders(); } + @UnstableApi @Override @Nullable public Uri getUri() { return responseInfo == null ? null : Uri.parse(responseInfo.getUrl()); } + @UnstableApi @Override public long open(DataSpec dataSpec) throws HttpDataSourceException { Assertions.checkNotNull(dataSpec); @@ -644,6 +666,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { return bytesRemaining; } + @UnstableApi @Override public int read(byte[] buffer, int offset, int length) throws HttpDataSourceException { Assertions.checkState(opened); @@ -715,6 +738,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { * @throws HttpDataSourceException If an error occurs reading from the source. * @throws IllegalArgumentException If {@code buffer} is not a direct ByteBuffer. */ + @UnstableApi public int read(ByteBuffer buffer) throws HttpDataSourceException { Assertions.checkState(opened); @@ -759,6 +783,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { return bytesRead; } + @UnstableApi @Override public synchronized void close() { if (currentUrlRequest != null) { @@ -779,17 +804,20 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { } /** Returns current {@link UrlRequest}. May be null if the data source is not opened. */ + @UnstableApi @Nullable protected UrlRequest getCurrentUrlRequest() { return currentUrlRequest; } /** Returns current {@link UrlResponseInfo}. May be null if the data source is not opened. */ + @UnstableApi @Nullable protected UrlResponseInfo getCurrentUrlResponseInfo() { return responseInfo; } + @UnstableApi protected UrlRequest.Builder buildRequestBuilder(DataSpec dataSpec) throws IOException { UrlRequest.Builder requestBuilder = cronetEngine diff --git a/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetUtil.java b/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetUtil.java index 6afce324f9..03951c0255 100644 --- a/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetUtil.java +++ b/libraries/datasource_cronet/src/main/java/androidx/media3/datasource/cronet/CronetUtil.java @@ -31,7 +31,6 @@ import org.chromium.net.CronetEngine; import org.chromium.net.CronetProvider; /** Cronet utility methods. */ -@UnstableApi public final class CronetUtil { private static final String TAG = "CronetUtil"; @@ -77,6 +76,7 @@ public final class CronetUtil { * over Cronet Embedded, if both are available. * @return The {@link CronetEngine}, or {@code null} if no suitable engine could be built. */ + @UnstableApi @Nullable public static CronetEngine buildCronetEngine( Context context, @Nullable String userAgent, boolean preferGooglePlayServices) { diff --git a/libraries/datasource_okhttp/src/main/java/androidx/media3/datasource/okhttp/OkHttpDataSource.java b/libraries/datasource_okhttp/src/main/java/androidx/media3/datasource/okhttp/OkHttpDataSource.java index 889c5f6d6a..42ed422550 100644 --- a/libraries/datasource_okhttp/src/main/java/androidx/media3/datasource/okhttp/OkHttpDataSource.java +++ b/libraries/datasource_okhttp/src/main/java/androidx/media3/datasource/okhttp/OkHttpDataSource.java @@ -60,7 +60,6 @@ import okhttp3.ResponseBody; * priority) the {@code dataSpec}, {@link #setRequestProperty} and the default parameters used to * construct the instance. */ -@UnstableApi public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { static { @@ -89,6 +88,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { defaultRequestProperties = new RequestProperties(); } + @UnstableApi @Override public final Factory setDefaultRequestProperties(Map defaultRequestProperties) { this.defaultRequestProperties.clearAndSet(defaultRequestProperties); @@ -105,6 +105,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { * agent of the underlying {@link OkHttpClient}. * @return This factory. */ + @UnstableApi public Factory setUserAgent(@Nullable String userAgent) { this.userAgent = userAgent; return this; @@ -118,6 +119,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { * @param cacheControl The cache control that will be used. * @return This factory. */ + @UnstableApi public Factory setCacheControl(@Nullable CacheControl cacheControl) { this.cacheControl = cacheControl; return this; @@ -134,6 +136,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { * predicate that was previously set. * @return This factory. */ + @UnstableApi public Factory setContentTypePredicate(@Nullable Predicate contentTypePredicate) { this.contentTypePredicate = contentTypePredicate; return this; @@ -149,11 +152,13 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { * @param transferListener The listener that will be used. * @return This factory. */ + @UnstableApi public Factory setTransferListener(@Nullable TransferListener transferListener) { this.transferListener = transferListener; return this; } + @UnstableApi @Override public OkHttpDataSource createDataSource() { OkHttpDataSource dataSource = @@ -185,6 +190,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { * @deprecated Use {@link OkHttpDataSource.Factory} instead. */ @SuppressWarnings("deprecation") + @UnstableApi @Deprecated public OkHttpDataSource(Call.Factory callFactory) { this(callFactory, /* userAgent= */ null); @@ -194,6 +200,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { * @deprecated Use {@link OkHttpDataSource.Factory} instead. */ @SuppressWarnings("deprecation") + @UnstableApi @Deprecated public OkHttpDataSource(Call.Factory callFactory, @Nullable String userAgent) { this(callFactory, userAgent, /* cacheControl= */ null, /* defaultRequestProperties= */ null); @@ -202,6 +209,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { /** * @deprecated Use {@link OkHttpDataSource.Factory} instead. */ + @UnstableApi @Deprecated public OkHttpDataSource( Call.Factory callFactory, @@ -234,27 +242,32 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { /** * @deprecated Use {@link OkHttpDataSource.Factory#setContentTypePredicate(Predicate)} instead. */ + @UnstableApi @Deprecated public void setContentTypePredicate(@Nullable Predicate contentTypePredicate) { this.contentTypePredicate = contentTypePredicate; } + @UnstableApi @Override @Nullable public Uri getUri() { return response == null ? null : Uri.parse(response.request().url().toString()); } + @UnstableApi @Override public int getResponseCode() { return response == null ? -1 : response.code(); } + @UnstableApi @Override public Map> getResponseHeaders() { return response == null ? Collections.emptyMap() : response.headers().toMultimap(); } + @UnstableApi @Override public void setRequestProperty(String name, String value) { Assertions.checkNotNull(name); @@ -262,17 +275,20 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { requestProperties.set(name, value); } + @UnstableApi @Override public void clearRequestProperty(String name) { Assertions.checkNotNull(name); requestProperties.remove(name); } + @UnstableApi @Override public void clearAllRequestProperties() { requestProperties.clear(); } + @UnstableApi @Override public long open(DataSpec dataSpec) throws HttpDataSourceException { this.dataSpec = dataSpec; @@ -358,6 +374,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { return bytesToRead; } + @UnstableApi @Override public int read(byte[] buffer, int offset, int length) throws HttpDataSourceException { try { @@ -368,6 +385,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { } } + @UnstableApi @Override public void close() { if (opened) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java index c64201c8b8..c667c4e7a9 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java @@ -147,7 +147,6 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { * @param dataSourceFactory A {@link DataSource.Factory} to create {@link DataSource} instances * for requesting media data. */ - @UnstableApi public DefaultMediaSourceFactory(DataSource.Factory dataSourceFactory) { this(dataSourceFactory, new DefaultExtractorsFactory()); }