Add option to add entries in an ActionFile to DownloadIndex as completed

PiperOrigin-RevId: 244864742
This commit is contained in:
eguven 2019-04-23 17:09:05 +01:00 committed by Oliver Woodman
parent 06586b75b0
commit 03313fb5e2
3 changed files with 65 additions and 12 deletions

View File

@ -115,8 +115,10 @@ public class DemoApplication extends Application {
private synchronized void initDownloadManager() { private synchronized void initDownloadManager() {
if (downloadManager == null) { if (downloadManager == null) {
DefaultDownloadIndex downloadIndex = new DefaultDownloadIndex(getDatabaseProvider()); DefaultDownloadIndex downloadIndex = new DefaultDownloadIndex(getDatabaseProvider());
upgradeActionFile(DOWNLOAD_TRACKER_ACTION_FILE, downloadIndex); upgradeActionFile(
upgradeActionFile(DOWNLOAD_ACTION_FILE, downloadIndex); DOWNLOAD_ACTION_FILE, downloadIndex, /* addNewDownloadsAsCompleted= */ false);
upgradeActionFile(
DOWNLOAD_TRACKER_ACTION_FILE, downloadIndex, /* addNewDownloadsAsCompleted= */ true);
DownloaderConstructorHelper downloaderConstructorHelper = DownloaderConstructorHelper downloaderConstructorHelper =
new DownloaderConstructorHelper(getDownloadCache(), buildHttpDataSourceFactory()); new DownloaderConstructorHelper(getDownloadCache(), buildHttpDataSourceFactory());
downloadManager = 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 { try {
ActionFileUpgradeUtil.upgradeAndDelete( ActionFileUpgradeUtil.upgradeAndDelete(
new File(getDownloadDirectory(), fileName), new File(getDownloadDirectory(), fileName),
/* downloadIdProvider= */ null, /* downloadIdProvider= */ null,
downloadIndex, downloadIndex,
/* deleteOnFailure= */ true); /* deleteOnFailure= */ true,
addNewDownloadsAsCompleted);
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "Failed to upgrade action file: " + fileName, e); Log.e(TAG, "Failed to upgrade action file: " + fileName, e);
} }

View File

@ -52,6 +52,7 @@ public final class ActionFileUpgradeUtil {
* each download will be its custom cache key if one is specified, or else its URL. * 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 downloadIndex The index into which the requests will be merged.
* @param deleteOnFailure Whether to delete the action file if the merge fails. * @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. * @throws IOException If an error occurs loading or merging the requests.
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -59,7 +60,8 @@ public final class ActionFileUpgradeUtil {
File actionFilePath, File actionFilePath,
@Nullable DownloadIdProvider downloadIdProvider, @Nullable DownloadIdProvider downloadIdProvider,
DefaultDownloadIndex downloadIndex, DefaultDownloadIndex downloadIndex,
boolean deleteOnFailure) boolean deleteOnFailure,
boolean addNewDownloadsAsCompleted)
throws IOException { throws IOException {
ActionFile actionFile = new ActionFile(actionFilePath); ActionFile actionFile = new ActionFile(actionFilePath);
if (actionFile.exists()) { if (actionFile.exists()) {
@ -69,7 +71,7 @@ public final class ActionFileUpgradeUtil {
if (downloadIdProvider != null) { if (downloadIdProvider != null) {
request = request.copyWithId(downloadIdProvider.getId(request)); request = request.copyWithId(downloadIdProvider.getId(request));
} }
mergeRequest(request, downloadIndex); mergeRequest(request, downloadIndex, addNewDownloadsAsCompleted);
} }
success = true; success = true;
} finally { } finally {
@ -85,10 +87,14 @@ public final class ActionFileUpgradeUtil {
* *
* @param request The request to be merged. * @param request The request to be merged.
* @param downloadIndex The index into which the request will 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. * @throws IOException If an error occurs merging the request.
*/ */
/* package */ static void mergeRequest( /* package */ static void mergeRequest(
DownloadRequest request, DefaultDownloadIndex downloadIndex) throws IOException { DownloadRequest request,
DefaultDownloadIndex downloadIndex,
boolean addNewDownloadAsCompleted)
throws IOException {
Download download = downloadIndex.getDownload(request.id); Download download = downloadIndex.getDownload(request.id);
if (download != null) { if (download != null) {
download = DownloadManager.mergeRequest(download, request, download.stopReason); download = DownloadManager.mergeRequest(download, request, download.stopReason);
@ -97,7 +103,7 @@ public final class ActionFileUpgradeUtil {
download = download =
new Download( new Download(
request, request,
STATE_QUEUED, addNewDownloadAsCompleted ? Download.STATE_COMPLETED : STATE_QUEUED,
/* startTimeMs= */ nowMs, /* startTimeMs= */ nowMs,
/* updateTimeMs= */ nowMs, /* updateTimeMs= */ nowMs,
/* contentLength= */ C.LENGTH_UNSET, /* contentLength= */ C.LENGTH_UNSET,

View File

@ -88,7 +88,11 @@ public class ActionFileUpgradeUtilTest {
new byte[] {5, 4, 3, 2, 1}); new byte[] {5, 4, 3, 2, 1});
ActionFileUpgradeUtil.upgradeAndDelete( ActionFileUpgradeUtil.upgradeAndDelete(
tempFile, /* downloadIdProvider= */ null, downloadIndex, /* deleteOnFailure= */ true); tempFile,
/* downloadIdProvider= */ null,
downloadIndex,
/* deleteOnFailure= */ true,
/* addNewDownloadsAsCompleted= */ false);
assertDownloadIndexContainsRequest(expectedRequest1, Download.STATE_QUEUED); assertDownloadIndexContainsRequest(expectedRequest1, Download.STATE_QUEUED);
assertDownloadIndexContainsRequest(expectedRequest2, Download.STATE_QUEUED); assertDownloadIndexContainsRequest(expectedRequest2, Download.STATE_QUEUED);
@ -108,7 +112,8 @@ public class ActionFileUpgradeUtilTest {
/* customCacheKey= */ "key123", /* customCacheKey= */ "key123",
data); data);
ActionFileUpgradeUtil.mergeRequest(request, downloadIndex); ActionFileUpgradeUtil.mergeRequest(
request, downloadIndex, /* addNewDownloadAsCompleted= */ false);
assertDownloadIndexContainsRequest(request, Download.STATE_QUEUED); assertDownloadIndexContainsRequest(request, Download.STATE_QUEUED);
} }
@ -135,8 +140,10 @@ public class ActionFileUpgradeUtilTest {
asList(streamKey2), asList(streamKey2),
/* customCacheKey= */ "key123", /* customCacheKey= */ "key123",
new byte[] {5, 4, 3, 2, 1}); new byte[] {5, 4, 3, 2, 1});
ActionFileUpgradeUtil.mergeRequest(request1, downloadIndex); ActionFileUpgradeUtil.mergeRequest(
ActionFileUpgradeUtil.mergeRequest(request2, downloadIndex); request1, downloadIndex, /* addNewDownloadAsCompleted= */ false);
ActionFileUpgradeUtil.mergeRequest(
request2, downloadIndex, /* addNewDownloadAsCompleted= */ false);
Download download = downloadIndex.getDownload(request2.id); Download download = downloadIndex.getDownload(request2.id);
assertThat(download).isNotNull(); assertThat(download).isNotNull();
@ -148,6 +155,42 @@ public class ActionFileUpgradeUtilTest {
assertThat(download.state).isEqualTo(Download.STATE_QUEUED); 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) private void assertDownloadIndexContainsRequest(DownloadRequest request, int state)
throws IOException { throws IOException {
Download download = downloadIndex.getDownload(request.id); Download download = downloadIndex.getDownload(request.id);