Cronet: Deprecate internal fallback

The way CronetDataSource.Factory can internally fall back to another
factory is confusing and unnecessary. In the case the application cannot
instantiate a CronetEngine, it should directly use another factory.

This makes CronetDataSource more consistent with OkHttpDataSource. In
both cases, their factory constructors take the component that the
respective libraries advise should only be created once by the application,
which are CronetEngine and OkHttpClient respectively.

CronetEngineWrapper will be deprecated in a subsequent change.

PiperOrigin-RevId: 381016504
This commit is contained in:
olly 2021-06-23 14:21:06 +01:00 committed by Oliver Woodman
parent 2d44f82aa4
commit 116e50f365

View File

@ -74,11 +74,14 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
/** {@link DataSource.Factory} for {@link CronetDataSource} instances. */
public static final class Factory implements HttpDataSource.Factory {
private final CronetEngineWrapper cronetEngineWrapper;
// TODO: Remove @Nullable annotation when CronetEngineWrapper is deleted.
@Nullable private final CronetEngine cronetEngine;
private final Executor executor;
private final RequestProperties defaultRequestProperties;
private final DefaultHttpDataSource.Factory internalFallbackFactory;
// TODO: Remove when CronetEngineWrapper is deleted.
@Nullable private final DefaultHttpDataSource.Factory internalFallbackFactory;
// TODO: Remove when CronetEngineWrapper is deleted.
@Nullable private HttpDataSource.Factory fallbackFactory;
@Nullable private Predicate<String> contentTypePredicate;
@Nullable private TransferListener transferListener;
@ -91,15 +94,38 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
/**
* Creates an instance.
*
* @param cronetEngineWrapper A {@link CronetEngineWrapper}.
* @param cronetEngine A {@link CronetEngine} to make the requests.
* @param executor The {@link java.util.concurrent.Executor} that will handle responses. This
* may be a direct executor (i.e. executes tasks on the calling thread) in order to avoid a
* thread hop from Cronet's internal network thread to the response handling thread.
* However, to avoid slowing down overall network performance, care must be taken to make
* sure response handling is a fast operation when using a direct executor.
*/
public Factory(CronetEngine cronetEngine, Executor executor) {
this.cronetEngine = Assertions.checkNotNull(cronetEngine);
this.executor = executor;
defaultRequestProperties = new RequestProperties();
internalFallbackFactory = null;
connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MILLIS;
readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS;
}
/**
* Creates an instance.
*
* @param cronetEngineWrapper A {@link CronetEngineWrapper}.
* @param executor The {@link java.util.concurrent.Executor} that will handle responses. This
* may be a direct executor (i.e. executes tasks on the calling thread) in order to avoid a
* thread hop from Cronet's internal network thread to the response handling thread.
* However, to avoid slowing down overall network performance, care must be taken to make
* sure response handling is a fast operation when using a direct executor.
* @deprecated Use {@link #Factory(CronetEngine, Executor)} with an instantiated {@link
* CronetEngine}, or {@link DefaultHttpDataSource} for cases where {@link
* CronetEngineWrapper#getCronetEngine()} would have returned {@code null}.
*/
@Deprecated
public Factory(CronetEngineWrapper cronetEngineWrapper, Executor executor) {
this.cronetEngineWrapper = cronetEngineWrapper;
this.cronetEngine = cronetEngineWrapper.getCronetEngine();
this.executor = executor;
defaultRequestProperties = new RequestProperties();
internalFallbackFactory = new DefaultHttpDataSource.Factory();
@ -117,7 +143,9 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
@Override
public final Factory setDefaultRequestProperties(Map<String, String> defaultRequestProperties) {
this.defaultRequestProperties.clearAndSet(defaultRequestProperties);
if (internalFallbackFactory != null) {
internalFallbackFactory.setDefaultRequestProperties(defaultRequestProperties);
}
return this;
}
@ -133,7 +161,9 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
*/
public Factory setUserAgent(@Nullable String userAgent) {
this.userAgent = userAgent;
if (internalFallbackFactory != null) {
internalFallbackFactory.setUserAgent(userAgent);
}
return this;
}
@ -147,7 +177,9 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
*/
public Factory setConnectionTimeoutMs(int connectTimeoutMs) {
this.connectTimeoutMs = connectTimeoutMs;
if (internalFallbackFactory != null) {
internalFallbackFactory.setConnectTimeoutMs(connectTimeoutMs);
}
return this;
}
@ -189,7 +221,9 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
*/
public Factory setReadTimeoutMs(int readTimeoutMs) {
this.readTimeoutMs = readTimeoutMs;
if (internalFallbackFactory != null) {
internalFallbackFactory.setReadTimeoutMs(readTimeoutMs);
}
return this;
}
@ -205,7 +239,9 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
*/
public Factory setContentTypePredicate(@Nullable Predicate<String> contentTypePredicate) {
this.contentTypePredicate = contentTypePredicate;
if (internalFallbackFactory != null) {
internalFallbackFactory.setContentTypePredicate(contentTypePredicate);
}
return this;
}
@ -221,7 +257,9 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
*/
public Factory setTransferListener(@Nullable TransferListener transferListener) {
this.transferListener = transferListener;
if (internalFallbackFactory != null) {
internalFallbackFactory.setTransferListener(transferListener);
}
return this;
}
@ -233,7 +271,10 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
*
* @param fallbackFactory The fallback factory that will be used.
* @return This factory.
* @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.
*/
@Deprecated
public Factory setFallbackFactory(@Nullable HttpDataSource.Factory fallbackFactory) {
this.fallbackFactory = fallbackFactory;
return this;
@ -241,11 +282,10 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
@Override
public HttpDataSource createDataSource() {
@Nullable CronetEngine cronetEngine = cronetEngineWrapper.getCronetEngine();
if (cronetEngine == null) {
return (fallbackFactory != null)
? fallbackFactory.createDataSource()
: internalFallbackFactory.createDataSource();
: Assertions.checkNotNull(internalFallbackFactory).createDataSource();
}
CronetDataSource dataSource =
new CronetDataSource(