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 29310f8571..fcdf52a153 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 @@ -136,6 +136,11 @@ public class DownloadTracker implements DownloadManager.Listener { // DownloadManager.Listener + @Override + public void onInitialized(DownloadManager downloadManager) { + // Do nothing. + } + @Override public void onTaskStateChanged(DownloadManager downloadManager, TaskState taskState) { DownloadAction action = taskState.action; 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 6fb8307959..8be822b6ca 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 @@ -53,6 +53,12 @@ public final class DownloadManager { /** Listener for {@link DownloadManager} events. */ public interface Listener { + /** + * Called when all actions have been restored. + * + * @param downloadManager The reporting instance. + */ + void onInitialized(DownloadManager downloadManager); /** * Called when the state of a task changes. * @@ -90,7 +96,7 @@ public final class DownloadManager { private final CopyOnWriteArraySet listeners; private int nextTaskId; - private boolean actionFileLoadCompleted; + private boolean initialized; private boolean released; private boolean downloadsStopped; @@ -243,10 +249,15 @@ public final class DownloadManager { public int handleAction(DownloadAction action) { Assertions.checkState(!released); Task task = addTaskForAction(action); - if (actionFileLoadCompleted) { + if (initialized) { notifyListenersTaskStateChange(task); saveActions(); maybeStartTasks(); + if (task.currentState == STATE_QUEUED) { + // Task did not change out of its initial state, and so its initial state won't have been + // reported to listeners. Do so now. + notifyListenersTaskStateChange(task); + } } return task.id; } @@ -279,10 +290,16 @@ public final class DownloadManager { return states; } + /** Returns whether the manager has completed initialization. */ + public boolean isInitialized() { + Assertions.checkState(!released); + return initialized; + } + /** Returns whether there are no active tasks. */ public boolean isIdle() { Assertions.checkState(!released); - if (!actionFileLoadCompleted) { + if (!initialized) { return false; } for (int i = 0; i < tasks.size(); i++) { @@ -337,7 +354,7 @@ public final class DownloadManager { * If the task is a remove action then preceding conflicting tasks are canceled. */ private void maybeStartTasks() { - if (!actionFileLoadCompleted || released) { + if (!initialized || released) { return; } @@ -437,26 +454,34 @@ public final class DownloadManager { new Runnable() { @Override public void run() { - actionFileLoadCompleted = true; if (released) { return; } List pendingTasks = new ArrayList<>(tasks); tasks.clear(); for (DownloadAction action : actions) { - Task task = addTaskForAction(action); - notifyListenersTaskStateChange(task); + addTaskForAction(action); + } + logd("Tasks are created."); + initialized = true; + for (Listener listener : listeners) { + listener.onInitialized(DownloadManager.this); } if (!pendingTasks.isEmpty()) { for (int i = 0; i < pendingTasks.size(); i++) { - Task pendingTask = pendingTasks.get(i); - tasks.add(pendingTask); - notifyListenersTaskStateChange(pendingTask); + tasks.add(pendingTasks.get(i)); } saveActions(); } - logd("Tasks are created."); maybeStartTasks(); + for (int i = 0; i < pendingTasks.size(); i++) { + Task pendingTask = pendingTasks.get(i); + if (pendingTask.currentState == STATE_QUEUED) { + // Task did not change out of its initial state, and so its initial state + // won't have been reported to listeners. Do so now. + notifyListenersTaskStateChange(pendingTask); + } + } } }); } 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 ff0c21e080..40a50c53a6 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 @@ -313,6 +313,11 @@ public abstract class DownloadService extends Service { } private final class DownloadManagerListener implements DownloadManager.Listener { + @Override + public void onInitialized(DownloadManager downloadManager) { + // Do nothing. + } + @Override public void onTaskStateChanged(DownloadManager downloadManager, TaskState taskState) { DownloadService.this.onTaskStateChanged(taskState); 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 7e843ae983..b624c49350 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 @@ -51,6 +51,11 @@ public final class TestDownloadManagerListener implements DownloadManager.Listen this.downloadError = null; } + @Override + public void onInitialized(DownloadManager downloadManager) { + // Do nothing. + } + @Override public void onTaskStateChanged( DownloadManager downloadManager, DownloadManager.TaskState taskState) {