summaryrefslogtreecommitdiffstats
path: root/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/offline/DownloaderConstructorHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/offline/DownloaderConstructorHelper.java')
-rw-r--r--mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/offline/DownloaderConstructorHelper.java170
1 files changed, 170 insertions, 0 deletions
diff --git a/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/offline/DownloaderConstructorHelper.java b/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/offline/DownloaderConstructorHelper.java
new file mode 100644
index 0000000000..5b2f579868
--- /dev/null
+++ b/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/offline/DownloaderConstructorHelper.java
@@ -0,0 +1,170 @@
+/*
+ * 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 org.mozilla.thirdparty.com.google.android.exoplayer2.offline;
+
+import androidx.annotation.Nullable;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.C;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.DataSink;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.DataSource;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.DummyDataSource;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.FileDataSource;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.PriorityDataSourceFactory;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.cache.Cache;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.cache.CacheDataSink;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.cache.CacheDataSinkFactory;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.cache.CacheDataSource;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.cache.CacheKeyFactory;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.cache.CacheUtil;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.util.PriorityTaskManager;
+
+/** A helper class that holds necessary parameters for {@link Downloader} construction. */
+public final class DownloaderConstructorHelper {
+
+ private final Cache cache;
+ @Nullable private final CacheKeyFactory cacheKeyFactory;
+ @Nullable private final PriorityTaskManager priorityTaskManager;
+ private final CacheDataSourceFactory onlineCacheDataSourceFactory;
+ private final CacheDataSourceFactory offlineCacheDataSourceFactory;
+
+ /**
+ * @param cache Cache instance to be used to store downloaded data.
+ * @param upstreamFactory A {@link DataSource.Factory} for creating {@link DataSource}s for
+ * downloading data.
+ */
+ public DownloaderConstructorHelper(Cache cache, DataSource.Factory upstreamFactory) {
+ this(
+ cache,
+ upstreamFactory,
+ /* cacheReadDataSourceFactory= */ null,
+ /* cacheWriteDataSinkFactory= */ null,
+ /* priorityTaskManager= */ null);
+ }
+
+ /**
+ * @param cache Cache instance to be used to store downloaded data.
+ * @param upstreamFactory A {@link DataSource.Factory} for creating {@link DataSource}s for
+ * downloading data.
+ * @param cacheReadDataSourceFactory A {@link DataSource.Factory} for creating {@link DataSource}s
+ * for reading data from the cache. If null then a {@link FileDataSource.Factory} will be
+ * used.
+ * @param cacheWriteDataSinkFactory A {@link DataSink.Factory} for creating {@link DataSource}s
+ * for writing data to the cache. If null then a {@link CacheDataSinkFactory} will be used.
+ * @param priorityTaskManager A {@link PriorityTaskManager} to use when downloading. If non-null,
+ * downloaders will register as tasks with priority {@link C#PRIORITY_DOWNLOAD} whilst
+ * downloading.
+ */
+ public DownloaderConstructorHelper(
+ Cache cache,
+ DataSource.Factory upstreamFactory,
+ @Nullable DataSource.Factory cacheReadDataSourceFactory,
+ @Nullable DataSink.Factory cacheWriteDataSinkFactory,
+ @Nullable PriorityTaskManager priorityTaskManager) {
+ this(
+ cache,
+ upstreamFactory,
+ cacheReadDataSourceFactory,
+ cacheWriteDataSinkFactory,
+ priorityTaskManager,
+ /* cacheKeyFactory= */ null);
+ }
+
+ /**
+ * @param cache Cache instance to be used to store downloaded data.
+ * @param upstreamFactory A {@link DataSource.Factory} for creating {@link DataSource}s for
+ * downloading data.
+ * @param cacheReadDataSourceFactory A {@link DataSource.Factory} for creating {@link DataSource}s
+ * for reading data from the cache. If null then a {@link FileDataSource.Factory} will be
+ * used.
+ * @param cacheWriteDataSinkFactory A {@link DataSink.Factory} for creating {@link DataSource}s
+ * for writing data to the cache. If null then a {@link CacheDataSinkFactory} will be used.
+ * @param priorityTaskManager A {@link PriorityTaskManager} to use when downloading. If non-null,
+ * downloaders will register as tasks with priority {@link C#PRIORITY_DOWNLOAD} whilst
+ * downloading.
+ * @param cacheKeyFactory An optional factory for cache keys.
+ */
+ public DownloaderConstructorHelper(
+ Cache cache,
+ DataSource.Factory upstreamFactory,
+ @Nullable DataSource.Factory cacheReadDataSourceFactory,
+ @Nullable DataSink.Factory cacheWriteDataSinkFactory,
+ @Nullable PriorityTaskManager priorityTaskManager,
+ @Nullable CacheKeyFactory cacheKeyFactory) {
+ if (priorityTaskManager != null) {
+ upstreamFactory =
+ new PriorityDataSourceFactory(upstreamFactory, priorityTaskManager, C.PRIORITY_DOWNLOAD);
+ }
+ DataSource.Factory readDataSourceFactory =
+ cacheReadDataSourceFactory != null
+ ? cacheReadDataSourceFactory
+ : new FileDataSource.Factory();
+ if (cacheWriteDataSinkFactory == null) {
+ cacheWriteDataSinkFactory =
+ new CacheDataSinkFactory(cache, CacheDataSink.DEFAULT_FRAGMENT_SIZE);
+ }
+ onlineCacheDataSourceFactory =
+ new CacheDataSourceFactory(
+ cache,
+ upstreamFactory,
+ readDataSourceFactory,
+ cacheWriteDataSinkFactory,
+ CacheDataSource.FLAG_BLOCK_ON_CACHE,
+ /* eventListener= */ null,
+ cacheKeyFactory);
+ offlineCacheDataSourceFactory =
+ new CacheDataSourceFactory(
+ cache,
+ DummyDataSource.FACTORY,
+ readDataSourceFactory,
+ null,
+ CacheDataSource.FLAG_BLOCK_ON_CACHE,
+ /* eventListener= */ null,
+ cacheKeyFactory);
+ this.cache = cache;
+ this.priorityTaskManager = priorityTaskManager;
+ this.cacheKeyFactory = cacheKeyFactory;
+ }
+
+ /** Returns the {@link Cache} instance. */
+ public Cache getCache() {
+ return cache;
+ }
+
+ /** Returns the {@link CacheKeyFactory}. */
+ public CacheKeyFactory getCacheKeyFactory() {
+ return cacheKeyFactory != null ? cacheKeyFactory : CacheUtil.DEFAULT_CACHE_KEY_FACTORY;
+ }
+
+ /** Returns a {@link PriorityTaskManager} instance. */
+ public PriorityTaskManager getPriorityTaskManager() {
+ // Return a dummy PriorityTaskManager if none is provided. Create a new PriorityTaskManager
+ // each time so clients don't affect each other over the dummy PriorityTaskManager instance.
+ return priorityTaskManager != null ? priorityTaskManager : new PriorityTaskManager();
+ }
+
+ /** Returns a new {@link CacheDataSource} instance. */
+ public CacheDataSource createCacheDataSource() {
+ return onlineCacheDataSourceFactory.createDataSource();
+ }
+
+ /**
+ * Returns a new {@link CacheDataSource} instance which accesses cache read-only and throws an
+ * exception on cache miss.
+ */
+ public CacheDataSource createOfflineCacheDataSource() {
+ return offlineCacheDataSourceFactory.createDataSource();
+ }
+}