From ea99c3fa94cac21085b582339db18d3a3dfa7947 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 28 Jun 2021 12:22:13 +0100 Subject: [PATCH] Add ability to set Cronet request priority PiperOrigin-RevId: 381833403 --- RELEASENOTES.md | 3 +++ .../ext/cronet/CronetDataSource.java | 26 +++++++++++++++++++ .../ext/cronet/CronetDataSourceTest.java | 2 ++ 3 files changed, 31 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 3fec448ca5..5bd2262baf 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -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) diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java index 47b3e1af73..1f21c75211 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java @@ -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 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. + * + *

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. diff --git a/extensions/cronet/src/test/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceTest.java b/extensions/cronet/src/test/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceTest.java index de54242b8a..e510776860 100644 --- a/extensions/cronet/src/test/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceTest.java +++ b/extensions/cronet/src/test/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceTest.java @@ -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();