@Override public boolean isSyncCallback() { return !downloadTask.isAutoCallbackToUIThread(); }
public void endTasksWithCanceled(@NonNull final Collection<DownloadTask> canceledCollection) { if (canceledCollection.size() <= 0) return; Util.d(TAG, "endTasksWithCanceled canceled[" + canceledCollection.size() + "]"); final Iterator<DownloadTask> iterator = canceledCollection.iterator(); while (iterator.hasNext()) { final DownloadTask task = iterator.next(); if (!task.isAutoCallbackToUIThread()) { task.getListener().taskEnd(task, EndCause.CANCELED, null); iterator.remove(); } } uiHandler.post(new Runnable() { @Override public void run() { for (DownloadTask task : canceledCollection) { task.getListener().taskEnd(task, EndCause.CANCELED, null); } } }); }
@Override public void run() { for (DownloadTask task : scheduleTaskList) { if (!isStarted()) { callbackQueueEndOnSerialLoop(task.isAutoCallbackToUIThread()); break; } task.execute(targetListener); } } });
public void endTasksWithError(@NonNull final Collection<DownloadTask> errorCollection, @NonNull final Exception realCause) { if (errorCollection.size() <= 0) return; Util.d(TAG, "endTasksWithError error[" + errorCollection.size() + "] realCause: " + realCause); final Iterator<DownloadTask> iterator = errorCollection.iterator(); while (iterator.hasNext()) { final DownloadTask task = iterator.next(); if (!task.isAutoCallbackToUIThread()) { task.getListener().taskEnd(task, EndCause.ERROR, realCause); iterator.remove(); } } uiHandler.post(new Runnable() { @Override public void run() { for (DownloadTask task : errorCollection) { task.getListener().taskEnd(task, EndCause.ERROR, realCause); } } }); }
@Override public void connectTrialStart(@NonNull final DownloadTask task, @NonNull final Map<String, List<String>> headerFields) { Util.d(TAG, "-----> start trial task(" + task.getId() + ") " + headerFields); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().connectTrialStart(task, headerFields); } }); } else { task.getListener().connectTrialStart(task, headerFields); } }
@Override public void connectStart(@NonNull final DownloadTask task, final int blockIndex, @NonNull final Map<String, List<String>> requestHeaderFields) { Util.d(TAG, "-----> start connection task(" + task.getId() + ") block(" + blockIndex + ") " + requestHeaderFields); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().connectStart(task, blockIndex, requestHeaderFields); } }); } else { task.getListener().connectStart(task, blockIndex, requestHeaderFields); } }
@Override public void fetchStart(@NonNull final DownloadTask task, final int blockIndex, final long contentLength) { Util.d(TAG, "fetchStart: " + task.getId()); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().fetchStart(task, blockIndex, contentLength); } }); } else { task.getListener().fetchStart(task, blockIndex, contentLength); } }
@Override public void fetchEnd(@NonNull final DownloadTask task, final int blockIndex, final long contentLength) { Util.d(TAG, "fetchEnd: " + task.getId()); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().fetchEnd(task, blockIndex, contentLength); } }); } else { task.getListener().fetchEnd(task, blockIndex, contentLength); } }
void handleComplete(@NonNull final DownloadTaskAdapter downloadTaskAdapter) { reuseOldFile = !taskConnected.get(); if (downloadTaskAdapter.getDownloadTask().isAutoCallbackToUIThread()) { EXECUTOR.execute(new Runnable() { @Override public void run() { handleBlockComplete(downloadTaskAdapter); } }); } else { try { callback.blockComplete(downloadTaskAdapter); callback.completed(downloadTaskAdapter); } catch (final Throwable throwable) { handleError(downloadTaskAdapter, new Exception(throwable)); } } }
@Override public void connectTrialEnd(@NonNull final DownloadTask task, final int responseCode, @NonNull final Map<String, List<String>> headerFields) { Util.d(TAG, "<----- finish trial task(" + task.getId() + ") code[" + responseCode + "]" + headerFields); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener() .connectTrialEnd(task, responseCode, headerFields); } }); } else { task.getListener() .connectTrialEnd(task, responseCode, headerFields); } }
@Override public void downloadFromBeginning(@NonNull final DownloadTask task, @NonNull final BreakpointInfo info, @NonNull final ResumeFailedCause cause) { Util.d(TAG, "downloadFromBeginning: " + task.getId()); inspectDownloadFromBeginning(task, info, cause); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().downloadFromBeginning(task, info, cause); } }); } else { task.getListener().downloadFromBeginning(task, info, cause); } }
@Override public void fetchProgress(@NonNull final DownloadTask task, final int blockIndex, final long increaseBytes) { if (task.getMinIntervalMillisCallbackProcess() > 0) { DownloadTask.TaskHideWrapper .setLastCallbackProcessTs(task, SystemClock.uptimeMillis()); } if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().fetchProgress(task, blockIndex, increaseBytes); } }); } else { task.getListener().fetchProgress(task, blockIndex, increaseBytes); } }
@Override public void connectEnd(@NonNull final DownloadTask task, final int blockIndex, final int responseCode, @NonNull final Map<String, List<String>> requestHeaderFields) { Util.d(TAG, "<----- finish connection task(" + task.getId() + ") block(" + blockIndex + ") code[" + responseCode + "]" + requestHeaderFields); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().connectEnd(task, blockIndex, responseCode, requestHeaderFields); } }); } else { task.getListener().connectEnd(task, blockIndex, responseCode, requestHeaderFields); } }
@Override public void downloadFromBreakpoint(@NonNull final DownloadTask task, @NonNull final BreakpointInfo info) { Util.d(TAG, "downloadFromBreakpoint: " + task.getId()); inspectDownloadFromBreakpoint(task, info); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().downloadFromBreakpoint(task, info); } }); } else { task.getListener().downloadFromBreakpoint(task, info); } }
@Override public void taskEnd(@NonNull final DownloadTask task, @NonNull final EndCause cause, @Nullable final Exception realCause) { if (cause == EndCause.ERROR) { // only care about error. Util.d(TAG, "taskEnd: " + task.getId() + " " + cause + " " + realCause); } inspectTaskEnd(task, cause, realCause); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().taskEnd(task, cause, realCause); } }); } else { task.getListener().taskEnd(task, cause, realCause); } }
@Override public void taskStart(@NonNull final DownloadTask task) { Util.d(TAG, "taskStart: " + task.getId()); inspectTaskStart(task); if (task.isAutoCallbackToUIThread()) { uiHandler.post(new Runnable() { @Override public void run() { task.getListener().taskStart(task); } }); } else { task.getListener().taskStart(task); } }
@Test public void endTasksWithError() { final Collection<DownloadTask> errorCollection = new ArrayList<>(); final Exception realCause = mock(Exception.class); final DownloadTask autoUiTask = mock(DownloadTask.class); final DownloadTask nonUiTask = mock(DownloadTask.class); final DownloadListener nonUiListener = mock(DownloadListener.class); final DownloadListener autoUiListener = mock(DownloadListener.class); when(autoUiTask.getListener()).thenReturn(autoUiListener); when(autoUiTask.isAutoCallbackToUIThread()).thenReturn(true); when(nonUiTask.getListener()).thenReturn(nonUiListener); when(nonUiTask.isAutoCallbackToUIThread()).thenReturn(false); errorCollection.add(autoUiTask); errorCollection.add(nonUiTask); dispatcher.endTasksWithError(errorCollection, realCause); verify(nonUiListener).taskEnd(eq(nonUiTask), eq(EndCause.ERROR), eq(realCause)); verify(handler).post(any(Runnable.class)); verify(autoUiListener).taskEnd(eq(autoUiTask), eq(EndCause.ERROR), eq(realCause)); }
@Test public void endTasksWithCanceled() { final Collection<DownloadTask> canceledCollection = new ArrayList<>(); final DownloadTask autoUiTask = mock(DownloadTask.class); final DownloadTask nonUiTask = mock(DownloadTask.class); final DownloadListener nonUiListener = mock(DownloadListener.class); final DownloadListener autoUiListener = mock(DownloadListener.class); when(autoUiTask.getListener()).thenReturn(autoUiListener); when(autoUiTask.isAutoCallbackToUIThread()).thenReturn(true); when(nonUiTask.getListener()).thenReturn(nonUiListener); when(nonUiTask.isAutoCallbackToUIThread()).thenReturn(false); canceledCollection.add(autoUiTask); canceledCollection.add(nonUiTask); dispatcher.endTasksWithCanceled(canceledCollection); verify(nonUiListener) .taskEnd(eq(nonUiTask), eq(EndCause.CANCELED), nullable(Exception.class)); verify(handler).post(any(Runnable.class)); verify(autoUiListener) .taskEnd(eq(autoUiTask), eq(EndCause.CANCELED), nullable(Exception.class)); }
tasks[1] = spy(new DownloadTask.Builder("url2", "path", "filename1").build()); DownloadTask task = tasks[0]; when(task.isAutoCallbackToUIThread()).thenReturn(true); task = tasks[1]; when(task.isAutoCallbackToUIThread()).thenReturn(false);
final Exception exception = mock(Exception.class); when(task.isAutoCallbackToUIThread()).thenReturn(true);