Add ability to set Cronet request priority

PiperOrigin-RevId: 381833403
This commit is contained in:
olly 2021-06-28 12:22:13 +01:00 committed by Oliver Woodman
parent 8588bdb02a
commit ea99c3fa94
3 changed files with 31 additions and 0 deletions

View File

@ -112,6 +112,9 @@
* OkHttp extension: * OkHttp extension:
* Switch to OkHttp 4.9.1. This increases the extension's minimum SDK * Switch to OkHttp 4.9.1. This increases the extension's minimum SDK
version requirement from 16 to 21. version requirement from 16 to 21.
* Cronet extension:
* Add `CronetDataSource.Factory.setRequestPriority` to allow setting the
priority of requests made by `CronetDataSource` instances.
### 2.14.1 (2021-06-11) ### 2.14.1 (2021-06-11)

View File

@ -17,6 +17,7 @@ package com.google.android.exoplayer2.ext.cronet;
import static com.google.android.exoplayer2.upstream.HttpUtil.buildRangeRequestHeader; import static com.google.android.exoplayer2.upstream.HttpUtil.buildRangeRequestHeader;
import static com.google.android.exoplayer2.util.Util.castNonNull; import static com.google.android.exoplayer2.util.Util.castNonNull;
import static org.chromium.net.UrlRequest.Builder.REQUEST_PRIORITY_MEDIUM;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
@ -86,6 +87,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
@Nullable private Predicate<String> contentTypePredicate; @Nullable private Predicate<String> contentTypePredicate;
@Nullable private TransferListener transferListener; @Nullable private TransferListener transferListener;
@Nullable private String userAgent; @Nullable private String userAgent;
private int requestPriority;
private int connectTimeoutMs; private int connectTimeoutMs;
private int readTimeoutMs; private int readTimeoutMs;
private boolean resetTimeoutOnRedirects; private boolean resetTimeoutOnRedirects;
@ -109,6 +111,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
this.executor = executor; this.executor = executor;
defaultRequestProperties = new RequestProperties(); defaultRequestProperties = new RequestProperties();
internalFallbackFactory = null; internalFallbackFactory = null;
requestPriority = REQUEST_PRIORITY_MEDIUM;
connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MILLIS; connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MILLIS;
readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS; readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS;
} }
@ -170,6 +173,21 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
return this; return this;
} }
/**
* Sets the priority of requests made by {@link CronetDataSource} instances created by this
* factory.
*
* <p>The default is {@link UrlRequest.Builder#REQUEST_PRIORITY_MEDIUM}.
*
* @param requestPriority The request priority, which should be one of Cronet's {@code
* UrlRequest.Builder#REQUEST_PRIORITY_*} constants.
* @return This factory.
*/
public Factory setRequestPriority(int requestPriority) {
this.requestPriority = requestPriority;
return this;
}
/** /**
* Sets the connect timeout, in milliseconds. * Sets the connect timeout, in milliseconds.
* *
@ -306,6 +324,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
new CronetDataSource( new CronetDataSource(
cronetEngine, cronetEngine,
executor, executor,
requestPriority,
connectTimeoutMs, connectTimeoutMs,
readTimeoutMs, readTimeoutMs,
resetTimeoutOnRedirects, resetTimeoutOnRedirects,
@ -353,6 +372,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
private final CronetEngine cronetEngine; private final CronetEngine cronetEngine;
private final Executor executor; private final Executor executor;
private final int requestPriority;
private final int connectTimeoutMs; private final int connectTimeoutMs;
private final int readTimeoutMs; private final int readTimeoutMs;
private final boolean resetTimeoutOnRedirects; private final boolean resetTimeoutOnRedirects;
@ -413,6 +433,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
this( this(
cronetEngine, cronetEngine,
executor, executor,
REQUEST_PRIORITY_MEDIUM,
connectTimeoutMs, connectTimeoutMs,
readTimeoutMs, readTimeoutMs,
resetTimeoutOnRedirects, resetTimeoutOnRedirects,
@ -436,6 +457,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
this( this(
cronetEngine, cronetEngine,
executor, executor,
REQUEST_PRIORITY_MEDIUM,
connectTimeoutMs, connectTimeoutMs,
readTimeoutMs, readTimeoutMs,
resetTimeoutOnRedirects, resetTimeoutOnRedirects,
@ -499,6 +521,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
this( this(
cronetEngine, cronetEngine,
executor, executor,
REQUEST_PRIORITY_MEDIUM,
connectTimeoutMs, connectTimeoutMs,
readTimeoutMs, readTimeoutMs,
resetTimeoutOnRedirects, resetTimeoutOnRedirects,
@ -512,6 +535,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
protected CronetDataSource( protected CronetDataSource(
CronetEngine cronetEngine, CronetEngine cronetEngine,
Executor executor, Executor executor,
int requestPriority,
int connectTimeoutMs, int connectTimeoutMs,
int readTimeoutMs, int readTimeoutMs,
boolean resetTimeoutOnRedirects, boolean resetTimeoutOnRedirects,
@ -523,6 +547,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
super(/* isNetwork= */ true); super(/* isNetwork= */ true);
this.cronetEngine = Assertions.checkNotNull(cronetEngine); this.cronetEngine = Assertions.checkNotNull(cronetEngine);
this.executor = Assertions.checkNotNull(executor); this.executor = Assertions.checkNotNull(executor);
this.requestPriority = requestPriority;
this.connectTimeoutMs = connectTimeoutMs; this.connectTimeoutMs = connectTimeoutMs;
this.readTimeoutMs = readTimeoutMs; this.readTimeoutMs = readTimeoutMs;
this.resetTimeoutOnRedirects = resetTimeoutOnRedirects; this.resetTimeoutOnRedirects = resetTimeoutOnRedirects;
@ -860,6 +885,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
UrlRequest.Builder requestBuilder = UrlRequest.Builder requestBuilder =
cronetEngine cronetEngine
.newUrlRequestBuilder(dataSpec.uri.toString(), urlRequestCallback, executor) .newUrlRequestBuilder(dataSpec.uri.toString(), urlRequestCallback, executor)
.setPriority(requestPriority)
.allowDirectExecutor(); .allowDirectExecutor();
// Set the headers. // Set the headers.

View File

@ -21,6 +21,7 @@ import static java.util.concurrent.TimeUnit.SECONDS;
import static org.chromium.net.NetworkException.ERROR_HOSTNAME_NOT_RESOLVED; import static org.chromium.net.NetworkException.ERROR_HOSTNAME_NOT_RESOLVED;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
@ -128,6 +129,7 @@ public final class CronetDataSourceTest {
when(mockCronetEngine.newUrlRequestBuilder( when(mockCronetEngine.newUrlRequestBuilder(
anyString(), any(UrlRequest.Callback.class), any(Executor.class))) anyString(), any(UrlRequest.Callback.class), any(Executor.class)))
.thenReturn(mockUrlRequestBuilder); .thenReturn(mockUrlRequestBuilder);
when(mockUrlRequestBuilder.setPriority(anyInt())).thenReturn(mockUrlRequestBuilder);
when(mockUrlRequestBuilder.allowDirectExecutor()).thenReturn(mockUrlRequestBuilder); when(mockUrlRequestBuilder.allowDirectExecutor()).thenReturn(mockUrlRequestBuilder);
when(mockUrlRequestBuilder.build()).thenReturn(mockUrlRequest); when(mockUrlRequestBuilder.build()).thenReturn(mockUrlRequest);
mockStatusResponse(); mockStatusResponse();