diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoApplication.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoApplication.java index 2c9cd43d1e..6985d42b36 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoApplication.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoApplication.java @@ -115,8 +115,10 @@ public class DemoApplication extends Application { private synchronized void initDownloadManager() { if (downloadManager == null) { DefaultDownloadIndex downloadIndex = new DefaultDownloadIndex(getDatabaseProvider()); - upgradeActionFile(DOWNLOAD_TRACKER_ACTION_FILE, downloadIndex); - upgradeActionFile(DOWNLOAD_ACTION_FILE, downloadIndex); + upgradeActionFile( + DOWNLOAD_ACTION_FILE, downloadIndex, /* addNewDownloadsAsCompleted= */ false); + upgradeActionFile( + DOWNLOAD_TRACKER_ACTION_FILE, downloadIndex, /* addNewDownloadsAsCompleted= */ true); DownloaderConstructorHelper downloaderConstructorHelper = new DownloaderConstructorHelper(getDownloadCache(), buildHttpDataSourceFactory()); downloadManager = @@ -127,13 +129,15 @@ public class DemoApplication extends Application { } } - private void upgradeActionFile(String fileName, DefaultDownloadIndex downloadIndex) { + private void upgradeActionFile( + String fileName, DefaultDownloadIndex downloadIndex, boolean addNewDownloadsAsCompleted) { try { ActionFileUpgradeUtil.upgradeAndDelete( new File(getDownloadDirectory(), fileName), /* downloadIdProvider= */ null, downloadIndex, - /* deleteOnFailure= */ true); + /* deleteOnFailure= */ true, + addNewDownloadsAsCompleted); } catch (IOException e) { Log.e(TAG, "Failed to upgrade action file: " + fileName, e); } 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 b601874f8d..975fc10b93 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 @@ -52,6 +52,7 @@ public final class ActionFileUpgradeUtil { * each download will be its custom cache key if one is specified, or else its URL. * @param downloadIndex The index into which the requests will be merged. * @param deleteOnFailure Whether to delete the action file if the merge fails. + * @param addNewDownloadsAsCompleted Whether to add new downloads as completed. * @throws IOException If an error occurs loading or merging the requests. */ @SuppressWarnings("deprecation") @@ -59,7 +60,8 @@ public final class ActionFileUpgradeUtil { File actionFilePath, @Nullable DownloadIdProvider downloadIdProvider, DefaultDownloadIndex downloadIndex, - boolean deleteOnFailure) + boolean deleteOnFailure, + boolean addNewDownloadsAsCompleted) throws IOException { ActionFile actionFile = new ActionFile(actionFilePath); if (actionFile.exists()) { @@ -69,7 +71,7 @@ public final class ActionFileUpgradeUtil { if (downloadIdProvider != null) { request = request.copyWithId(downloadIdProvider.getId(request)); } - mergeRequest(request, downloadIndex); + mergeRequest(request, downloadIndex, addNewDownloadsAsCompleted); } success = true; } finally { @@ -85,10 +87,14 @@ public final class ActionFileUpgradeUtil { * * @param request The request to be merged. * @param downloadIndex The index into which the request will be merged. + * @param addNewDownloadAsCompleted Whether to add new downloads as completed. * @throws IOException If an error occurs merging the request. */ /* package */ static void mergeRequest( - DownloadRequest request, DefaultDownloadIndex downloadIndex) throws IOException { + DownloadRequest request, + DefaultDownloadIndex downloadIndex, + boolean addNewDownloadAsCompleted) + throws IOException { Download download = downloadIndex.getDownload(request.id); if (download != null) { download = DownloadManager.mergeRequest(download, request, download.stopReason); @@ -97,7 +103,7 @@ public final class ActionFileUpgradeUtil { download = new Download( request, - STATE_QUEUED, + addNewDownloadAsCompleted ? Download.STATE_COMPLETED : STATE_QUEUED, /* startTimeMs= */ nowMs, /* updateTimeMs= */ nowMs, /* contentLength= */ C.LENGTH_UNSET, 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 96b8ff21bc..dba7b74e9f 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 @@ -88,7 +88,11 @@ public class ActionFileUpgradeUtilTest { new byte[] {5, 4, 3, 2, 1}); ActionFileUpgradeUtil.upgradeAndDelete( - tempFile, /* downloadIdProvider= */ null, downloadIndex, /* deleteOnFailure= */ true); + tempFile, + /* downloadIdProvider= */ null, + downloadIndex, + /* deleteOnFailure= */ true, + /* addNewDownloadsAsCompleted= */ false); assertDownloadIndexContainsRequest(expectedRequest1, Download.STATE_QUEUED); assertDownloadIndexContainsRequest(expectedRequest2, Download.STATE_QUEUED); @@ -108,7 +112,8 @@ public class ActionFileUpgradeUtilTest { /* customCacheKey= */ "key123", data); - ActionFileUpgradeUtil.mergeRequest(request, downloadIndex); + ActionFileUpgradeUtil.mergeRequest( + request, downloadIndex, /* addNewDownloadAsCompleted= */ false); assertDownloadIndexContainsRequest(request, Download.STATE_QUEUED); } @@ -135,8 +140,10 @@ public class ActionFileUpgradeUtilTest { asList(streamKey2), /* customCacheKey= */ "key123", new byte[] {5, 4, 3, 2, 1}); - ActionFileUpgradeUtil.mergeRequest(request1, downloadIndex); - ActionFileUpgradeUtil.mergeRequest(request2, downloadIndex); + ActionFileUpgradeUtil.mergeRequest( + request1, downloadIndex, /* addNewDownloadAsCompleted= */ false); + ActionFileUpgradeUtil.mergeRequest( + request2, downloadIndex, /* addNewDownloadAsCompleted= */ false); Download download = downloadIndex.getDownload(request2.id); assertThat(download).isNotNull(); @@ -148,6 +155,42 @@ public class ActionFileUpgradeUtilTest { assertThat(download.state).isEqualTo(Download.STATE_QUEUED); } + @Test + public void mergeRequest_addNewDownloadAsCompleted() throws IOException { + StreamKey streamKey1 = + new StreamKey(/* periodIndex= */ 3, /* groupIndex= */ 4, /* trackIndex= */ 5); + StreamKey streamKey2 = + new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 1, /* trackIndex= */ 2); + DownloadRequest request1 = + new DownloadRequest( + "id1", + TYPE_PROGRESSIVE, + Uri.parse("https://www.test.com/download1"), + asList(streamKey1), + /* customCacheKey= */ "key123", + new byte[] {1, 2, 3, 4}); + DownloadRequest request2 = + new DownloadRequest( + "id2", + TYPE_PROGRESSIVE, + Uri.parse("https://www.test.com/download2"), + asList(streamKey2), + /* customCacheKey= */ "key123", + new byte[] {5, 4, 3, 2, 1}); + ActionFileUpgradeUtil.mergeRequest( + request1, downloadIndex, /* addNewDownloadAsCompleted= */ false); + + // Merging existing download, keeps it queued. + ActionFileUpgradeUtil.mergeRequest( + request1, downloadIndex, /* addNewDownloadAsCompleted= */ true); + assertThat(downloadIndex.getDownload(request1.id).state).isEqualTo(Download.STATE_QUEUED); + + // New download is merged as completed. + ActionFileUpgradeUtil.mergeRequest( + request2, downloadIndex, /* addNewDownloadAsCompleted= */ true); + assertThat(downloadIndex.getDownload(request2.id).state).isEqualTo(Download.STATE_COMPLETED); + } + private void assertDownloadIndexContainsRequest(DownloadRequest request, int state) throws IOException { Download download = downloadIndex.getDownload(request.id);