diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java index c90aba7b7e2..3886ef5c44e 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java @@ -75,13 +75,13 @@ protected void onDownloadChanged(Download download) { notificationHelper.buildDownloadCompletedNotification( R.drawable.ic_download_done, /* contentIntent= */ null, - Util.fromUtf8Bytes(download.action.data)); + Util.fromUtf8Bytes(download.request.data)); } else if (download.state == Download.STATE_FAILED) { notification = notificationHelper.buildDownloadFailedNotification( R.drawable.ic_download_done, /* contentIntent= */ null, - Util.fromUtf8Bytes(download.action.data)); + Util.fromUtf8Bytes(download.request.data)); } else { return; } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java index 156c7a07714..34282fc3893 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java @@ -24,11 +24,11 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.offline.Download; -import com.google.android.exoplayer2.offline.DownloadAction; import com.google.android.exoplayer2.offline.DownloadCursor; import com.google.android.exoplayer2.offline.DownloadHelper; import com.google.android.exoplayer2.offline.DownloadIndex; import com.google.android.exoplayer2.offline.DownloadManager; +import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.offline.DownloadService; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; @@ -89,7 +89,7 @@ public boolean isDownloaded(Uri uri) { public List getOfflineStreamKeys(Uri uri) { Download download = downloads.get(uri); return download != null && download.state != Download.STATE_FAILED - ? download.action.streamKeys + ? download.request.streamKeys : Collections.emptyList(); } @@ -102,7 +102,7 @@ public void toggleDownload( Download download = downloads.get(uri); if (download != null) { DownloadService.startWithRemoveDownload( - context, DemoDownloadService.class, download.action.id, /* foreground= */ false); + context, DemoDownloadService.class, download.request.id, /* foreground= */ false); } else { if (startDownloadDialogHelper != null) { startDownloadDialogHelper.release(); @@ -117,18 +117,13 @@ private void loadDownloads() { try (DownloadCursor loadedDownloads = downloadIndex.getDownloads()) { while (loadedDownloads.moveToNext()) { Download download = loadedDownloads.getDownload(); - downloads.put(download.action.uri, download); + downloads.put(download.request.uri, download); } } catch (IOException e) { Log.w(TAG, "Failed to query downloads", e); } } - private void startServiceWithAction(DownloadAction action) { - DownloadService.startWithAction( - context, DemoDownloadService.class, action, /* foreground= */ false); - } - private DownloadHelper getDownloadHelper( Uri uri, String extension, RenderersFactory renderersFactory) { int type = Util.inferContentType(uri, extension); @@ -150,7 +145,7 @@ private class DownloadManagerListener implements DownloadManager.Listener { @Override public void onDownloadChanged(DownloadManager downloadManager, Download download) { - downloads.put(download.action.uri, download); + downloads.put(download.request.uri, download); for (Listener listener : listeners) { listener.onDownloadsChanged(); } @@ -158,7 +153,7 @@ public void onDownloadChanged(DownloadManager downloadManager, Download download @Override public void onDownloadRemoved(DownloadManager downloadManager, Download download) { - downloads.remove(download.action.uri); + downloads.remove(download.request.uri); for (Listener listener : listeners) { listener.onDownloadsChanged(); } @@ -259,8 +254,9 @@ public void onDismiss(DialogInterface dialogInterface) { // Internal methods. private void startDownload() { - DownloadAction downloadAction = downloadHelper.getDownloadAction(Util.getUtf8Bytes(name)); - startServiceWithAction(downloadAction); + DownloadRequest downloadRequest = downloadHelper.getDownloadRequest(Util.getUtf8Bytes(name)); + DownloadService.startWithNewDownload( + context, DemoDownloadService.class, downloadRequest, /* foreground= */ false); } } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/ActionFile.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/ActionFile.java index 0efbece1545..a0531854357 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/ActionFile.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/ActionFile.java @@ -17,7 +17,7 @@ import android.net.Uri; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.offline.DownloadAction.UnsupportedActionException; +import com.google.android.exoplayer2.offline.DownloadRequest.UnsupportedRequestException; import com.google.android.exoplayer2.util.AtomicFile; import com.google.android.exoplayer2.util.Util; import java.io.DataInputStream; @@ -28,7 +28,7 @@ import java.util.List; /** - * Loads {@link DownloadAction DownloadActions} from legacy action files. + * Loads {@link DownloadRequest DownloadRequests} from legacy action files. * * @deprecated Legacy action files should be merged into download indices using {@link * ActionFileUpgradeUtil}. @@ -41,7 +41,7 @@ private final AtomicFile atomicFile; /** - * @param actionFile The file from which {@link DownloadAction DownloadActions} will be loaded. + * @param actionFile The file from which {@link DownloadRequest DownloadRequests} will be loaded. */ public ActionFile(File actionFile) { atomicFile = new AtomicFile(actionFile); @@ -58,15 +58,15 @@ public void delete() { } /** - * Loads {@link DownloadAction DownloadActions} from the file. + * Loads {@link DownloadRequest DownloadRequests} from the file. * - * @return The loaded {@link DownloadAction DownloadActions}, or an empty array if the file does + * @return The loaded {@link DownloadRequest DownloadRequests}, or an empty array if the file does * not exist. * @throws IOException If there is an error reading the file. */ - public DownloadAction[] load() throws IOException { + public DownloadRequest[] load() throws IOException { if (!exists()) { - return new DownloadAction[0]; + return new DownloadRequest[0]; } InputStream inputStream = null; try { @@ -77,21 +77,21 @@ public DownloadAction[] load() throws IOException { throw new IOException("Unsupported action file version: " + version); } int actionCount = dataInputStream.readInt(); - ArrayList actions = new ArrayList<>(); + ArrayList actions = new ArrayList<>(); for (int i = 0; i < actionCount; i++) { try { - actions.add(readDownloadAction(dataInputStream)); - } catch (UnsupportedActionException e) { - // remove DownloadAction is not supported. Ignore the exception and continue loading rest. + actions.add(readDownloadRequest(dataInputStream)); + } catch (UnsupportedRequestException e) { + // remove DownloadRequest is not supported. Ignore and continue loading rest. } } - return actions.toArray(new DownloadAction[0]); + return actions.toArray(new DownloadRequest[0]); } finally { Util.closeQuietly(inputStream); } } - private static DownloadAction readDownloadAction(DataInputStream input) throws IOException { + private static DownloadRequest readDownloadRequest(DataInputStream input) throws IOException { String type = input.readUTF(); int version = input.readInt(); @@ -108,7 +108,7 @@ private static DownloadAction readDownloadAction(DataInputStream input) throws I } // Serialized version 0 progressive actions did not contain keys. - boolean isLegacyProgressive = version == 0 && DownloadAction.TYPE_PROGRESSIVE.equals(type); + boolean isLegacyProgressive = version == 0 && DownloadRequest.TYPE_PROGRESSIVE.equals(type); List keys = new ArrayList<>(); if (!isLegacyProgressive) { int keyCount = input.readInt(); @@ -120,22 +120,22 @@ private static DownloadAction readDownloadAction(DataInputStream input) throws I // Serialized version 0 and 1 DASH/HLS/SS actions did not contain a custom cache key. boolean isLegacySegmented = version < 2 - && (DownloadAction.TYPE_DASH.equals(type) - || DownloadAction.TYPE_HLS.equals(type) - || DownloadAction.TYPE_SS.equals(type)); + && (DownloadRequest.TYPE_DASH.equals(type) + || DownloadRequest.TYPE_HLS.equals(type) + || DownloadRequest.TYPE_SS.equals(type)); String customCacheKey = null; if (!isLegacySegmented) { customCacheKey = input.readBoolean() ? input.readUTF() : null; } // Serialized version 0, 1 and 2 did not contain an id. We need to generate one. - String id = version < 3 ? generateDownloadActionId(uri, customCacheKey) : input.readUTF(); + String id = version < 3 ? generateDownloadId(uri, customCacheKey) : input.readUTF(); if (isRemoveAction) { // Remove actions are not supported anymore. - throw new UnsupportedActionException(); + throw new UnsupportedRequestException(); } - return new DownloadAction(id, type, uri, keys, customCacheKey, data); + return new DownloadRequest(id, type, uri, keys, customCacheKey, data); } private static StreamKey readKey(String type, int version, DataInputStream input) @@ -145,7 +145,7 @@ private static StreamKey readKey(String type, int version, DataInputStream input int trackIndex; // Serialized version 0 HLS/SS actions did not contain a period index. - if ((DownloadAction.TYPE_HLS.equals(type) || DownloadAction.TYPE_SS.equals(type)) + if ((DownloadRequest.TYPE_HLS.equals(type) || DownloadRequest.TYPE_SS.equals(type)) && version == 0) { periodIndex = 0; groupIndex = input.readInt(); @@ -158,7 +158,7 @@ private static StreamKey readKey(String type, int version, DataInputStream input return new StreamKey(periodIndex, groupIndex, trackIndex); } - private static String generateDownloadActionId(Uri uri, @Nullable String customCacheKey) { + private static String generateDownloadId(Uri uri, @Nullable String customCacheKey) { return customCacheKey != null ? customCacheKey : uri.toString(); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtil.java index e30d2026493..0a37fe3a808 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtil.java @@ -28,18 +28,18 @@ public final class ActionFileUpgradeUtil { public interface DownloadIdProvider { /** - * Returns a download id for given action. + * Returns a download id for given request. * - * @param downloadAction The action for which an ID is required. + * @param downloadRequest The request for which an ID is required. * @return A corresponding download ID. */ - String getId(DownloadAction downloadAction); + String getId(DownloadRequest downloadRequest); } private ActionFileUpgradeUtil() {} /** - * Merges {@link DownloadAction DownloadActions} contained in a legacy action file into a {@link + * Merges {@link DownloadRequest DownloadRequests} contained in a legacy action file into a {@link * DefaultDownloadIndex}, deleting the action file if the merge is successful or if {@code * deleteOnFailure} is {@code true}. * @@ -49,9 +49,9 @@ private ActionFileUpgradeUtil() {} * @param actionFilePath The action file path. * @param downloadIdProvider A download ID provider, or {@code null}. If {@code null} then ID of * each download will be its custom cache key if one is specified, or else its URL. - * @param downloadIndex The index into which the action will be merged. + * @param downloadIndex The index into which the requests will be merged. * @param deleteOnFailure Whether to delete the action file if the merge fails. - * @throws IOException If an error occurs loading or merging the actions. + * @throws IOException If an error occurs loading or merging the requests. */ @SuppressWarnings("deprecation") public static void upgradeAndDelete( @@ -64,11 +64,11 @@ public static void upgradeAndDelete( if (actionFile.exists()) { boolean success = false; try { - for (DownloadAction action : actionFile.load()) { + for (DownloadRequest request : actionFile.load()) { if (downloadIdProvider != null) { - action = action.copyWithId(downloadIdProvider.getId(action)); + request = request.copyWithId(downloadIdProvider.getId(request)); } - mergeAction(action, downloadIndex); + mergeRequest(request, downloadIndex); } success = true; } finally { @@ -80,22 +80,22 @@ public static void upgradeAndDelete( } /** - * Merges a {@link DownloadAction} into a {@link DefaultDownloadIndex}. + * Merges a {@link DownloadRequest} into a {@link DefaultDownloadIndex}. * - * @param action The action to be merged. - * @param downloadIndex The index into which the action will be merged. - * @throws IOException If an error occurs merging the action. + * @param request The request to be merged. + * @param downloadIndex The index into which the request will be merged. + * @throws IOException If an error occurs merging the request. */ - /* package */ static void mergeAction(DownloadAction action, DefaultDownloadIndex downloadIndex) - throws IOException { - Download download = downloadIndex.getDownload(action.id); + /* package */ static void mergeRequest( + DownloadRequest request, DefaultDownloadIndex downloadIndex) throws IOException { + Download download = downloadIndex.getDownload(request.id); if (download != null) { - download = DownloadManager.mergeAction(download, action, download.manualStopReason); + download = DownloadManager.mergeRequest(download, request, download.manualStopReason); } else { long nowMs = System.currentTimeMillis(); download = new Download( - action, + request, STATE_QUEUED, Download.FAILURE_REASON_NONE, Download.MANUAL_STOP_REASON_NONE, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java index aae88828c3c..d7ab4201a57 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java @@ -194,12 +194,12 @@ public DownloadCursor getDownloads(@Download.State int... states) throws Databas public void putDownload(Download download) throws DatabaseIOException { ensureInitialized(); ContentValues values = new ContentValues(); - values.put(COLUMN_ID, download.action.id); - values.put(COLUMN_TYPE, download.action.type); - values.put(COLUMN_URI, download.action.uri.toString()); - values.put(COLUMN_STREAM_KEYS, encodeStreamKeys(download.action.streamKeys)); - values.put(COLUMN_CUSTOM_CACHE_KEY, download.action.customCacheKey); - values.put(COLUMN_DATA, download.action.data); + values.put(COLUMN_ID, download.request.id); + values.put(COLUMN_TYPE, download.request.type); + values.put(COLUMN_URI, download.request.uri.toString()); + values.put(COLUMN_STREAM_KEYS, encodeStreamKeys(download.request.streamKeys)); + values.put(COLUMN_CUSTOM_CACHE_KEY, download.request.customCacheKey); + values.put(COLUMN_DATA, download.request.data); values.put(COLUMN_STATE, download.state); values.put(COLUMN_DOWNLOAD_PERCENTAGE, download.getDownloadPercentage()); values.put(COLUMN_DOWNLOADED_BYTES, download.getDownloadedBytes()); @@ -342,8 +342,8 @@ private static String getStateQuery(@Download.State int... states) { } private static Download getDownloadForCurrentRow(Cursor cursor) { - DownloadAction action = - new DownloadAction( + DownloadRequest request = + new DownloadRequest( cursor.getString(COLUMN_INDEX_ID), cursor.getString(COLUMN_INDEX_TYPE), Uri.parse(cursor.getString(COLUMN_INDEX_URI)), @@ -355,7 +355,7 @@ private static Download getDownloadForCurrentRow(Cursor cursor) { cachingCounters.contentLength = cursor.getLong(COLUMN_INDEX_TOTAL_BYTES); cachingCounters.percentage = cursor.getFloat(COLUMN_INDEX_DOWNLOAD_PERCENTAGE); return new Download( - action, + request, cursor.getInt(COLUMN_INDEX_STATE), cursor.getInt(COLUMN_INDEX_FAILURE_REASON), cursor.getInt(COLUMN_INDEX_MANUAL_STOP_REASON), diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.java index 03421dfdff6..9a4e5925ee1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.java @@ -76,32 +76,32 @@ public DefaultDownloaderFactory(DownloaderConstructorHelper downloaderConstructo } @Override - public Downloader createDownloader(DownloadAction action) { - switch (action.type) { - case DownloadAction.TYPE_PROGRESSIVE: + public Downloader createDownloader(DownloadRequest request) { + switch (request.type) { + case DownloadRequest.TYPE_PROGRESSIVE: return new ProgressiveDownloader( - action.uri, action.customCacheKey, downloaderConstructorHelper); - case DownloadAction.TYPE_DASH: - return createDownloader(action, DASH_DOWNLOADER_CONSTRUCTOR); - case DownloadAction.TYPE_HLS: - return createDownloader(action, HLS_DOWNLOADER_CONSTRUCTOR); - case DownloadAction.TYPE_SS: - return createDownloader(action, SS_DOWNLOADER_CONSTRUCTOR); + request.uri, request.customCacheKey, downloaderConstructorHelper); + case DownloadRequest.TYPE_DASH: + return createDownloader(request, DASH_DOWNLOADER_CONSTRUCTOR); + case DownloadRequest.TYPE_HLS: + return createDownloader(request, HLS_DOWNLOADER_CONSTRUCTOR); + case DownloadRequest.TYPE_SS: + return createDownloader(request, SS_DOWNLOADER_CONSTRUCTOR); default: - throw new IllegalArgumentException("Unsupported type: " + action.type); + throw new IllegalArgumentException("Unsupported type: " + request.type); } } private Downloader createDownloader( - DownloadAction action, @Nullable Constructor constructor) { + DownloadRequest request, @Nullable Constructor constructor) { if (constructor == null) { - throw new IllegalStateException("Module missing for: " + action.type); + throw new IllegalStateException("Module missing for: " + request.type); } try { // TODO: Support customCacheKey in DASH/HLS/SS, for completeness. - return constructor.newInstance(action.uri, action.streamKeys, downloaderConstructorHelper); + return constructor.newInstance(request.uri, request.streamKeys, downloaderConstructorHelper); } catch (Exception e) { - throw new RuntimeException("Failed to instantiate downloader for: " + action.type, e); + throw new RuntimeException("Failed to instantiate downloader for: " + request.type, e); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/Download.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/Download.java index a28679ea046..b29abde24b2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/Download.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/Download.java @@ -94,8 +94,8 @@ public static String getStateString(@State int state) { } } - /** The download action. */ - public final DownloadAction action; + /** The download request. */ + public final DownloadRequest request; /** The state of the download. */ @State public final int state; @@ -114,14 +114,14 @@ public static String getStateString(@State int state) { /* package */ CachingCounters counters; /* package */ Download( - DownloadAction action, + DownloadRequest request, @State int state, @FailureReason int failureReason, int manualStopReason, long startTimeMs, long updateTimeMs) { this( - action, + request, state, failureReason, manualStopReason, @@ -131,7 +131,7 @@ public static String getStateString(@State int state) { } /* package */ Download( - DownloadAction action, + DownloadRequest request, @State int state, @FailureReason int failureReason, int manualStopReason, @@ -143,7 +143,7 @@ public static String getStateString(@State int state) { if (manualStopReason != 0) { Assertions.checkState(state != STATE_DOWNLOADING && state != STATE_QUEUED); } - this.action = action; + this.request = request; this.state = state; this.failureReason = failureReason; this.manualStopReason = manualStopReason; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index 39dd944552c..c9b0451f415 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -63,7 +63,7 @@ * A helper for initializing and removing downloads. * *

The helper extracts track information from the media, selects tracks for downloading, and - * creates {@link DownloadAction download actions} based on the selected tracks. + * creates {@link DownloadRequest download requests} based on the selected tracks. * *

A typical usage of DownloadHelper follows these steps: * @@ -74,7 +74,7 @@ * #getTrackSelections(int, int)}, and make adjustments using {@link * #clearTrackSelections(int)}, {@link #replaceTrackSelections(int, Parameters)} and {@link * #addTrackSelection(int, Parameters)}. - *

  • Create a download action for the selected track using {@link #getDownloadAction(byte[])}. + *
  • Create a download request for the selected track using {@link #getDownloadRequest(byte[])}. *
  • Release the helper using {@link #release()}. * */ @@ -150,7 +150,7 @@ public static DownloadHelper forProgressive(Uri uri) { */ public static DownloadHelper forProgressive(Uri uri, @Nullable String cacheKey) { return new DownloadHelper( - DownloadAction.TYPE_PROGRESSIVE, + DownloadRequest.TYPE_PROGRESSIVE, uri, cacheKey, /* mediaSource= */ null, @@ -199,7 +199,7 @@ public static DownloadHelper forDash( @Nullable DrmSessionManager drmSessionManager, DefaultTrackSelector.Parameters trackSelectorParameters) { return new DownloadHelper( - DownloadAction.TYPE_DASH, + DownloadRequest.TYPE_DASH, uri, /* cacheKey= */ null, createMediaSource( @@ -249,7 +249,7 @@ public static DownloadHelper forHls( @Nullable DrmSessionManager drmSessionManager, DefaultTrackSelector.Parameters trackSelectorParameters) { return new DownloadHelper( - DownloadAction.TYPE_HLS, + DownloadRequest.TYPE_HLS, uri, /* cacheKey= */ null, createMediaSource( @@ -299,7 +299,7 @@ public static DownloadHelper forSmoothStreaming( @Nullable DrmSessionManager drmSessionManager, DefaultTrackSelector.Parameters trackSelectorParameters) { return new DownloadHelper( - DownloadAction.TYPE_SS, + DownloadRequest.TYPE_SS, uri, /* cacheKey= */ null, createMediaSource(uri, dataSourceFactory, SS_FACTORY_CONSTRUCTOR, SS_FACTORY_CREATE_METHOD), @@ -327,7 +327,7 @@ public static DownloadHelper forSmoothStreaming( /** * Creates download helper. * - * @param downloadType A download type. This value will be used as {@link DownloadAction#type}. + * @param downloadType A download type. This value will be used as {@link DownloadRequest#type}. * @param uri A {@link Uri}. * @param cacheKey An optional cache key. * @param mediaSource A {@link MediaSource} for which tracks are selected, or null if no track @@ -577,16 +577,16 @@ public void addTrackSelectionForSingleRenderer( } /** - * Builds a {@link DownloadAction} for downloading the selected tracks. Must not be called until + * Builds a {@link DownloadRequest} for downloading the selected tracks. Must not be called until * after preparation completes. * - * @param data Application provided data to store in {@link DownloadAction#data}. - * @return The built {@link DownloadAction}. + * @param data Application provided data to store in {@link DownloadRequest#data}. + * @return The built {@link DownloadRequest}. */ - public DownloadAction getDownloadAction(@Nullable byte[] data) { + public DownloadRequest getDownloadRequest(@Nullable byte[] data) { String downloadId = uri.toString(); if (mediaSource == null) { - return new DownloadAction( + return new DownloadRequest( downloadId, downloadType, uri, /* streamKeys= */ Collections.emptyList(), cacheKey, data); } assertPreparedWithMedia(); @@ -601,7 +601,7 @@ public DownloadAction getDownloadAction(@Nullable byte[] data) { } streamKeys.addAll(mediaPreparer.mediaPeriods[periodIndex].getStreamKeys(allSelections)); } - return new DownloadAction(downloadId, downloadType, uri, streamKeys, cacheKey, data); + return new DownloadRequest(downloadId, downloadType, uri, streamKeys, cacheKey, data); } // Initialization of array of Lists. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java index 813376579b3..03c33b6aad0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java @@ -69,7 +69,7 @@ public final class DownloadManager { public interface Listener { /** - * Called when all actions have been restored. + * Called when all downloads have been restored. * * @param downloadManager The reporting instance. */ @@ -382,25 +382,25 @@ public void setManualStopReason(@Nullable String id, int manualStopReason) { } /** - * Adds a download defined by the given action. + * Adds a download defined by the given request. * - * @param action The download action. + * @param request The download request. */ - public void addDownload(DownloadAction action) { - addDownload(action, Download.MANUAL_STOP_REASON_NONE); + public void addDownload(DownloadRequest request) { + addDownload(request, Download.MANUAL_STOP_REASON_NONE); } /** - * Adds a download defined by the given action and with the specified manual stop reason. + * Adds a download defined by the given request and with the specified manual stop reason. * - * @param action The download action. + * @param request The download request. * @param manualStopReason An initial manual stop reason for the download, or {@link * Download#MANUAL_STOP_REASON_NONE} if the download should be started. */ - public void addDownload(DownloadAction action, int manualStopReason) { + public void addDownload(DownloadRequest request, int manualStopReason) { pendingMessages++; internalHandler - .obtainMessage(MSG_ADD_DOWNLOAD, manualStopReason, /* unused */ 0, action) + .obtainMessage(MSG_ADD_DOWNLOAD, manualStopReason, /* unused */ 0, request) .sendToTarget(); } @@ -415,9 +415,8 @@ public void removeDownload(String id) { } /** - * Stops all of the downloads and releases resources. If the action file isn't up to date, waits - * for the changes to be written. The manager must not be accessed after this method has been - * called. + * Stops the downloads and releases resources. Waits until the downloads are persisted to the + * download index. The manager must not be accessed after this method has been called. */ public void release() { synchronized (releaseLock) { @@ -498,7 +497,7 @@ private void onInitialized(List downloads) { } private void onDownloadChanged(Download download) { - int downloadIndex = getDownloadIndex(download.action.id); + int downloadIndex = getDownloadIndex(download.request.id); if (download.isTerminalState()) { if (downloadIndex != C.INDEX_UNSET) { downloads.remove(downloadIndex); @@ -514,7 +513,7 @@ private void onDownloadChanged(Download download) { } private void onDownloadRemoved(Download download) { - downloads.remove(getDownloadIndex(download.action.id)); + downloads.remove(getDownloadIndex(download.request.id)); for (Listener listener : listeners) { listener.onDownloadRemoved(this, download); } @@ -532,7 +531,7 @@ private void onMessageProcessed(int processedMessageCount, int activeDownloadCou private int getDownloadIndex(String id) { for (int i = 0; i < downloads.size(); i++) { - if (downloads.get(i).action.id.equals(id)) { + if (downloads.get(i).request.id.equals(id)) { return i; } } @@ -562,9 +561,9 @@ private boolean handleInternalMessage(Message message) { setManualStopReasonInternal(id, manualStopReason); break; case MSG_ADD_DOWNLOAD: - DownloadAction action = (DownloadAction) message.obj; + DownloadRequest request = (DownloadRequest) message.obj; manualStopReason = message.arg1; - addDownloadInternal(action, manualStopReason); + addDownloadInternal(request, manualStopReason); break; case MSG_REMOVE_DOWNLOAD: id = (String) message.obj; @@ -657,27 +656,27 @@ private void setManualStopReasonInternal(@Nullable String id, int manualStopReas } } - private void addDownloadInternal(DownloadAction action, int manualStopReason) { - DownloadInternal downloadInternal = getDownload(action.id); + private void addDownloadInternal(DownloadRequest request, int manualStopReason) { + DownloadInternal downloadInternal = getDownload(request.id); if (downloadInternal != null) { - downloadInternal.addAction(action, manualStopReason); - logd("Action is added to existing download", downloadInternal); + downloadInternal.addRequest(request, manualStopReason); + logd("Request is added to existing download", downloadInternal); } else { - Download download = loadDownload(action.id); + Download download = loadDownload(request.id); if (download == null) { long nowMs = System.currentTimeMillis(); download = new Download( - action, + request, manualStopReason != Download.MANUAL_STOP_REASON_NONE ? STATE_STOPPED : STATE_QUEUED, Download.FAILURE_REASON_NONE, manualStopReason, /* startTimeMs= */ nowMs, /* updateTimeMs= */ nowMs); - logd("Download state is created for " + action.id); + logd("Download state is created for " + request.id); } else { - download = mergeAction(download, action, manualStopReason); - logd("Download state is loaded for " + action.id); + download = mergeRequest(download, request, manualStopReason); + logd("Download state is loaded for " + request.id); } addDownloadForState(download); } @@ -698,8 +697,8 @@ private void removeDownloadInternal(String id) { } private void onDownloadThreadStoppedInternal(DownloadThread downloadThread) { - logd("Download is stopped", downloadThread.action); - String downloadId = downloadThread.action.id; + logd("Download is stopped", downloadThread.request); + String downloadId = downloadThread.request.id; downloadThreads.remove(downloadId); boolean tryToStartDownloads = false; if (!downloadThread.isRemove) { @@ -747,7 +746,7 @@ private void onDownloadChangedInternal(DownloadInternal downloadInternal, Downlo private void onDownloadRemovedInternal(DownloadInternal downloadInternal, Download download) { logd("Download is removed", downloadInternal); try { - downloadIndex.removeDownload(download.action.id); + downloadIndex.removeDownload(download.request.id); } catch (DatabaseIOException e) { Log.e(TAG, "Failed to remove from index", e); } @@ -757,8 +756,8 @@ private void onDownloadRemovedInternal(DownloadInternal downloadInternal, Downlo @StartThreadResults private int startDownloadThread(DownloadInternal downloadInternal) { - DownloadAction action = downloadInternal.download.action; - String downloadId = action.id; + DownloadRequest request = downloadInternal.download.request; + String downloadId = request.id; if (downloadThreads.containsKey(downloadId)) { if (stopDownloadThreadInternal(downloadId)) { return START_THREAD_WAIT_DOWNLOAD_CANCELLATION; @@ -772,9 +771,9 @@ private int startDownloadThread(DownloadInternal downloadInternal) { } simultaneousDownloads++; } - Downloader downloader = downloaderFactory.createDownloader(action); + Downloader downloader = downloaderFactory.createDownloader(request); DownloadThread downloadThread = - new DownloadThread(action, downloader, isRemove, minRetryCount, internalHandler); + new DownloadThread(request, downloader, isRemove, minRetryCount, internalHandler); downloadThreads.put(downloadId, downloadThread); downloadInternal.setCounters(downloadThread.downloader.getCounters()); downloadThread.start(); @@ -786,7 +785,7 @@ private boolean stopDownloadThreadInternal(String downloadId) { DownloadThread downloadThread = downloadThreads.get(downloadId); if (downloadThread != null && !downloadThread.isRemove) { downloadThread.cancel(/* released= */ false); - logd("Download is cancelled", downloadThread.action); + logd("Download is cancelled", downloadThread.request); return true; } return false; @@ -796,7 +795,7 @@ private boolean stopDownloadThreadInternal(String downloadId) { private DownloadInternal getDownload(String id) { for (int i = 0; i < downloadInternals.size(); i++) { DownloadInternal downloadInternal = downloadInternals.get(i); - if (downloadInternal.download.action.id.equals(id)) { + if (downloadInternal.download.request.id.equals(id)) { return downloadInternal; } } @@ -823,8 +822,8 @@ private boolean canStartDownloads() { return downloadsStarted && notMetRequirements == 0; } - /* package */ static Download mergeAction( - Download download, DownloadAction action, int manualStopReason) { + /* package */ static Download mergeRequest( + Download download, DownloadRequest request, int manualStopReason) { @Download.State int state = download.state; if (state == STATE_REMOVING || state == STATE_RESTARTING) { state = STATE_RESTARTING; @@ -836,7 +835,7 @@ private boolean canStartDownloads() { long nowMs = System.currentTimeMillis(); long startTimeMs = download.isTerminalState() ? nowMs : download.startTimeMs; return new Download( - download.action.copyWithMergedAction(action), + download.request.copyWithMergedRequest(request), state, FAILURE_REASON_NONE, manualStopReason, @@ -847,7 +846,7 @@ private boolean canStartDownloads() { private static Download copyWithState(Download download, @Download.State int state) { return new Download( - download.action, + download.request, state, FAILURE_REASON_NONE, download.manualStopReason, @@ -863,12 +862,12 @@ private static void logd(String message) { } private static void logd(String message, DownloadInternal downloadInternal) { - logd(message, downloadInternal.download.action); + logd(message, downloadInternal.download.request); } - private static void logd(String message, DownloadAction action) { + private static void logd(String message, DownloadRequest request) { if (DEBUG) { - logd(message + ": " + action); + logd(message + ": " + request); } } @@ -899,8 +898,8 @@ private void initialize() { initialize(download.state); } - public void addAction(DownloadAction newAction, int manualStopReason) { - download = mergeAction(download, newAction, manualStopReason); + public void addRequest(DownloadRequest newRequest, int manualStopReason) { + download = mergeRequest(download, newRequest, manualStopReason); initialize(); } @@ -911,7 +910,7 @@ public void remove() { public Download getUpdatedDownload() { download = new Download( - download.action, + download.request, state, state != STATE_FAILED ? FAILURE_REASON_NONE : failureReason, manualStopReason, @@ -927,7 +926,7 @@ public boolean isIdle() { @Override public String toString() { - return download.action.id + ' ' + Download.getStateString(state); + return download.request.id + ' ' + Download.getStateString(state); } public void start() { @@ -959,7 +958,7 @@ private void updateStopState() { } } else { if (state == STATE_DOWNLOADING || state == STATE_QUEUED) { - downloadManager.stopDownloadThreadInternal(download.action.id); + downloadManager.stopDownloadThreadInternal(download.request.id); setState(STATE_STOPPED); } } @@ -1018,7 +1017,7 @@ private void onDownloadThreadStopped(boolean isCanceled, @Nullable Throwable err initialize(STATE_QUEUED); } else { // STATE_DOWNLOADING if (error != null) { - Log.e(TAG, "Download failed: " + download.action.id, error); + Log.e(TAG, "Download failed: " + download.request.id, error); failureReason = FAILURE_REASON_UNKNOWN; setState(STATE_FAILED); } else { @@ -1030,7 +1029,7 @@ private void onDownloadThreadStopped(boolean isCanceled, @Nullable Throwable err private static class DownloadThread extends Thread { - private final DownloadAction action; + private final DownloadRequest request; private final Downloader downloader; private final boolean isRemove; private final int minRetryCount; @@ -1040,12 +1039,12 @@ private static class DownloadThread extends Thread { private Throwable finalError; private DownloadThread( - DownloadAction action, + DownloadRequest request, Downloader downloader, boolean isRemove, int minRetryCount, Handler onStoppedHandler) { - this.action = action; + this.request = request; this.isRemove = isRemove; this.downloader = downloader; this.minRetryCount = minRetryCount; @@ -1069,7 +1068,7 @@ public void cancel(boolean released) { @Override public void run() { - logd("Download started", action); + logd("Download started", request); try { if (isRemove) { downloader.remove(); @@ -1084,14 +1083,14 @@ public void run() { if (!isCanceled) { long downloadedBytes = downloader.getDownloadedBytes(); if (downloadedBytes != errorPosition) { - logd("Reset error count. downloadedBytes = " + downloadedBytes, action); + logd("Reset error count. downloadedBytes = " + downloadedBytes, request); errorPosition = downloadedBytes; errorCount = 0; } if (++errorCount > minRetryCount) { throw e; } - logd("Download error. Retry " + errorCount, action); + logd("Download error. Retry " + errorCount, request); Thread.sleep(getRetryDelayMillis(errorCount)); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadAction.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java similarity index 74% rename from library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadAction.java rename to library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java index 08e6c2aafeb..5acefd6f936 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadAction.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java @@ -30,10 +30,10 @@ import java.util.List; /** Defines content to be downloaded. */ -public final class DownloadAction implements Parcelable { +public final class DownloadRequest implements Parcelable { - /** Thrown when the encoded action data belongs to an unsupported DownloadAction type. */ - public static class UnsupportedActionException extends IOException {} + /** Thrown when the encoded request data belongs to an unsupported request type. */ + public static class UnsupportedRequestException extends IOException {} /** Type for progressive downloads. */ public static final String TYPE_PROGRESSIVE = "progressive"; @@ -46,7 +46,7 @@ public static class UnsupportedActionException extends IOException {} /** The unique content id. */ public final String id; - /** The type of the action. */ + /** The type of the request. */ public final String type; /** The uri being downloaded. */ public final Uri uri; @@ -65,7 +65,7 @@ public static class UnsupportedActionException extends IOException {} * @param customCacheKey See {@link #customCacheKey}. * @param data See {@link #data}. */ - public DownloadAction( + public DownloadRequest( String id, String type, Uri uri, @@ -82,7 +82,7 @@ public DownloadAction( this.data = data != null ? Arrays.copyOf(data, data.length) : Util.EMPTY_BYTE_ARRAY; } - /* package */ DownloadAction(Parcel in) { + /* package */ DownloadRequest(Parcel in) { id = castNonNull(in.readString()); type = castNonNull(in.readString()); uri = Uri.parse(castNonNull(in.readString())); @@ -103,40 +103,40 @@ public DownloadAction( * @param id The ID of the copy. * @return The copy with the specified ID. */ - public DownloadAction copyWithId(String id) { - return new DownloadAction(id, type, uri, streamKeys, customCacheKey, data); + public DownloadRequest copyWithId(String id) { + return new DownloadRequest(id, type, uri, streamKeys, customCacheKey, data); } /** - * Returns the result of merging {@code newAction} into this action. The actions must have the + * Returns the result of merging {@code newRequest} into this request. The requests must have the * same {@link #id} and {@link #type}. * - *

    If the actions have different {@link #uri}, {@link #customCacheKey} and {@link #data} - * values, then those from the action being merged are included in the result. + *

    If the requests have different {@link #uri}, {@link #customCacheKey} and {@link #data} + * values, then those from the request being merged are included in the result. * - * @param newAction The action being merged. + * @param newRequest The request being merged. * @return The merged result. - * @throws IllegalArgumentException If the actions do not have the same {@link #id} and {@link + * @throws IllegalArgumentException If the requests do not have the same {@link #id} and {@link * #type}. */ - public DownloadAction copyWithMergedAction(DownloadAction newAction) { - Assertions.checkArgument(id.equals(newAction.id)); - Assertions.checkArgument(type.equals(newAction.type)); + public DownloadRequest copyWithMergedRequest(DownloadRequest newRequest) { + Assertions.checkArgument(id.equals(newRequest.id)); + Assertions.checkArgument(type.equals(newRequest.type)); List mergedKeys; - if (streamKeys.isEmpty() || newAction.streamKeys.isEmpty()) { + if (streamKeys.isEmpty() || newRequest.streamKeys.isEmpty()) { // If either streamKeys is empty then all streams should be downloaded. mergedKeys = Collections.emptyList(); } else { mergedKeys = new ArrayList<>(streamKeys); - for (int i = 0; i < newAction.streamKeys.size(); i++) { - StreamKey newKey = newAction.streamKeys.get(i); + for (int i = 0; i < newRequest.streamKeys.size(); i++) { + StreamKey newKey = newRequest.streamKeys.get(i); if (!mergedKeys.contains(newKey)) { mergedKeys.add(newKey); } } } - return new DownloadAction( - id, type, newAction.uri, mergedKeys, newAction.customCacheKey, newAction.data); + return new DownloadRequest( + id, type, newRequest.uri, mergedKeys, newRequest.customCacheKey, newRequest.data); } @Override @@ -146,10 +146,10 @@ public String toString() { @Override public boolean equals(@Nullable Object o) { - if (!(o instanceof DownloadAction)) { + if (!(o instanceof DownloadRequest)) { return false; } - DownloadAction that = (DownloadAction) o; + DownloadRequest that = (DownloadRequest) o; return id.equals(that.id) && type.equals(that.type) && uri.equals(that.uri) @@ -191,17 +191,17 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeByteArray(data); } - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { @Override - public DownloadAction createFromParcel(Parcel in) { - return new DownloadAction(in); + public DownloadRequest createFromParcel(Parcel in) { + return new DownloadRequest(in); } @Override - public DownloadAction[] newArray(int size) { - return new DownloadAction[size]; + public DownloadRequest[] newArray(int size) { + return new DownloadRequest[size]; } }; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java index 1a07aa2f7cb..c206a94d6d5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java @@ -39,7 +39,7 @@ public abstract class DownloadService extends Service { /** - * Starts a download service without adding a new {@link DownloadAction}. Extras: + * Starts a download service to resume any ongoing downloads. Extras: * *

      *
    • {@link #KEY_FOREGROUND} - See {@link #KEY_FOREGROUND}. @@ -56,7 +56,7 @@ public abstract class DownloadService extends Service { * Adds a new download. Extras: * *
        - *
      • {@link #KEY_DOWNLOAD_ACTION} - A {@link DownloadAction} defining the download to be + *
      • {@link #KEY_DOWNLOAD_REQUEST} - A {@link DownloadRequest} defining the download to be * added. *
      • {@link #KEY_MANUAL_STOP_REASON} - An initial manual stop reason for the download. If * omitted {@link Download#MANUAL_STOP_REASON_NONE} is used. @@ -103,7 +103,7 @@ public abstract class DownloadService extends Service { "com.google.android.exoplayer.downloadService.action.SET_MANUAL_STOP_REASON"; /** - * Removes an existing download. Extras: + * Removes a download. Extras: * *
          *
        • {@link #KEY_CONTENT_ID} - The content id of a download to remove. @@ -113,11 +113,8 @@ public abstract class DownloadService extends Service { public static final String ACTION_REMOVE = "com.google.android.exoplayer.downloadService.action.REMOVE"; - /** - * Key for the {@code byte[]} representation of the {@link DownloadAction} in {@link #ACTION_ADD} - * intents. - */ - public static final String KEY_DOWNLOAD_ACTION = "download_action"; + /** Key for the {@link DownloadRequest} in {@link #ACTION_ADD} intents. */ + public static final String KEY_DOWNLOAD_REQUEST = "download_request"; /** * Key for the content id in {@link #ACTION_START}, {@link #ACTION_STOP} and {@link @@ -234,42 +231,42 @@ protected DownloadService( } /** - * Builds an {@link Intent} for adding an action to be executed by the service. + * Builds an {@link Intent} for adding a new download. * * @param context A {@link Context}. * @param clazz The concrete download service being targeted by the intent. - * @param downloadAction The action to be executed. + * @param downloadRequest The request to be executed. * @param foreground Whether this intent will be used to start the service in the foreground. * @return Created Intent. */ - public static Intent buildAddActionIntent( + public static Intent buildAddRequestIntent( Context context, Class clazz, - DownloadAction downloadAction, + DownloadRequest downloadRequest, boolean foreground) { - return buildAddActionIntent( - context, clazz, downloadAction, MANUAL_STOP_REASON_NONE, foreground); + return buildAddRequestIntent( + context, clazz, downloadRequest, MANUAL_STOP_REASON_NONE, foreground); } /** - * Builds an {@link Intent} for adding an action to be executed by the service. + * Builds an {@link Intent} for adding a new download. * * @param context A {@link Context}. * @param clazz The concrete download service being targeted by the intent. - * @param downloadAction The action to be executed. + * @param downloadRequest The request to be executed. * @param manualStopReason An initial manual stop reason for the download, or {@link * Download#MANUAL_STOP_REASON_NONE} if the download should be started. * @param foreground Whether this intent will be used to start the service in the foreground. * @return Created Intent. */ - public static Intent buildAddActionIntent( + public static Intent buildAddRequestIntent( Context context, Class clazz, - DownloadAction downloadAction, + DownloadRequest downloadRequest, int manualStopReason, boolean foreground) { return getIntent(context, clazz, ACTION_ADD) - .putExtra(KEY_DOWNLOAD_ACTION, downloadAction) + .putExtra(KEY_DOWNLOAD_REQUEST, downloadRequest) .putExtra(KEY_MANUAL_STOP_REASON, manualStopReason) .putExtra(KEY_FOREGROUND, foreground); } @@ -311,19 +308,19 @@ public static Intent buildSetManualStopReasonIntent( } /** - * Starts the service, adding an action to be executed. + * Starts the service, adding a new download. * * @param context A {@link Context}. * @param clazz The concrete download service to be started. - * @param downloadAction The action to be executed. + * @param downloadRequest The request to be executed. * @param foreground Whether the service is started in the foreground. */ - public static void startWithAction( + public static void startWithNewDownload( Context context, Class clazz, - DownloadAction downloadAction, + DownloadRequest downloadRequest, boolean foreground) { - Intent intent = buildAddActionIntent(context, clazz, downloadAction, foreground); + Intent intent = buildAddRequestIntent(context, clazz, downloadRequest, foreground); if (foreground) { Util.startForegroundService(context, intent); } else { @@ -350,8 +347,7 @@ public static void startWithRemoveDownload( } /** - * Starts the service without adding a new action. If there are any not finished actions and the - * requirements are met, the service resumes executing actions. Otherwise it stops immediately. + * Starts a download service to resume any ongoing downloads. * * @param context A {@link Context}. * @param clazz The concrete download service to be started. @@ -362,9 +358,9 @@ public static void start(Context context, Class clazz } /** - * Starts the service in the foreground without adding a new action. If there are any not finished - * actions and the requirements are met, the service resumes executing actions. Otherwise it stops - * immediately. + * Starts the service in the foreground without adding a new download request. If there are any + * not finished downloads and the requirements are met, the service resumes downloading. Otherwise + * it stops immediately. * * @param context A {@link Context}. * @param clazz The concrete download service to be started. @@ -417,13 +413,13 @@ public int onStartCommand(Intent intent, int flags, int startId) { // Do nothing. break; case ACTION_ADD: - DownloadAction downloadAction = intent.getParcelableExtra(KEY_DOWNLOAD_ACTION); - if (downloadAction == null) { - Log.e(TAG, "Ignored ADD: Missing download_action extra"); + DownloadRequest downloadRequest = intent.getParcelableExtra(KEY_DOWNLOAD_REQUEST); + if (downloadRequest == null) { + Log.e(TAG, "Ignored ADD: Missing " + KEY_DOWNLOAD_REQUEST + " extra"); } else { int manualStopReason = intent.getIntExtra(KEY_MANUAL_STOP_REASON, Download.MANUAL_STOP_REASON_NONE); - downloadManager.addDownload(downloadAction, manualStopReason); + downloadManager.addDownload(downloadRequest, manualStopReason); } break; case ACTION_START: @@ -434,7 +430,8 @@ public int onStartCommand(Intent intent, int flags, int startId) { break; case ACTION_SET_MANUAL_STOP_REASON: if (!intent.hasExtra(KEY_MANUAL_STOP_REASON)) { - Log.e(TAG, "Ignored SET_MANUAL_STOP_REASON: Missing manual_stop_reason extra"); + Log.e( + TAG, "Ignored SET_MANUAL_STOP_REASON: Missing " + KEY_MANUAL_STOP_REASON + " extra"); } else { String contentId = intent.getStringExtra(KEY_CONTENT_ID); int manualStopReason = @@ -445,7 +442,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { case ACTION_REMOVE: String contentId = intent.getStringExtra(KEY_CONTENT_ID); if (contentId == null) { - Log.e(TAG, "Ignored REMOVE: Missing content_id extra"); + Log.e(TAG, "Ignored REMOVE: Missing " + KEY_CONTENT_ID + " extra"); } else { downloadManager.removeDownload(contentId); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloaderFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloaderFactory.java index a2699e560f2..f98ca3eac33 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloaderFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloaderFactory.java @@ -15,14 +15,14 @@ */ package com.google.android.exoplayer2.offline; -/** Creates {@link Downloader Downloaders} for given {@link DownloadAction DownloadActions}. */ +/** Creates {@link Downloader Downloaders} for given {@link DownloadRequest DownloadRequests}. */ public interface DownloaderFactory { /** - * Creates a {@link Downloader} to perform the given {@link DownloadAction}. + * Creates a {@link Downloader} to perform the given {@link DownloadRequest}. * * @param action The action. * @return The downloader. */ - Downloader createDownloader(DownloadAction action); + Downloader createDownloader(DownloadRequest action); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileTest.java index 3273fef71fe..7abfa448866 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileTest.java @@ -33,20 +33,21 @@ import org.junit.runner.RunWith; /** Unit tests for {@link ActionFile}. */ +@SuppressWarnings("deprecation") @RunWith(AndroidJUnit4.class) public class ActionFileTest { private File tempFile; - private DownloadAction expectedAction1; - private DownloadAction expectedAction2; + private DownloadRequest expectedAction1; + private DownloadRequest expectedAction2; @Before public void setUp() throws Exception { tempFile = Util.createTempFile(ApplicationProvider.getApplicationContext(), "ExoPlayerTest"); expectedAction1 = - buildExpectedAction(Uri.parse("http://test1.uri"), TestUtil.buildTestData(16)); + buildExpectedRequest(Uri.parse("http://test1.uri"), TestUtil.buildTestData(16)); expectedAction2 = - buildExpectedAction(Uri.parse("http://test2.uri"), TestUtil.buildTestData(32)); + buildExpectedRequest(Uri.parse("http://test2.uri"), TestUtil.buildTestData(32)); } @After @@ -79,7 +80,7 @@ public void testLoadIncompleteHeaderThrowsIOException() throws Exception { @Test public void testLoadZeroActions() throws Exception { ActionFile actionFile = getActionFile("offline/action_file_zero_actions.exi"); - DownloadAction[] actions = actionFile.load(); + DownloadRequest[] actions = actionFile.load(); assertThat(actions).isNotNull(); assertThat(actions).hasLength(0); } @@ -87,7 +88,7 @@ public void testLoadZeroActions() throws Exception { @Test public void testLoadOneAction() throws Exception { ActionFile actionFile = getActionFile("offline/action_file_one_action.exi"); - DownloadAction[] actions = actionFile.load(); + DownloadRequest[] actions = actionFile.load(); assertThat(actions).hasLength(1); assertThat(actions[0]).isEqualTo(expectedAction1); } @@ -95,7 +96,7 @@ public void testLoadOneAction() throws Exception { @Test public void testLoadTwoActions() throws Exception { ActionFile actionFile = getActionFile("offline/action_file_two_actions.exi"); - DownloadAction[] actions = actionFile.load(); + DownloadRequest[] actions = actionFile.load(); assertThat(actions).hasLength(2); assertThat(actions[0]).isEqualTo(expectedAction1); assertThat(actions[1]).isEqualTo(expectedAction2); @@ -123,10 +124,10 @@ private ActionFile getActionFile(String fileName) throws IOException { return new ActionFile(tempFile); } - private static DownloadAction buildExpectedAction(Uri uri, byte[] data) { - return new DownloadAction( + private static DownloadRequest buildExpectedRequest(Uri uri, byte[] data) { + return new DownloadRequest( /* id= */ uri.toString(), - DownloadAction.TYPE_PROGRESSIVE, + DownloadRequest.TYPE_PROGRESSIVE, uri, /* streamKeys= */ Collections.emptyList(), /* customCacheKey= */ null, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtilTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtilTest.java index bef5443bf61..5153b53839e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtilTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtilTest.java @@ -15,7 +15,7 @@ */ package com.google.android.exoplayer2.offline; -import static com.google.android.exoplayer2.offline.DownloadAction.TYPE_DASH; +import static com.google.android.exoplayer2.offline.DownloadRequest.TYPE_DASH; import static com.google.common.truth.Truth.assertThat; import android.net.Uri; @@ -70,16 +70,16 @@ public void upgradeAndDelete_createsDownloads() throws IOException { new StreamKey(/* periodIndex= */ 3, /* groupIndex= */ 4, /* trackIndex= */ 5); StreamKey expectedStreamKey2 = new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 1, /* trackIndex= */ 2); - DownloadAction expectedAction1 = - new DownloadAction( + DownloadRequest expectedRequest1 = + new DownloadRequest( "key123", TYPE_DASH, Uri.parse("https://www.test.com/download1"), asList(expectedStreamKey1), /* customCacheKey= */ "key123", new byte[] {1, 2, 3, 4}); - DownloadAction expectedAction2 = - new DownloadAction( + DownloadRequest expectedRequest2 = + new DownloadRequest( "key234", TYPE_DASH, Uri.parse("https://www.test.com/download2"), @@ -90,15 +90,15 @@ public void upgradeAndDelete_createsDownloads() throws IOException { ActionFileUpgradeUtil.upgradeAndDelete( tempFile, /* downloadIdProvider= */ null, downloadIndex, /* deleteOnFailure= */ true); - assertDownloadIndexContainsAction(expectedAction1, Download.STATE_QUEUED); - assertDownloadIndexContainsAction(expectedAction2, Download.STATE_QUEUED); + assertDownloadIndexContainsRequest(expectedRequest1, Download.STATE_QUEUED); + assertDownloadIndexContainsRequest(expectedRequest2, Download.STATE_QUEUED); } @Test - public void mergeAction_nonExistingDownload_createsNewDownload() throws IOException { + public void mergeRequest_nonExistingDownload_createsNewDownload() throws IOException { byte[] data = new byte[] {1, 2, 3, 4}; - DownloadAction action = - new DownloadAction( + DownloadRequest request = + new DownloadRequest( "id", TYPE_DASH, Uri.parse("https://www.test.com/download"), @@ -108,50 +108,50 @@ public void mergeAction_nonExistingDownload_createsNewDownload() throws IOExcept /* customCacheKey= */ "key123", data); - ActionFileUpgradeUtil.mergeAction(action, downloadIndex); + ActionFileUpgradeUtil.mergeRequest(request, downloadIndex); - assertDownloadIndexContainsAction(action, Download.STATE_QUEUED); + assertDownloadIndexContainsRequest(request, Download.STATE_QUEUED); } @Test - public void mergeAction_existingDownload_createsMergedDownload() throws IOException { + public void mergeRequest_existingDownload_createsMergedDownload() throws IOException { StreamKey streamKey1 = new StreamKey(/* periodIndex= */ 3, /* groupIndex= */ 4, /* trackIndex= */ 5); StreamKey streamKey2 = new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 1, /* trackIndex= */ 2); - DownloadAction action1 = - new DownloadAction( + DownloadRequest request1 = + new DownloadRequest( "id", TYPE_DASH, Uri.parse("https://www.test.com/download1"), asList(streamKey1), /* customCacheKey= */ "key123", new byte[] {1, 2, 3, 4}); - DownloadAction action2 = - new DownloadAction( + DownloadRequest request2 = + new DownloadRequest( "id", TYPE_DASH, Uri.parse("https://www.test.com/download2"), asList(streamKey2), /* customCacheKey= */ "key123", new byte[] {5, 4, 3, 2, 1}); - ActionFileUpgradeUtil.mergeAction(action1, downloadIndex); - ActionFileUpgradeUtil.mergeAction(action2, downloadIndex); + ActionFileUpgradeUtil.mergeRequest(request1, downloadIndex); + ActionFileUpgradeUtil.mergeRequest(request2, downloadIndex); - Download download = downloadIndex.getDownload(action2.id); + Download download = downloadIndex.getDownload(request2.id); assertThat(download).isNotNull(); - assertThat(download.action.type).isEqualTo(action2.type); - assertThat(download.action.customCacheKey).isEqualTo(action2.customCacheKey); - assertThat(download.action.data).isEqualTo(action2.data); - assertThat(download.action.uri).isEqualTo(action2.uri); - assertThat(download.action.streamKeys).containsExactly(streamKey1, streamKey2); + assertThat(download.request.type).isEqualTo(request2.type); + assertThat(download.request.customCacheKey).isEqualTo(request2.customCacheKey); + assertThat(download.request.data).isEqualTo(request2.data); + assertThat(download.request.uri).isEqualTo(request2.uri); + assertThat(download.request.streamKeys).containsExactly(streamKey1, streamKey2); assertThat(download.state).isEqualTo(Download.STATE_QUEUED); } - private void assertDownloadIndexContainsAction(DownloadAction action, int state) + private void assertDownloadIndexContainsRequest(DownloadRequest request, int state) throws IOException { - Download download = downloadIndex.getDownload(action.id); - assertThat(download.action).isEqualTo(action); + Download download = downloadIndex.getDownload(request.id); + assertThat(download.request).isEqualTo(request); assertThat(download.state).isEqualTo(state); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloadIndexTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloadIndexTest.java index 4778729f237..5bd1f34ed40 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloadIndexTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloadIndexTest.java @@ -301,7 +301,7 @@ public void setSingleDownloadManualStopReason_notTerminalState_doesNotSetManualS } private static void assertEqual(Download download, Download that) { - assertThat(download.action).isEqualTo(that.action); + assertThat(download.request).isEqualTo(that.request); assertThat(download.state).isEqualTo(that.state); assertThat(download.startTimeMs).isEqualTo(that.startTimeMs); assertThat(download.updateTimeMs).isEqualTo(that.updateTimeMs); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactoryTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactoryTest.java index 08a0edd5d64..c3d23c7d220 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactoryTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactoryTest.java @@ -38,9 +38,9 @@ public void createProgressiveDownloader() throws Exception { Downloader downloader = factory.createDownloader( - new DownloadAction( + new DownloadRequest( "id", - DownloadAction.TYPE_PROGRESSIVE, + DownloadRequest.TYPE_PROGRESSIVE, Uri.parse("https://www.test.com/download"), /* streamKeys= */ Collections.emptyList(), /* customCacheKey= */ null, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadActionTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadActionTest.java deleted file mode 100644 index 0c753e8fef9..00000000000 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadActionTest.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (C) 2018 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.offline; - -import static com.google.android.exoplayer2.offline.DownloadAction.TYPE_DASH; -import static com.google.android.exoplayer2.offline.DownloadAction.TYPE_HLS; -import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.fail; - -import android.net.Uri; -import android.os.Parcel; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** Unit tests for {@link DownloadAction}. */ -@RunWith(AndroidJUnit4.class) -public class DownloadActionTest { - - private Uri uri1; - private Uri uri2; - - @Before - public void setUp() { - uri1 = Uri.parse("http://test/1.uri"); - uri2 = Uri.parse("http://test/2.uri"); - } - - @Test - public void testMergeActions_withDifferentIds_fails() { - DownloadAction action1 = - new DownloadAction( - "id1", - TYPE_DASH, - uri1, - /* streamKeys= */ Collections.emptyList(), - /* customCacheKey= */ null, - /* data= */ null); - DownloadAction action2 = - new DownloadAction( - "id2", - TYPE_DASH, - uri2, - /* streamKeys= */ Collections.emptyList(), - /* customCacheKey= */ null, - /* data= */ null); - try { - action1.copyWithMergedAction(action2); - fail(); - } catch (IllegalArgumentException e) { - // Expected. - } - } - - @Test - public void testMergeActions_withDifferentTypes_fails() { - DownloadAction action1 = - new DownloadAction( - "id1", - TYPE_DASH, - uri1, - /* streamKeys= */ Collections.emptyList(), - /* customCacheKey= */ null, - /* data= */ null); - DownloadAction action2 = - new DownloadAction( - "id1", - TYPE_HLS, - uri1, - /* streamKeys= */ Collections.emptyList(), - /* customCacheKey= */ null, - /* data= */ null); - try { - action1.copyWithMergedAction(action2); - fail(); - } catch (IllegalArgumentException e) { - // Expected. - } - } - - @Test - public void testMergeAction_withSameAction() { - DownloadAction action1 = createAction(uri1, new StreamKey(0, 0, 0)); - - DownloadAction mergedAction = action1.copyWithMergedAction(action1); - assertEqual(action1, mergedAction); - } - - @Test - public void testMergeActions_withEmptyStreamKeys() { - DownloadAction action1 = createAction(uri1, new StreamKey(0, 0, 0)); - DownloadAction action2 = createAction(uri1); - - // If either of the actions have empty streamKeys, the merge should have empty streamKeys. - DownloadAction mergedAction = action1.copyWithMergedAction(action2); - assertThat(mergedAction.streamKeys).isEmpty(); - - mergedAction = action2.copyWithMergedAction(action1); - assertThat(mergedAction.streamKeys).isEmpty(); - } - - @Test - public void testMergeActions_withOverlappingStreamKeys() { - StreamKey streamKey1 = new StreamKey(0, 1, 2); - StreamKey streamKey2 = new StreamKey(3, 4, 5); - StreamKey streamKey3 = new StreamKey(6, 7, 8); - DownloadAction action1 = createAction(uri1, streamKey1, streamKey2); - DownloadAction action2 = createAction(uri1, streamKey2, streamKey3); - - // Merged streamKeys should be in their original order without duplicates. - DownloadAction mergedAction = action1.copyWithMergedAction(action2); - assertThat(mergedAction.streamKeys).containsExactly(streamKey1, streamKey2, streamKey3); - - mergedAction = action2.copyWithMergedAction(action1); - assertThat(mergedAction.streamKeys).containsExactly(streamKey2, streamKey3, streamKey1); - } - - @Test - public void testMergeActions_withDifferentFields() { - byte[] data1 = new byte[] {0, 1, 2}; - byte[] data2 = new byte[] {3, 4, 5}; - DownloadAction action1 = - new DownloadAction( - "id1", - TYPE_DASH, - uri1, - /* streamKeys= */ Collections.emptyList(), - "key1", - /* data= */ data1); - DownloadAction action2 = - new DownloadAction( - "id1", - TYPE_DASH, - uri2, - /* streamKeys= */ Collections.emptyList(), - "key2", - /* data= */ data2); - - // uri, customCacheKey and data should be from the action being merged. - DownloadAction mergedAction = action1.copyWithMergedAction(action2); - assertThat(mergedAction.uri).isEqualTo(uri2); - assertThat(mergedAction.customCacheKey).isEqualTo("key2"); - assertThat(mergedAction.data).isEqualTo(data2); - - mergedAction = action2.copyWithMergedAction(action1); - assertThat(mergedAction.uri).isEqualTo(uri1); - assertThat(mergedAction.customCacheKey).isEqualTo("key1"); - assertThat(mergedAction.data).isEqualTo(data1); - } - - @Test - public void testParcelable() { - ArrayList streamKeys = new ArrayList<>(); - streamKeys.add(new StreamKey(1, 2, 3)); - streamKeys.add(new StreamKey(4, 5, 6)); - DownloadAction actionToParcel = - new DownloadAction( - "id", - "type", - Uri.parse("https://abc.def/ghi"), - streamKeys, - "key", - new byte[] {1, 2, 3, 4, 5}); - Parcel parcel = Parcel.obtain(); - actionToParcel.writeToParcel(parcel, 0); - parcel.setDataPosition(0); - - DownloadAction actionFromParcel = DownloadAction.CREATOR.createFromParcel(parcel); - assertThat(actionFromParcel).isEqualTo(actionToParcel); - - parcel.recycle(); - } - - @SuppressWarnings("EqualsWithItself") - @Test - public void testEquals() { - DownloadAction action1 = createAction(uri1); - assertThat(action1.equals(action1)).isTrue(); - - DownloadAction action2 = createAction(uri1); - DownloadAction action3 = createAction(uri1); - assertEqual(action2, action3); - - DownloadAction action4 = createAction(uri1); - DownloadAction action5 = createAction(uri1, new StreamKey(0, 0, 0)); - assertNotEqual(action4, action5); - - DownloadAction action6 = createAction(uri1, new StreamKey(0, 1, 1)); - DownloadAction action7 = createAction(uri1, new StreamKey(0, 0, 0)); - assertNotEqual(action6, action7); - - DownloadAction action8 = createAction(uri1); - DownloadAction action9 = createAction(uri2); - assertNotEqual(action8, action9); - - DownloadAction action10 = createAction(uri1, new StreamKey(0, 0, 0), new StreamKey(0, 1, 1)); - DownloadAction action11 = createAction(uri1, new StreamKey(0, 1, 1), new StreamKey(0, 0, 0)); - assertEqual(action10, action11); - - DownloadAction action12 = createAction(uri1, new StreamKey(0, 0, 0)); - DownloadAction action13 = createAction(uri1, new StreamKey(0, 1, 1), new StreamKey(0, 0, 0)); - assertNotEqual(action12, action13); - - DownloadAction action14 = createAction(uri1); - DownloadAction action15 = createAction(uri1); - assertEqual(action14, action15); - } - - private static void assertNotEqual(DownloadAction action1, DownloadAction action2) { - assertThat(action1).isNotEqualTo(action2); - assertThat(action2).isNotEqualTo(action1); - } - - private static void assertEqual(DownloadAction action1, DownloadAction action2) { - assertThat(action1).isEqualTo(action2); - assertThat(action2).isEqualTo(action1); - } - - private static DownloadAction createAction(Uri uri, StreamKey... keys) { - return new DownloadAction( - uri.toString(), TYPE_DASH, uri, toList(keys), /* customCacheKey= */ null, /* data= */ null); - } - - private static List toList(StreamKey... keys) { - ArrayList keysList = new ArrayList<>(); - Collections.addAll(keysList, keys); - return keysList; - } -} diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadBuilder.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadBuilder.java index dbcdb52792d..2e14caa5bda 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadBuilder.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadBuilder.java @@ -47,8 +47,14 @@ class DownloadBuilder { this(id, "type", Uri.parse("uri"), /* cacheKey= */ null, new byte[0], Collections.emptyList()); } - DownloadBuilder(DownloadAction action) { - this(action.id, action.type, action.uri, action.customCacheKey, action.data, action.streamKeys); + DownloadBuilder(DownloadRequest request) { + this( + request.id, + request.type, + request.uri, + request.customCacheKey, + request.data, + request.streamKeys); } DownloadBuilder( @@ -147,8 +153,9 @@ public DownloadBuilder setCustomMetadata(byte[] customMetadata) { } public Download build() { - DownloadAction action = new DownloadAction(id, type, uri, streamKeys, cacheKey, customMetadata); + DownloadRequest request = + new DownloadRequest(id, type, uri, streamKeys, cacheKey, customMetadata); return new Download( - action, state, failureReason, manualStopReason, startTimeMs, updateTimeMs, counters); + request, state, failureReason, manualStopReason, startTimeMs, updateTimeMs, counters); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java index 737bcec1834..f06e90dc488 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java @@ -379,7 +379,7 @@ public void getTrackSelections_afterAddTextLanguagesToSelection_returnsCombinedS } @Test - public void getDownloadAction_createsDownloadAction_withAllSelectedTracks() throws Exception { + public void getDownloadRequest_createsDownloadRequest_withAllSelectedTracks() throws Exception { prepareDownloadHelper(downloadHelper); // Ensure we have track groups with multiple indices, renderers with multiple track groups and // also renderers without any track groups. @@ -392,13 +392,13 @@ public void getDownloadAction_createsDownloadAction_withAllSelectedTracks() thro byte[] data = new byte[10]; Arrays.fill(data, (byte) 123); - DownloadAction downloadAction = downloadHelper.getDownloadAction(data); + DownloadRequest downloadRequest = downloadHelper.getDownloadRequest(data); - assertThat(downloadAction.type).isEqualTo(TEST_DOWNLOAD_TYPE); - assertThat(downloadAction.uri).isEqualTo(testUri); - assertThat(downloadAction.customCacheKey).isEqualTo(TEST_CACHE_KEY); - assertThat(downloadAction.data).isEqualTo(data); - assertThat(downloadAction.streamKeys) + assertThat(downloadRequest.type).isEqualTo(TEST_DOWNLOAD_TYPE); + assertThat(downloadRequest.uri).isEqualTo(testUri); + assertThat(downloadRequest.customCacheKey).isEqualTo(TEST_CACHE_KEY); + assertThat(downloadRequest.data).isEqualTo(data); + assertThat(downloadRequest.streamKeys) .containsExactly( new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 0, /* trackIndex= */ 0), new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 0, /* trackIndex= */ 1), diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java index 0496b62fb0a..f23248952ce 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java @@ -104,29 +104,29 @@ public void downloadRunner_multipleInstancePerContent_throwsException() { } @Test - public void multipleActionsForTheSameContent_executedOnTheSameTask() { - // Two download actions on first task - new DownloadRunner(uri1).postDownloadAction().postDownloadAction(); - // One download, one remove actions on second task - new DownloadRunner(uri2).postDownloadAction().postRemoveAction(); - // Two remove actions on third task - new DownloadRunner(uri3).postRemoveAction().postRemoveAction(); + public void multipleRequestsForTheSameContent_executedOnTheSameTask() { + // Two download requests on first task + new DownloadRunner(uri1).postDownloadRequest().postDownloadRequest(); + // One download, one remove requests on second task + new DownloadRunner(uri2).postDownloadRequest().postRemoveRequest(); + // Two remove requests on third task + new DownloadRunner(uri3).postRemoveRequest().postRemoveRequest(); } @Test - public void actionsForDifferentContent_executedOnDifferentTasks() { - TaskWrapper task1 = new DownloadRunner(uri1).postDownloadAction().getTask(); - TaskWrapper task2 = new DownloadRunner(uri2).postDownloadAction().getTask(); - TaskWrapper task3 = new DownloadRunner(uri3).postRemoveAction().getTask(); + public void requestsForDifferentContent_executedOnDifferentTasks() { + TaskWrapper task1 = new DownloadRunner(uri1).postDownloadRequest().getTask(); + TaskWrapper task2 = new DownloadRunner(uri2).postDownloadRequest().getTask(); + TaskWrapper task3 = new DownloadRunner(uri3).postRemoveRequest().getTask(); assertThat(task1).isNoneOf(task2, task3); assertThat(task2).isNotEqualTo(task3); } @Test - public void postDownloadAction_downloads() throws Throwable { + public void postDownloadRequest_downloads() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); - TaskWrapper task = runner.postDownloadAction().getTask(); + TaskWrapper task = runner.postDownloadRequest().getTask(); task.assertDownloading(); runner.getDownloader(0).unblock().assertReleased().assertStartCount(1); task.assertCompleted(); @@ -135,9 +135,9 @@ public void postDownloadAction_downloads() throws Throwable { } @Test - public void postRemoveAction_removes() throws Throwable { + public void postRemoveRequest_removes() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); - TaskWrapper task = runner.postDownloadAction().postRemoveAction().getTask(); + TaskWrapper task = runner.postDownloadRequest().postRemoveRequest().getTask(); task.assertRemoving(); runner.getDownloader(1).unblock().assertReleased().assertStartCount(1); task.assertRemoved(); @@ -148,7 +148,7 @@ public void postRemoveAction_removes() throws Throwable { @Test public void downloadFails_retriesThenTaskFails() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); - runner.postDownloadAction(); + runner.postDownloadRequest(); FakeDownloader downloader = runner.getDownloader(0); for (int i = 0; i <= MIN_RETRY_COUNT; i++) { @@ -163,7 +163,7 @@ public void downloadFails_retriesThenTaskFails() throws Throwable { @Test public void downloadFails_retries() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); - runner.postDownloadAction(); + runner.postDownloadRequest(); FakeDownloader downloader = runner.getDownloader(0); for (int i = 0; i < MIN_RETRY_COUNT; i++) { @@ -179,7 +179,7 @@ public void downloadFails_retries() throws Throwable { @Test public void downloadProgressOnRetry_retryCountResets() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); - runner.postDownloadAction(); + runner.postDownloadRequest(); FakeDownloader downloader = runner.getDownloader(0); int tooManyRetries = MIN_RETRY_COUNT + 10; @@ -199,9 +199,9 @@ public void removeCancelsDownload() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); FakeDownloader downloader1 = runner.getDownloader(0); - runner.postDownloadAction(); + runner.postDownloadRequest(); downloader1.assertStarted(); - runner.postRemoveAction(); + runner.postRemoveRequest(); downloader1.assertCanceled().assertStartCount(1); runner.getDownloader(1).unblock().assertNotCanceled(); @@ -213,9 +213,9 @@ public void downloadNotCancelRemove() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); FakeDownloader downloader1 = runner.getDownloader(1); - runner.postDownloadAction().postRemoveAction(); + runner.postDownloadRequest().postRemoveRequest(); downloader1.assertStarted(); - runner.postDownloadAction(); + runner.postDownloadRequest(); downloader1.unblock().assertNotCanceled(); runner.getDownloader(2).unblock().assertNotCanceled(); @@ -223,13 +223,13 @@ public void downloadNotCancelRemove() throws Throwable { } @Test - public void secondSameRemoveActionIgnored() throws Throwable { + public void secondSameRemoveRequestIgnored() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); FakeDownloader downloader1 = runner.getDownloader(1); - runner.postDownloadAction().postRemoveAction(); + runner.postDownloadRequest().postRemoveRequest(); downloader1.assertStarted(); - runner.postRemoveAction(); + runner.postRemoveRequest(); downloader1.unblock().assertNotCanceled(); runner.getTask().assertRemoved(); @@ -238,22 +238,22 @@ public void secondSameRemoveActionIgnored() throws Throwable { } @Test - public void differentDownloadActionsMerged() throws Throwable { + public void differentDownloadRequestsMerged() throws Throwable { DownloadRunner runner = new DownloadRunner(uri1); FakeDownloader downloader1 = runner.getDownloader(0); StreamKey streamKey1 = new StreamKey(/* groupIndex= */ 0, /* trackIndex= */ 0); StreamKey streamKey2 = new StreamKey(/* groupIndex= */ 1, /* trackIndex= */ 1); - runner.postDownloadAction(streamKey1); + runner.postDownloadRequest(streamKey1); downloader1.assertStarted(); - runner.postDownloadAction(streamKey2); + runner.postDownloadRequest(streamKey2); downloader1.assertCanceled(); FakeDownloader downloader2 = runner.getDownloader(1); downloader2.assertStarted(); - assertThat(downloader2.action.streamKeys).containsExactly(streamKey1, streamKey2); + assertThat(downloader2.request.streamKeys).containsExactly(streamKey1, streamKey2); downloader2.unblock(); runner.getTask().assertCompleted(); @@ -262,9 +262,9 @@ public void differentDownloadActionsMerged() throws Throwable { } @Test - public void actionsForDifferentContent_executedInParallel() throws Throwable { - DownloadRunner runner1 = new DownloadRunner(uri1).postDownloadAction(); - DownloadRunner runner2 = new DownloadRunner(uri2).postDownloadAction(); + public void requestsForDifferentContent_executedInParallel() throws Throwable { + DownloadRunner runner1 = new DownloadRunner(uri1).postDownloadRequest(); + DownloadRunner runner2 = new DownloadRunner(uri2).postDownloadRequest(); FakeDownloader downloader1 = runner1.getDownloader(0); FakeDownloader downloader2 = runner2.getDownloader(0); @@ -279,10 +279,10 @@ public void actionsForDifferentContent_executedInParallel() throws Throwable { } @Test - public void actionsForDifferentContent_ifMaxDownloadIs1_executedSequentially() throws Throwable { + public void requestsForDifferentContent_ifMaxDownloadIs1_executedSequentially() throws Throwable { setUpDownloadManager(1); - DownloadRunner runner1 = new DownloadRunner(uri1).postDownloadAction(); - DownloadRunner runner2 = new DownloadRunner(uri2).postDownloadAction(); + DownloadRunner runner1 = new DownloadRunner(uri1).postDownloadRequest(); + DownloadRunner runner2 = new DownloadRunner(uri2).postDownloadRequest(); FakeDownloader downloader1 = runner1.getDownloader(0); FakeDownloader downloader2 = runner2.getDownloader(0); @@ -299,11 +299,11 @@ public void actionsForDifferentContent_ifMaxDownloadIs1_executedSequentially() t } @Test - public void removeActionForDifferentContent_ifMaxDownloadIs1_executedInParallel() + public void removeRequestForDifferentContent_ifMaxDownloadIs1_executedInParallel() throws Throwable { setUpDownloadManager(1); - DownloadRunner runner1 = new DownloadRunner(uri1).postDownloadAction(); - DownloadRunner runner2 = new DownloadRunner(uri2).postDownloadAction().postRemoveAction(); + DownloadRunner runner1 = new DownloadRunner(uri1).postDownloadRequest(); + DownloadRunner runner2 = new DownloadRunner(uri2).postDownloadRequest().postRemoveRequest(); FakeDownloader downloader1 = runner1.getDownloader(0); FakeDownloader downloader2 = runner2.getDownloader(0); @@ -318,11 +318,11 @@ public void removeActionForDifferentContent_ifMaxDownloadIs1_executedInParallel( } @Test - public void downloadActionFollowingRemove_ifMaxDownloadIs1_isNotStarted() throws Throwable { + public void downloadRequestFollowingRemove_ifMaxDownloadIs1_isNotStarted() throws Throwable { setUpDownloadManager(1); - DownloadRunner runner1 = new DownloadRunner(uri1).postDownloadAction(); - DownloadRunner runner2 = new DownloadRunner(uri2).postDownloadAction().postRemoveAction(); - runner2.postDownloadAction(); + DownloadRunner runner1 = new DownloadRunner(uri1).postDownloadRequest(); + DownloadRunner runner2 = new DownloadRunner(uri2).postDownloadRequest().postRemoveRequest(); + runner2.postDownloadRequest(); FakeDownloader downloader1 = runner1.getDownloader(0); FakeDownloader downloader2 = runner2.getDownloader(0); FakeDownloader downloader3 = runner2.getDownloader(1); @@ -342,9 +342,10 @@ public void downloadActionFollowingRemove_ifMaxDownloadIs1_isNotStarted() throws @Test public void getTasks_returnTasks() { - TaskWrapper task1 = new DownloadRunner(uri1).postDownloadAction().getTask(); - TaskWrapper task2 = new DownloadRunner(uri2).postDownloadAction().getTask(); - TaskWrapper task3 = new DownloadRunner(uri3).postDownloadAction().postRemoveAction().getTask(); + TaskWrapper task1 = new DownloadRunner(uri1).postDownloadRequest().getTask(); + TaskWrapper task2 = new DownloadRunner(uri2).postDownloadRequest().getTask(); + TaskWrapper task3 = + new DownloadRunner(uri3).postDownloadRequest().postRemoveRequest().getTask(); task3.assertRemoving(); List downloads = downloadManager.getCurrentDownloads(); @@ -352,7 +353,7 @@ public void getTasks_returnTasks() { assertThat(downloads).hasSize(3); String[] taskIds = {task1.taskId, task2.taskId, task3.taskId}; String[] downloadIds = { - downloads.get(0).action.id, downloads.get(1).action.id, downloads.get(2).action.id + downloads.get(0).request.id, downloads.get(1).request.id, downloads.get(2).request.id }; assertThat(downloadIds).isEqualTo(taskIds); } @@ -363,27 +364,27 @@ public void stopAndResume() throws Throwable { DownloadRunner runner2 = new DownloadRunner(uri2); DownloadRunner runner3 = new DownloadRunner(uri3); - runner1.postDownloadAction().getTask().assertDownloading(); - runner2.postDownloadAction().postRemoveAction().getTask().assertRemoving(); - runner2.postDownloadAction(); + runner1.postDownloadRequest().getTask().assertDownloading(); + runner2.postDownloadRequest().postRemoveRequest().getTask().assertRemoving(); + runner2.postDownloadRequest(); runOnMainThread(() -> downloadManager.stopDownloads()); runner1.getTask().assertStopped(); - // remove actions aren't stopped. + // remove requests aren't stopped. runner2.getDownloader(1).unblock().assertReleased(); runner2.getTask().assertStopped(); // Although remove2 is finished, download2 doesn't start. runner2.getDownloader(2).assertDoesNotStart(); - // When a new remove action is added, it cancels stopped download actions with the same media. - runner1.postRemoveAction(); + // When a new remove request is added, it cancels stopped download requests with the same media. + runner1.postRemoveRequest(); runner1.getDownloader(1).assertStarted().unblock(); runner1.getTask().assertRemoved(); - // New download actions can be added but they don't start. - runner3.postDownloadAction().getDownloader(0).assertDoesNotStart(); + // New download requests can be added but they don't start. + runner3.postDownloadRequest().getDownloader(0).assertDoesNotStart(); runOnMainThread(() -> downloadManager.startDownloads()); @@ -395,7 +396,7 @@ public void stopAndResume() throws Throwable { @Test public void manuallyStopAndResumeSingleDownload() throws Throwable { - DownloadRunner runner = new DownloadRunner(uri1).postDownloadAction(); + DownloadRunner runner = new DownloadRunner(uri1).postDownloadRequest(); TaskWrapper task = runner.getTask(); task.assertDownloading(); @@ -414,7 +415,7 @@ public void manuallyStopAndResumeSingleDownload() throws Throwable { @Test public void manuallyStoppedDownloadCanBeCancelled() throws Throwable { - DownloadRunner runner = new DownloadRunner(uri1).postDownloadAction(); + DownloadRunner runner = new DownloadRunner(uri1).postDownloadRequest(); TaskWrapper task = runner.getTask(); task.assertDownloading(); @@ -423,7 +424,7 @@ public void manuallyStoppedDownloadCanBeCancelled() throws Throwable { task.assertStopped(); - runner.postRemoveAction(); + runner.postRemoveRequest(); runner.getDownloader(1).assertStarted().unblock(); task.assertRemoved(); @@ -436,8 +437,8 @@ public void manuallyStoppedSingleDownload_doesNotAffectOthers() throws Throwable DownloadRunner runner2 = new DownloadRunner(uri2); DownloadRunner runner3 = new DownloadRunner(uri3); - runner1.postDownloadAction().getTask().assertDownloading(); - runner2.postDownloadAction().postRemoveAction().getTask().assertRemoving(); + runner1.postDownloadRequest().getTask().assertDownloading(); + runner2.postDownloadRequest().postRemoveRequest().getTask().assertRemoving(); runOnMainThread( () -> downloadManager.setManualStopReason(runner1.getTask().taskId, APP_STOP_REASON)); @@ -447,37 +448,37 @@ public void manuallyStoppedSingleDownload_doesNotAffectOthers() throws Throwable // Other downloads aren't affected. runner2.getDownloader(1).unblock().assertReleased(); - // New download actions can be added and they start. - runner3.postDownloadAction().getDownloader(0).assertStarted().unblock(); + // New download requests can be added and they start. + runner3.postDownloadRequest().getDownloader(0).assertStarted().unblock(); downloadManagerListener.blockUntilTasksCompleteAndThrowAnyDownloadError(); } @Test - public void mergeAction_removingDownload_becomesRestarting() { - DownloadAction downloadAction = createDownloadAction(); + public void mergeRequest_removingDownload_becomesRestarting() { + DownloadRequest downloadRequest = createDownloadRequest(); DownloadBuilder downloadBuilder = - new DownloadBuilder(downloadAction).setState(Download.STATE_REMOVING); + new DownloadBuilder(downloadRequest).setState(Download.STATE_REMOVING); Download download = downloadBuilder.build(); Download mergedDownload = - DownloadManager.mergeAction(download, downloadAction, download.manualStopReason); + DownloadManager.mergeRequest(download, downloadRequest, download.manualStopReason); Download expectedDownload = downloadBuilder.setState(Download.STATE_RESTARTING).build(); assertEqualIgnoringTimeFields(mergedDownload, expectedDownload); } @Test - public void mergeAction_failedDownload_becomesQueued() { - DownloadAction downloadAction = createDownloadAction(); + public void mergeRequest_failedDownload_becomesQueued() { + DownloadRequest downloadRequest = createDownloadRequest(); DownloadBuilder downloadBuilder = - new DownloadBuilder(downloadAction) + new DownloadBuilder(downloadRequest) .setState(Download.STATE_FAILED) .setFailureReason(Download.FAILURE_REASON_UNKNOWN); Download download = downloadBuilder.build(); Download mergedDownload = - DownloadManager.mergeAction(download, downloadAction, download.manualStopReason); + DownloadManager.mergeRequest(download, downloadRequest, download.manualStopReason); Download expectedDownload = downloadBuilder @@ -488,31 +489,31 @@ public void mergeAction_failedDownload_becomesQueued() { } @Test - public void mergeAction_stoppedDownload_staysStopped() { - DownloadAction downloadAction = createDownloadAction(); + public void mergeRequest_stoppedDownload_staysStopped() { + DownloadRequest downloadRequest = createDownloadRequest(); DownloadBuilder downloadBuilder = - new DownloadBuilder(downloadAction) + new DownloadBuilder(downloadRequest) .setState(Download.STATE_STOPPED) .setManualStopReason(/* manualStopReason= */ 1); Download download = downloadBuilder.build(); Download mergedDownload = - DownloadManager.mergeAction(download, downloadAction, download.manualStopReason); + DownloadManager.mergeRequest(download, downloadRequest, download.manualStopReason); assertEqualIgnoringTimeFields(mergedDownload, download); } @Test - public void mergeAction_manualStopReasonSetButNotStopped_becomesStopped() { - DownloadAction downloadAction = createDownloadAction(); + public void mergeRequest_manualStopReasonSetButNotStopped_becomesStopped() { + DownloadRequest downloadRequest = createDownloadRequest(); DownloadBuilder downloadBuilder = - new DownloadBuilder(downloadAction) + new DownloadBuilder(downloadRequest) .setState(Download.STATE_COMPLETED) .setManualStopReason(/* manualStopReason= */ 1); Download download = downloadBuilder.build(); Download mergedDownload = - DownloadManager.mergeAction(download, downloadAction, download.manualStopReason); + DownloadManager.mergeRequest(download, downloadRequest, download.manualStopReason); Download expectedDownload = downloadBuilder.setState(Download.STATE_STOPPED).build(); assertEqualIgnoringTimeFields(mergedDownload, expectedDownload); @@ -556,7 +557,7 @@ private void runOnMainThread(final TestRunnable r) { } private static void assertEqualIgnoringTimeFields(Download download, Download that) { - assertThat(download.action).isEqualTo(that.action); + assertThat(download.request).isEqualTo(that.request); assertThat(download.state).isEqualTo(that.state); assertThat(download.failureReason).isEqualTo(that.failureReason); assertThat(download.manualStopReason).isEqualTo(that.manualStopReason); @@ -565,10 +566,10 @@ private static void assertEqualIgnoringTimeFields(Download download, Download th assertThat(download.getTotalBytes()).isEqualTo(that.getTotalBytes()); } - private static DownloadAction createDownloadAction() { - return new DownloadAction( + private static DownloadRequest createDownloadRequest() { + return new DownloadRequest( "id", - DownloadAction.TYPE_DASH, + DownloadRequest.TYPE_DASH, Uri.parse("https://www.test.com/download"), Collections.emptyList(), /* customCacheKey= */ null, @@ -593,21 +594,21 @@ private DownloadRunner(Uri uri) { taskWrapper = new TaskWrapper(id); } - private DownloadRunner postRemoveAction() { + private DownloadRunner postRemoveRequest() { runOnMainThread(() -> downloadManager.removeDownload(id)); return this; } - private DownloadRunner postDownloadAction(StreamKey... keys) { - DownloadAction downloadAction = - new DownloadAction( + private DownloadRunner postDownloadRequest(StreamKey... keys) { + DownloadRequest downloadRequest = + new DownloadRequest( id, - DownloadAction.TYPE_PROGRESSIVE, + DownloadRequest.TYPE_PROGRESSIVE, uri, Arrays.asList(keys), /* customCacheKey= */ null, /* data= */ null); - runOnMainThread(() -> downloadManager.addDownload(downloadAction)); + runOnMainThread(() -> downloadManager.addDownload(downloadRequest)); return this; } @@ -624,9 +625,9 @@ private synchronized FakeDownloader getDownloader(int index) { return downloaders.get(index); } - private synchronized Downloader createDownloader(DownloadAction action) { + private synchronized Downloader createDownloader(DownloadRequest request) { downloader = getDownloader(createdDownloaderCount++); - downloader.action = action; + downloader.request = request; return downloader; } @@ -710,8 +711,8 @@ public void registerDownloadRunner(DownloadRunner downloadRunner) { } @Override - public Downloader createDownloader(DownloadAction action) { - return downloaders.get(action.uri).createDownloader(action); + public Downloader createDownloader(DownloadRequest request) { + return downloaders.get(request.uri).createDownloader(request); } } @@ -719,7 +720,7 @@ private static final class FakeDownloader implements Downloader { private final com.google.android.exoplayer2.util.ConditionVariable blocker; - private DownloadAction action; + private DownloadRequest request; private CountDownLatch started; private volatile boolean interrupted; private volatile boolean cancelled; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadRequestTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadRequestTest.java new file mode 100644 index 00000000000..d298dd58b8e --- /dev/null +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadRequestTest.java @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2018 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.offline; + +import static com.google.android.exoplayer2.offline.DownloadRequest.TYPE_DASH; +import static com.google.android.exoplayer2.offline.DownloadRequest.TYPE_HLS; +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.fail; + +import android.net.Uri; +import android.os.Parcel; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Unit tests for {@link DownloadRequest}. */ +@RunWith(AndroidJUnit4.class) +public class DownloadRequestTest { + + private Uri uri1; + private Uri uri2; + + @Before + public void setUp() { + uri1 = Uri.parse("http://test/1.uri"); + uri2 = Uri.parse("http://test/2.uri"); + } + + @Test + public void testMergeRequests_withDifferentIds_fails() { + DownloadRequest request1 = + new DownloadRequest( + "id1", + TYPE_DASH, + uri1, + /* streamKeys= */ Collections.emptyList(), + /* customCacheKey= */ null, + /* data= */ null); + DownloadRequest request2 = + new DownloadRequest( + "id2", + TYPE_DASH, + uri2, + /* streamKeys= */ Collections.emptyList(), + /* customCacheKey= */ null, + /* data= */ null); + try { + request1.copyWithMergedRequest(request2); + fail(); + } catch (IllegalArgumentException e) { + // Expected. + } + } + + @Test + public void testMergeRequests_withDifferentTypes_fails() { + DownloadRequest request1 = + new DownloadRequest( + "id1", + TYPE_DASH, + uri1, + /* streamKeys= */ Collections.emptyList(), + /* customCacheKey= */ null, + /* data= */ null); + DownloadRequest request2 = + new DownloadRequest( + "id1", + TYPE_HLS, + uri1, + /* streamKeys= */ Collections.emptyList(), + /* customCacheKey= */ null, + /* data= */ null); + try { + request1.copyWithMergedRequest(request2); + fail(); + } catch (IllegalArgumentException e) { + // Expected. + } + } + + @Test + public void testMergeRequest_withSameRequest() { + DownloadRequest request1 = createRequest(uri1, new StreamKey(0, 0, 0)); + + DownloadRequest mergedRequest = request1.copyWithMergedRequest(request1); + assertEqual(request1, mergedRequest); + } + + @Test + public void testMergeRequests_withEmptyStreamKeys() { + DownloadRequest request1 = createRequest(uri1, new StreamKey(0, 0, 0)); + DownloadRequest request2 = createRequest(uri1); + + // If either of the requests have empty streamKeys, the merge should have empty streamKeys. + DownloadRequest mergedRequest = request1.copyWithMergedRequest(request2); + assertThat(mergedRequest.streamKeys).isEmpty(); + + mergedRequest = request2.copyWithMergedRequest(request1); + assertThat(mergedRequest.streamKeys).isEmpty(); + } + + @Test + public void testMergeRequests_withOverlappingStreamKeys() { + StreamKey streamKey1 = new StreamKey(0, 1, 2); + StreamKey streamKey2 = new StreamKey(3, 4, 5); + StreamKey streamKey3 = new StreamKey(6, 7, 8); + DownloadRequest request1 = createRequest(uri1, streamKey1, streamKey2); + DownloadRequest request2 = createRequest(uri1, streamKey2, streamKey3); + + // Merged streamKeys should be in their original order without duplicates. + DownloadRequest mergedRequest = request1.copyWithMergedRequest(request2); + assertThat(mergedRequest.streamKeys).containsExactly(streamKey1, streamKey2, streamKey3); + + mergedRequest = request2.copyWithMergedRequest(request1); + assertThat(mergedRequest.streamKeys).containsExactly(streamKey2, streamKey3, streamKey1); + } + + @Test + public void testMergeRequests_withDifferentFields() { + byte[] data1 = new byte[] {0, 1, 2}; + byte[] data2 = new byte[] {3, 4, 5}; + DownloadRequest request1 = + new DownloadRequest( + "id1", + TYPE_DASH, + uri1, + /* streamKeys= */ Collections.emptyList(), + "key1", + /* data= */ data1); + DownloadRequest request2 = + new DownloadRequest( + "id1", + TYPE_DASH, + uri2, + /* streamKeys= */ Collections.emptyList(), + "key2", + /* data= */ data2); + + // uri, customCacheKey and data should be from the request being merged. + DownloadRequest mergedRequest = request1.copyWithMergedRequest(request2); + assertThat(mergedRequest.uri).isEqualTo(uri2); + assertThat(mergedRequest.customCacheKey).isEqualTo("key2"); + assertThat(mergedRequest.data).isEqualTo(data2); + + mergedRequest = request2.copyWithMergedRequest(request1); + assertThat(mergedRequest.uri).isEqualTo(uri1); + assertThat(mergedRequest.customCacheKey).isEqualTo("key1"); + assertThat(mergedRequest.data).isEqualTo(data1); + } + + @Test + public void testParcelable() { + ArrayList streamKeys = new ArrayList<>(); + streamKeys.add(new StreamKey(1, 2, 3)); + streamKeys.add(new StreamKey(4, 5, 6)); + DownloadRequest requestToParcel = + new DownloadRequest( + "id", + "type", + Uri.parse("https://abc.def/ghi"), + streamKeys, + "key", + new byte[] {1, 2, 3, 4, 5}); + Parcel parcel = Parcel.obtain(); + requestToParcel.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + DownloadRequest requestFromParcel = DownloadRequest.CREATOR.createFromParcel(parcel); + assertThat(requestFromParcel).isEqualTo(requestToParcel); + + parcel.recycle(); + } + + @SuppressWarnings("EqualsWithItself") + @Test + public void testEquals() { + DownloadRequest request1 = createRequest(uri1); + assertThat(request1.equals(request1)).isTrue(); + + DownloadRequest request2 = createRequest(uri1); + DownloadRequest request3 = createRequest(uri1); + assertEqual(request2, request3); + + DownloadRequest request4 = createRequest(uri1); + DownloadRequest request5 = createRequest(uri1, new StreamKey(0, 0, 0)); + assertNotEqual(request4, request5); + + DownloadRequest request6 = createRequest(uri1, new StreamKey(0, 1, 1)); + DownloadRequest request7 = createRequest(uri1, new StreamKey(0, 0, 0)); + assertNotEqual(request6, request7); + + DownloadRequest request8 = createRequest(uri1); + DownloadRequest request9 = createRequest(uri2); + assertNotEqual(request8, request9); + + DownloadRequest request10 = createRequest(uri1, new StreamKey(0, 0, 0), new StreamKey(0, 1, 1)); + DownloadRequest request11 = createRequest(uri1, new StreamKey(0, 1, 1), new StreamKey(0, 0, 0)); + assertEqual(request10, request11); + + DownloadRequest request12 = createRequest(uri1, new StreamKey(0, 0, 0)); + DownloadRequest request13 = createRequest(uri1, new StreamKey(0, 1, 1), new StreamKey(0, 0, 0)); + assertNotEqual(request12, request13); + + DownloadRequest request14 = createRequest(uri1); + DownloadRequest request15 = createRequest(uri1); + assertEqual(request14, request15); + } + + private static void assertNotEqual(DownloadRequest request1, DownloadRequest request2) { + assertThat(request1).isNotEqualTo(request2); + assertThat(request2).isNotEqualTo(request1); + } + + private static void assertEqual(DownloadRequest request1, DownloadRequest request2) { + assertThat(request1).isEqualTo(request2); + assertThat(request2).isEqualTo(request1); + } + + private static DownloadRequest createRequest(Uri uri, StreamKey... keys) { + return new DownloadRequest( + uri.toString(), TYPE_DASH, uri, toList(keys), /* customCacheKey= */ null, /* data= */ null); + } + + private static List toList(StreamKey... keys) { + ArrayList keysList = new ArrayList<>(); + Collections.addAll(keysList, keys); + return keysList; + } +} diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DashDownloaderTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DashDownloaderTest.java index 2b11b0affd5..9eacd28f8d4 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DashDownloaderTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DashDownloaderTest.java @@ -29,8 +29,8 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.offline.DefaultDownloaderFactory; -import com.google.android.exoplayer2.offline.DownloadAction; import com.google.android.exoplayer2.offline.DownloadException; +import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.offline.Downloader; import com.google.android.exoplayer2.offline.DownloaderConstructorHelper; import com.google.android.exoplayer2.offline.DownloaderFactory; @@ -84,9 +84,9 @@ public void testCreateWithDefaultDownloaderFactory() throws Exception { Downloader downloader = factory.createDownloader( - new DownloadAction( + new DownloadRequest( "id", - DownloadAction.TYPE_DASH, + DownloadRequest.TYPE_DASH, Uri.parse("https://www.test.com/download"), Collections.singletonList(new StreamKey(/* groupIndex= */ 0, /* trackIndex= */ 0)), /* customCacheKey= */ null, diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java index 35ca34999f0..76356cf3a85 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java @@ -28,8 +28,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.offline.DefaultDownloadIndex; import com.google.android.exoplayer2.offline.DefaultDownloaderFactory; -import com.google.android.exoplayer2.offline.DownloadAction; import com.google.android.exoplayer2.offline.DownloadManager; +import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.offline.DownloaderConstructorHelper; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.scheduler.Requirements; @@ -132,7 +132,7 @@ public void testSaveAndLoadActionFile() throws Throwable { dummyMainThread.runOnMainThread( () -> { // Setup an Action and immediately release the DM. - handleDownloadAction(fakeStreamKey1, fakeStreamKey2); + handleDownloadRequest(fakeStreamKey1, fakeStreamKey2); downloadManager.release(); }); @@ -149,29 +149,29 @@ public void testSaveAndLoadActionFile() throws Throwable { } @Test - public void testHandleDownloadAction() throws Throwable { - handleDownloadAction(fakeStreamKey1, fakeStreamKey2); + public void testHandleDownloadRequest() throws Throwable { + handleDownloadRequest(fakeStreamKey1, fakeStreamKey2); blockUntilTasksCompleteAndThrowAnyDownloadError(); assertCachedData(cache, fakeDataSet); } @Test - public void testHandleMultipleDownloadAction() throws Throwable { - handleDownloadAction(fakeStreamKey1); - handleDownloadAction(fakeStreamKey2); + public void testHandleMultipleDownloadRequest() throws Throwable { + handleDownloadRequest(fakeStreamKey1); + handleDownloadRequest(fakeStreamKey2); blockUntilTasksCompleteAndThrowAnyDownloadError(); assertCachedData(cache, fakeDataSet); } @Test - public void testHandleInterferingDownloadAction() throws Throwable { + public void testHandleInterferingDownloadRequest() throws Throwable { fakeDataSet .newData("audio_segment_2") - .appendReadAction(() -> handleDownloadAction(fakeStreamKey2)) + .appendReadAction(() -> handleDownloadRequest(fakeStreamKey2)) .appendReadData(TestUtil.buildTestData(5)) .endData(); - handleDownloadAction(fakeStreamKey1); + handleDownloadRequest(fakeStreamKey1); blockUntilTasksCompleteAndThrowAnyDownloadError(); assertCachedData(cache, fakeDataSet); @@ -179,7 +179,7 @@ public void testHandleInterferingDownloadAction() throws Throwable { @Test public void testHandleRemoveAction() throws Throwable { - handleDownloadAction(fakeStreamKey1); + handleDownloadRequest(fakeStreamKey1); blockUntilTasksCompleteAndThrowAnyDownloadError(); @@ -194,7 +194,7 @@ public void testHandleRemoveAction() throws Throwable { @Ignore @Test public void testHandleRemoveActionBeforeDownloadFinish() throws Throwable { - handleDownloadAction(fakeStreamKey1); + handleDownloadRequest(fakeStreamKey1); handleRemoveAction(); blockUntilTasksCompleteAndThrowAnyDownloadError(); @@ -213,7 +213,7 @@ public void testHandleInterferingRemoveAction() throws Throwable { .appendReadData(TestUtil.buildTestData(5)) .endData(); - handleDownloadAction(fakeStreamKey1); + handleDownloadRequest(fakeStreamKey1); assertThat(downloadInProgressCondition.block(ASSERT_TRUE_TIMEOUT)).isTrue(); @@ -228,13 +228,13 @@ private void blockUntilTasksCompleteAndThrowAnyDownloadError() throws Throwable downloadManagerListener.blockUntilTasksCompleteAndThrowAnyDownloadError(); } - private void handleDownloadAction(StreamKey... keys) { + private void handleDownloadRequest(StreamKey... keys) { ArrayList keysList = new ArrayList<>(); Collections.addAll(keysList, keys); - DownloadAction action = - new DownloadAction( + DownloadRequest action = + new DownloadRequest( TEST_ID, - DownloadAction.TYPE_DASH, + DownloadRequest.TYPE_DASH, TEST_MPD_URI, keysList, /* customCacheKey= */ null, diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java index 44befd3e2c7..a35b6d1ea46 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java @@ -30,8 +30,8 @@ import com.google.android.exoplayer2.offline.DefaultDownloadIndex; import com.google.android.exoplayer2.offline.DefaultDownloaderFactory; import com.google.android.exoplayer2.offline.Download; -import com.google.android.exoplayer2.offline.DownloadAction; import com.google.android.exoplayer2.offline.DownloadManager; +import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.offline.DownloadService; import com.google.android.exoplayer2.offline.DownloaderConstructorHelper; import com.google.android.exoplayer2.offline.StreamKey; @@ -159,7 +159,7 @@ public void tearDown() { @Ignore // b/78877092 @Test - public void testMultipleDownloadAction() throws Throwable { + public void testMultipleDownloadRequest() throws Throwable { downloadKeys(fakeStreamKey1); downloadKeys(fakeStreamKey2); @@ -208,10 +208,10 @@ private void removeAll() { private void downloadKeys(StreamKey... keys) { ArrayList keysList = new ArrayList<>(); Collections.addAll(keysList, keys); - DownloadAction action = - new DownloadAction( + DownloadRequest action = + new DownloadRequest( TEST_ID, - DownloadAction.TYPE_DASH, + DownloadRequest.TYPE_DASH, TEST_MPD_URI, keysList, /* customCacheKey= */ null, @@ -219,7 +219,7 @@ private void downloadKeys(StreamKey... keys) { dummyMainThread.runOnMainThread( () -> { Intent startIntent = - DownloadService.buildAddActionIntent( + DownloadService.buildAddRequestIntent( context, DownloadService.class, action, /* foreground= */ false); dashDownloadService.onStartCommand(startIntent, 0, 0); }); diff --git a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloaderTest.java b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloaderTest.java index b5b4e473858..b92953c3b55 100644 --- a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloaderTest.java +++ b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloaderTest.java @@ -38,7 +38,7 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.offline.DefaultDownloaderFactory; -import com.google.android.exoplayer2.offline.DownloadAction; +import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.offline.Downloader; import com.google.android.exoplayer2.offline.DownloaderConstructorHelper; import com.google.android.exoplayer2.offline.DownloaderFactory; @@ -101,9 +101,9 @@ public void testCreateWithDefaultDownloaderFactory() throws Exception { Downloader downloader = factory.createDownloader( - new DownloadAction( + new DownloadRequest( "id", - DownloadAction.TYPE_HLS, + DownloadRequest.TYPE_HLS, Uri.parse("https://www.test.com/download"), Collections.singletonList(new StreamKey(/* groupIndex= */ 0, /* trackIndex= */ 0)), /* customCacheKey= */ null, diff --git a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloaderTest.java b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloaderTest.java index b130f02bc34..5560a724c8e 100644 --- a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloaderTest.java +++ b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloaderTest.java @@ -20,7 +20,7 @@ import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.offline.DefaultDownloaderFactory; -import com.google.android.exoplayer2.offline.DownloadAction; +import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.offline.Downloader; import com.google.android.exoplayer2.offline.DownloaderConstructorHelper; import com.google.android.exoplayer2.offline.DownloaderFactory; @@ -44,9 +44,9 @@ public void createWithDefaultDownloaderFactory() throws Exception { Downloader downloader = factory.createDownloader( - new DownloadAction( + new DownloadRequest( "id", - DownloadAction.TYPE_SS, + DownloadRequest.TYPE_SS, Uri.parse("https://www.test.com/download"), Collections.singletonList(new StreamKey(/* groupIndex= */ 0, /* trackIndex= */ 0)), /* customCacheKey= */ null, diff --git a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/TestDownloadManagerListener.java b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/TestDownloadManagerListener.java index 1677243f27c..b74e539fd66 100644 --- a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/TestDownloadManagerListener.java +++ b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/TestDownloadManagerListener.java @@ -38,7 +38,7 @@ public final class TestDownloadManagerListener implements DownloadManager.Listen private final DownloadManager downloadManager; private final DummyMainThread dummyMainThread; - private final HashMap> actionStates; + private final HashMap> downloadStates; private final ConditionVariable initializedCondition; private CountDownLatch downloadFinishedCondition; @@ -48,7 +48,7 @@ public TestDownloadManagerListener( DownloadManager downloadManager, DummyMainThread dummyMainThread) { this.downloadManager = downloadManager; this.dummyMainThread = dummyMainThread; - actionStates = new HashMap<>(); + downloadStates = new HashMap<>(); initializedCondition = new ConditionVariable(); downloadManager.addListener(this); } @@ -73,12 +73,12 @@ public void onDownloadChanged(DownloadManager downloadManager, Download download if (download.state == Download.STATE_FAILED) { failureReason = download.failureReason; } - getStateQueue(download.action.id).add(download.state); + getStateQueue(download.request.id).add(download.state); } @Override public void onDownloadRemoved(DownloadManager downloadManager, Download download) { - getStateQueue(download.action.id).add(STATE_REMOVED); + getStateQueue(download.request.id).add(STATE_REMOVED); } @Override @@ -114,11 +114,11 @@ public void blockUntilTasksComplete() throws InterruptedException { } private ArrayBlockingQueue getStateQueue(String taskId) { - synchronized (actionStates) { - if (!actionStates.containsKey(taskId)) { - actionStates.put(taskId, new ArrayBlockingQueue<>(10)); + synchronized (downloadStates) { + if (!downloadStates.containsKey(taskId)) { + downloadStates.put(taskId, new ArrayBlockingQueue<>(10)); } - return actionStates.get(taskId); + return downloadStates.get(taskId); } }