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:
* Switch to OkHttp 4.9.1. This increases the extension's minimum SDK
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)

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.util.Util.castNonNull;
import static org.chromium.net.UrlRequest.Builder.REQUEST_PRIORITY_MEDIUM;
import android.net.Uri;
import android.text.TextUtils;
@ -86,6 +87,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
@Nullable private Predicate<String> contentTypePredicate;
@Nullable private TransferListener transferListener;
@Nullable private String userAgent;
private int requestPriority;
private int connectTimeoutMs;
private int readTimeoutMs;
private boolean resetTimeoutOnRedirects;
@ -109,6 +111,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
this.executor = executor;
defaultRequestProperties = new RequestProperties();
internalFallbackFactory = null;
requestPriority = REQUEST_PRIORITY_MEDIUM;
connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MILLIS;
readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS;
}
@ -170,6 +173,21 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
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.
*
@ -306,6 +324,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
new CronetDataSource(
cronetEngine,
executor,
requestPriority,
connectTimeoutMs,
readTimeoutMs,
resetTimeoutOnRedirects,
@ -353,6 +372,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
private final CronetEngine cronetEngine;
private final Executor executor;
private final int requestPriority;
private final int connectTimeoutMs;
private final int readTimeoutMs;
private final boolean resetTimeoutOnRedirects;
@ -413,6 +433,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
this(
cronetEngine,
executor,
REQUEST_PRIORITY_MEDIUM,
connectTimeoutMs,
readTimeoutMs,
resetTimeoutOnRedirects,
@ -436,6 +457,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
this(
cronetEngine,
executor,
REQUEST_PRIORITY_MEDIUM,
connectTimeoutMs,
readTimeoutMs,
resetTimeoutOnRedirects,
@ -499,6 +521,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
this(
cronetEngine,
executor,
REQUEST_PRIORITY_MEDIUM,
connectTimeoutMs,
readTimeoutMs,
resetTimeoutOnRedirects,
@ -512,6 +535,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
protected CronetDataSource(
CronetEngine cronetEngine,
Executor executor,
int requestPriority,
int connectTimeoutMs,
int readTimeoutMs,
boolean resetTimeoutOnRedirects,
@ -523,6 +547,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
super(/* isNetwork= */ true);
this.cronetEngine = Assertions.checkNotNull(cronetEngine);
this.executor = Assertions.checkNotNull(executor);
this.requestPriority = requestPriority;
this.connectTimeoutMs = connectTimeoutMs;
this.readTimeoutMs = readTimeoutMs;
this.resetTimeoutOnRedirects = resetTimeoutOnRedirects;
@ -860,6 +885,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
UrlRequest.Builder requestBuilder =
cronetEngine
.newUrlRequestBuilder(dataSpec.uri.toString(), urlRequestCallback, executor)
.setPriority(requestPriority)
.allowDirectExecutor();
// 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.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
@ -128,6 +129,7 @@ public final class CronetDataSourceTest {
when(mockCronetEngine.newUrlRequestBuilder(
anyString(), any(UrlRequest.Callback.class), any(Executor.class)))
.thenReturn(mockUrlRequestBuilder);
when(mockUrlRequestBuilder.setPriority(anyInt())).thenReturn(mockUrlRequestBuilder);
when(mockUrlRequestBuilder.allowDirectExecutor()).thenReturn(mockUrlRequestBuilder);
when(mockUrlRequestBuilder.build()).thenReturn(mockUrlRequest);
mockStatusResponse();