From 94ffbb2b6ac2f210b6fd59086cb42364476c7aad Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 2 May 2017 02:34:59 -0700 Subject: [PATCH] Support for Cronet from GMSCore (Blaze only) The blaze BUILD file for the Cronet extension now has three options: Using native bundled Cronet libs, using GMSCore, or using whichever is newer. The GMSCore version is preselected (as it is the smallest), but other variants may be used by uncommenting the respective lines. The API is the same for all cases and the CronetEngine.Builder automatically selects the newest option or falls back to default http. To avoid that apps using this extension need to add a dependency to Cronet themselves, I added a CronetEngineFactory to the Exoplayer extension. Gradle builds can't be supported (as far as I can see), as the GMSCore Cronet version is first party only. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=154812029 --- extensions/cronet/src/main/gcore_versions.bzl | 5 +++ .../ext/cronet/CronetDataSourceFactory.java | 17 +++---- .../ext/cronet/CronetEngineFactory.java | 45 +++++++++++++++++++ 3 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 extensions/cronet/src/main/gcore_versions.bzl create mode 100644 extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetEngineFactory.java diff --git a/extensions/cronet/src/main/gcore_versions.bzl b/extensions/cronet/src/main/gcore_versions.bzl new file mode 100644 index 0000000000..7f9f9c3863 --- /dev/null +++ b/extensions/cronet/src/main/gcore_versions.bzl @@ -0,0 +1,5 @@ +"""GCore versions supporting Cronet.""" +GCORE_VERSIONS = [ + "v10", +] + diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceFactory.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceFactory.java index 2ad6da6a54..1af76c11a7 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceFactory.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceFactory.java @@ -22,7 +22,6 @@ import com.google.android.exoplayer2.upstream.HttpDataSource.Factory; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Predicate; import java.util.concurrent.Executor; -import org.chromium.net.CronetEngine; /** * A {@link Factory} that produces {@link CronetDataSource}. @@ -34,13 +33,14 @@ public final class CronetDataSourceFactory extends BaseFactory { */ public static final int DEFAULT_CONNECT_TIMEOUT_MILLIS = CronetDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS; + /** * The default read timeout, in milliseconds. */ public static final int DEFAULT_READ_TIMEOUT_MILLIS = CronetDataSource.DEFAULT_READ_TIMEOUT_MILLIS; - private final CronetEngine cronetEngine; + private final CronetEngineFactory cronetEngineFactory; private final Executor executor; private final Predicate contentTypePredicate; private final TransferListener transferListener; @@ -48,18 +48,18 @@ public final class CronetDataSourceFactory extends BaseFactory { private final int readTimeoutMs; private final boolean resetTimeoutOnRedirects; - public CronetDataSourceFactory(CronetEngine cronetEngine, + public CronetDataSourceFactory(CronetEngineFactory cronetEngineFactory, Executor executor, Predicate contentTypePredicate, TransferListener transferListener) { - this(cronetEngine, executor, contentTypePredicate, transferListener, + this(cronetEngineFactory, executor, contentTypePredicate, transferListener, DEFAULT_CONNECT_TIMEOUT_MILLIS, DEFAULT_READ_TIMEOUT_MILLIS, false); } - public CronetDataSourceFactory(CronetEngine cronetEngine, + public CronetDataSourceFactory(CronetEngineFactory cronetEngineFactory, Executor executor, Predicate contentTypePredicate, TransferListener transferListener, int connectTimeoutMs, int readTimeoutMs, boolean resetTimeoutOnRedirects) { - this.cronetEngine = cronetEngine; + this.cronetEngineFactory = cronetEngineFactory; this.executor = executor; this.contentTypePredicate = contentTypePredicate; this.transferListener = transferListener; @@ -71,8 +71,9 @@ public final class CronetDataSourceFactory extends BaseFactory { @Override protected CronetDataSource createDataSourceInternal(HttpDataSource.RequestProperties defaultRequestProperties) { - return new CronetDataSource(cronetEngine, executor, contentTypePredicate, transferListener, - connectTimeoutMs, readTimeoutMs, resetTimeoutOnRedirects, defaultRequestProperties); + return new CronetDataSource(cronetEngineFactory.createCronetEngine(), executor, + contentTypePredicate, transferListener, connectTimeoutMs, readTimeoutMs, + resetTimeoutOnRedirects, defaultRequestProperties); } } diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetEngineFactory.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetEngineFactory.java new file mode 100644 index 0000000000..0bd74256e4 --- /dev/null +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetEngineFactory.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.ext.cronet; + +import android.content.Context; +import org.chromium.net.CronetEngine; + +/** + * A factory class which creates or reuses a {@link CronetEngine}. + */ +public final class CronetEngineFactory { + + private final Context context; + + private CronetEngine cronetEngine = null; + + /** + * Creates the factory for a {@link CronetEngine}. + * @param context The application context. + */ + public CronetEngineFactory(Context context) { + this.context = context; + } + + /* package */ CronetEngine createCronetEngine() { + if (cronetEngine == null) { + cronetEngine = new CronetEngine.Builder(context).build(); + } + return cronetEngine; + } + +}