void attachListener(@NonNull DownloadTask task, @NonNull DownloadListener listener) { manager.attachListener(task, listener); }
private GlobalTaskManager() { manager = new UnifiedListenerManager(); }
void addAutoRemoveListenersWhenTaskEnd(int id) { manager.addAutoRemoveListenersWhenTaskEnd(id); }
/** * Attach the {@code listener} to this manager and enqueue the task if it isn't pending or * running. * * @param task the task will be enqueue if it isn't running. * @param listener the listener will be attach to this manager. */ public synchronized void attachAndEnqueueIfNotRun(@NonNull DownloadTask task, @NonNull DownloadListener listener) { attachListener(task, listener); if (!isTaskPendingOrRunning(task)) { task.enqueue(hostListener); } }
/** * Enqueues the given task sometime in the serial queue. If the {@code task} is in the head of * the serial queue, the {@code task} will be started automatically. */ public void enqueue(BaseDownloadTask task) { final DownloadTaskAdapter downloadTaskAdapter = (DownloadTaskAdapter) task; downloadTaskAdapter.assembleDownloadTask(); FileDownloadList.getImpl().addIndependentTask(downloadTaskAdapter); serialQueue.enqueue(downloadTaskAdapter.getDownloadTask()); listenerManager.addAutoRemoveListenersWhenTaskEnd(downloadTaskAdapter.getId()); listenerManager.attachListener(downloadTaskAdapter.getDownloadTask(), downloadTaskAdapter.getCompatListener()); }
@Test public void attachAndEnqueueIfNotRun() { final DownloadTask task = mockTask(1); doNothing().when(listenerManager).attachListener(eq(task), eq(listener)); doReturn(true).when(listenerManager).isTaskPendingOrRunning(eq(task)); listenerManager.attachAndEnqueueIfNotRun(task, listener); assertThat(listenerManager.realListenerMap.size()).isZero(); verify(task, never()).enqueue(eq(listenerManager.hostListener)); verify(listenerManager).attachListener(eq(task), eq(listener)); doReturn(false).when(listenerManager).isTaskPendingOrRunning(eq(task)); listenerManager.attachAndEnqueueIfNotRun(task, listener); verify(task).enqueue(eq(listenerManager.hostListener)); verify(listenerManager, times(2)).attachListener(eq(task), eq(listener)); }
@Test public void executeTaskWithUnifiedListener() { final DownloadTask task = mockTask(1); doNothing().when(listenerManager).attachListener(eq(task), eq(listener)); doNothing().when(task).execute(eq(listenerManager.hostListener)); listenerManager.executeTaskWithUnifiedListener(task, listener); verify(listenerManager).attachListener(eq(task), eq(listener)); verify(task).execute(eq(listenerManager.hostListener)); }
@Override public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause) { final DownloadListener[] listeners = getThreadSafeArray(task, realListenerMap); if (listeners == null) return; for (final DownloadListener realOne : listeners) { if (realOne == null) continue; realOne.taskEnd(task, cause, realCause); } if (autoRemoveListenerIdList.contains(task.getId())) { detachListener(task.getId()); } } };
void enqueueTask(@NonNull DownloadTask task, @NonNull DownloadListener listener) { manager.enqueueTaskWithUnifiedListener(task, listener); } }
@Test public void detachListener_taskId() { final ArrayList<DownloadListener> listenerList = new ArrayList<>(); listenerList.add(mock(DownloadListener.class)); listenerManager.realListenerMap.put(1, listenerList); listenerManager.detachListener(1); assertThat(listenerManager.realListenerMap.size()).isZero(); }
/** * Attach the {@code listener} to this manager and execute the {@code task}. * * @param task the task will be execute. * @param listener the listener will be attached to this manager. */ public synchronized void executeTaskWithUnifiedListener(@NonNull DownloadTask task, @NonNull DownloadListener listener) { attachListener(task, listener); task.execute(hostListener); }
public FileDownloadSerialQueue() { this(new DownloadSerialQueue(), new UnifiedListenerManager()); }
@Test public void addAutoRemoveListenersWhenTaskEnd() { listenerManager.addAutoRemoveListenersWhenTaskEnd(1); listenerManager.addAutoRemoveListenersWhenTaskEnd(1); assertThat(listenerManager.autoRemoveListenerIdList).containsExactly(1); }
@Test public void detachListener() { final ArrayList<DownloadListener> list = new ArrayList<>(); list.add(listener); listenerManager.realListenerMap.put(1, list); final DownloadTask task = mockTask(1); listenerManager.detachListener(task, listener); assertThat(listenerManager.realListenerMap.size()).isZero(); // detach by listener ignore host task. list.add(listener); listenerManager.realListenerMap.put(2, list); assertThat(listenerManager.realListenerMap.size()).isEqualTo(1); listenerManager.detachListener(listener); assertThat(listenerManager.realListenerMap.size()).isZero(); }
public synchronized void enqueueTaskWithUnifiedListener(@NonNull DownloadTask task, @NonNull DownloadListener listener) { attachListener(task, listener); task.enqueue(hostListener); }
@Before public void setup() { initMocks(this); listenerManager = spy(new UnifiedListenerManager()); }
@Test public void attachListener() { final DownloadTask task = mockTask(2); listenerManager.attachListener(task, listener); assertThat(listenerManager.realListenerMap.size()).isEqualTo(1); assertThat(listenerManager.realListenerMap.get(2)).containsExactly(listener); final DownloadListener1 listener1 = mock(DownloadListener1.class); listenerManager.attachListener(task, listener1); verify(listener1).setAlwaysRecoverAssistModelIfNotSet(eq(true)); }