@Test public void waitsForAnotherLayoutIfWidthOrHeightIsZero() { ImageView target = mockFitImageViewTarget(true); when(target.getWidth()).thenReturn(0); when(target.getHeight()).thenReturn(0); RequestCreator creator = mock(RequestCreator.class); DeferredRequestCreator request = new DeferredRequestCreator(creator, target, null); request.onPreDraw(); verify(target.getViewTreeObserver(), never()).removeOnPreDrawListener(request); verifyZeroInteractions(creator); }
/** * Cancel any existing requests with given tag. You can set a tag * on new requests with {@link RequestCreator#tag(Object)}. * * @see RequestCreator#tag(Object) */ public void cancelTag(@NonNull Object tag) { checkMain(); checkNotNull(tag, "tag == null"); List<Action> actions = new ArrayList<>(targetToAction.values()); //noinspection ForLoopReplaceableByForEach for (int i = 0, n = actions.size(); i < n; i++) { Action action = actions.get(i); if (tag.equals(action.getTag())) { cancelExistingRequest(action.getTarget()); } } List<DeferredRequestCreator> deferredRequestCreators = new ArrayList<>(targetToDeferredRequestCreator.values()); //noinspection ForLoopReplaceableByForEach for (int i = 0, n = deferredRequestCreators.size(); i < n; i++) { DeferredRequestCreator deferredRequestCreator = deferredRequestCreators.get(i); if (tag.equals(deferredRequestCreator.getTag())) { deferredRequestCreator.cancel(); } } }
DeferredRequestCreator(RequestCreator creator, ImageView target, @Nullable Callback callback) { this.creator = creator; this.target = target; this.callback = callback; target.addOnAttachStateChangeListener(this); // Only add the pre-draw listener if the view is already attached. // See: https://github.com/square/picasso/issues/1321 if (target.getWindowToken() != null) { onViewAttachedToWindow(target); } }
@Test public void cancelWhileAttachedRemovesAttachListener() { ImageView target = mockFitImageViewTarget(true); DeferredRequestCreator request = new DeferredRequestCreator(mock(RequestCreator.class), target, null); verify(target).addOnAttachStateChangeListener(request); request.cancel(); verify(target).removeOnAttachStateChangeListener(request); }
@Test public void initWhileDetachedAddsAttachListenerWhichDefersPreDrawListener() { ImageView target = mockFitImageViewTarget(true); when(target.getWindowToken()).thenReturn(null); ViewTreeObserver observer = target.getViewTreeObserver(); DeferredRequestCreator request = new DeferredRequestCreator(mock(RequestCreator.class), target, null); verify(target).addOnAttachStateChangeListener(request); verifyNoMoreInteractions(observer); // Attach and ensure we defer to the pre-draw listener. request.onViewAttachedToWindow(target); verify(observer).addOnPreDrawListener(request); // Detach and ensure we remove the pre-draw listener from the original VTO. request.onViewDetachedFromWindow(target); verify(observer).removeOnPreDrawListener(request); }
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) void cancelAll() { checkMain(); List<Action> actions = new ArrayList<>(targetToAction.values()); //noinspection ForLoopReplaceableByForEach for (int i = 0, n = actions.size(); i < n; i++) { Action action = actions.get(i); cancelExistingRequest(action.getTarget()); } List<DeferredRequestCreator> deferredRequestCreators = new ArrayList<>(targetToDeferredRequestCreator.values()); //noinspection ForLoopReplaceableByForEach for (int i = 0, n = deferredRequestCreators.size(); i < n; i++) { DeferredRequestCreator deferredRequestCreator = deferredRequestCreators.get(i); deferredRequestCreator.cancel(); } }
@Test public void initWhileAttachedAddsAttachAndPreDrawListener() { ImageView target = mockFitImageViewTarget(true); ViewTreeObserver observer = target.getViewTreeObserver(); DeferredRequestCreator request = new DeferredRequestCreator(mock(RequestCreator.class), target, null); verify(observer).addOnPreDrawListener(request); }
@OnLifecycleEvent(Lifecycle.Event.ON_STOP) void pauseAll() { checkMain(); List<Action> actions = new ArrayList<>(targetToAction.values()); //noinspection ForLoopReplaceableByForEach for (int i = 0, n = actions.size(); i < n; i++) { Action action = actions.get(i); dispatcher.dispatchPauseTag(action.getTag()); } List<DeferredRequestCreator> deferredRequestCreators = new ArrayList<>(targetToDeferredRequestCreator.values()); //noinspection ForLoopReplaceableByForEach for (int i = 0, n = deferredRequestCreators.size(); i < n; i++) { DeferredRequestCreator deferredRequestCreator = deferredRequestCreators.get(i); Object tag = deferredRequestCreator.getTag(); if (tag != null) { dispatcher.dispatchPauseTag(tag); } } }
@Test public void cancelClearsTag() { ImageView target = mockFitImageViewTarget(true); RequestCreator creator = mock(RequestCreator.class); when(creator.getTag()).thenReturn("TAG"); DeferredRequestCreator request = new DeferredRequestCreator(creator, target, null); request.cancel(); verify(creator).clearTag(); }
void cancelExistingRequest(Object target) { checkMain(); Action action = targetToAction.remove(target); if (action != null) { action.cancel(); dispatcher.dispatchCancel(action); } if (target instanceof ImageView) { ImageView targetImageView = (ImageView) target; DeferredRequestCreator deferredRequestCreator = targetToDeferredRequestCreator.remove(targetImageView); if (deferredRequestCreator != null) { deferredRequestCreator.cancel(); } } }
setPlaceholder(target, getPlaceholderDrawable()); picasso.defer(target, new DeferredRequestCreator(this, target, callback)); return;
@OnLifecycleEvent(Lifecycle.Event.ON_START) void resumeAll() { checkMain(); List<Action> actions = new ArrayList<>(targetToAction.values()); //noinspection ForLoopReplaceableByForEach for (int i = 0, n = actions.size(); i < n; i++) { Action action = actions.get(i); dispatcher.dispatchResumeTag(action.getTag()); } List<DeferredRequestCreator> deferredRequestCreators = new ArrayList<>(targetToDeferredRequestCreator.values()); //noinspection ForLoopReplaceableByForEach for (int i = 0, n = deferredRequestCreators.size(); i < n; i++) { DeferredRequestCreator deferredRequestCreator = deferredRequestCreators.get(i); Object tag = deferredRequestCreator.getTag(); if (tag != null) { dispatcher.dispatchResumeTag(tag); } } }
@Test public void cancelSkipsIfViewTreeObserverIsDead() { ImageView target = mockFitImageViewTarget(false); RequestCreator creator = mock(RequestCreator.class); DeferredRequestCreator request = new DeferredRequestCreator(creator, target, null); request.cancel(); verify(target.getViewTreeObserver(), never()).removeOnPreDrawListener(request); }
@Test public void cancelTagAllDeferredRequests() { ImageView target = mockImageViewTarget(); DeferredRequestCreator deferredRequestCreator = mockDeferredRequestCreator(); when(deferredRequestCreator.getTag()).thenReturn("TAG"); picasso.defer(target, deferredRequestCreator); picasso.cancelTag("TAG"); verify(deferredRequestCreator).cancel(); }
@Test public void onLayoutSkipsIfViewIsAttachedAndViewTreeObserverIsDead() { ImageView target = mockFitImageViewTarget(false); RequestCreator creator = mock(RequestCreator.class); DeferredRequestCreator request = new DeferredRequestCreator(creator, target, null); ViewTreeObserver viewTreeObserver = target.getViewTreeObserver(); request.onPreDraw(); verify(viewTreeObserver).addOnPreDrawListener(request); verify(viewTreeObserver).isAlive(); verifyNoMoreInteractions(viewTreeObserver); verifyZeroInteractions(creator); }
/** Stops this instance from accepting further requests. */ public void shutdown() { if (shutdown) { return; } cache.clear(); stats.shutdown(); dispatcher.shutdown(); if (closeableCache != null) { try { closeableCache.close(); } catch (IOException ignored) { } } for (DeferredRequestCreator deferredRequestCreator : targetToDeferredRequestCreator.values()) { deferredRequestCreator.cancel(); } targetToDeferredRequestCreator.clear(); shutdown = true; }
@Test public void cancelClearsCallback() { ImageView target = mockFitImageViewTarget(true); Callback callback = mockCallback(); DeferredRequestCreator request = new DeferredRequestCreator(mock(RequestCreator.class), target, callback); assertThat(request.callback).isNotNull(); request.cancel(); assertThat(request.callback).isNull(); }
@Test public void preDrawSubmitsRequestAndCleansUp() { Picasso picasso = mock(Picasso.class); when(picasso.transformRequest(any(Request.class))).thenAnswer(TRANSFORM_REQUEST_ANSWER); RequestCreator creator = new RequestCreator(picasso, URI_1, 0); ImageView target = mockFitImageViewTarget(true); when(target.getWidth()).thenReturn(100); when(target.getHeight()).thenReturn(100); ViewTreeObserver observer = target.getViewTreeObserver(); DeferredRequestCreator request = new DeferredRequestCreator(creator, target, null); request.onPreDraw(); verify(observer).removeOnPreDrawListener(request); verify(picasso).enqueueAndSubmit(actionCaptor.capture()); Action value = actionCaptor.getValue(); assertThat(value).isInstanceOf(ImageViewAction.class); assertThat(value.request.targetWidth).isEqualTo(100); assertThat(value.request.targetHeight).isEqualTo(100); } }
@Test public void shutdownClearsDeferredRequests() { DeferredRequestCreator deferredRequestCreator = mockDeferredRequestCreator(); ImageView target = mockImageViewTarget(); picasso.targetToDeferredRequestCreator.put(target, deferredRequestCreator); picasso.shutdown(); verify(deferredRequestCreator).cancel(); assertThat(picasso.targetToDeferredRequestCreator).isEmpty(); }
@Test public void cancelExistingRequestWithDeferredImageViewTarget() { ImageView target = mockImageViewTarget(); DeferredRequestCreator deferredRequestCreator = mockDeferredRequestCreator(); picasso.targetToDeferredRequestCreator.put(target, deferredRequestCreator); picasso.cancelRequest(target); verify(deferredRequestCreator).cancel(); assertThat(picasso.targetToDeferredRequestCreator).isEmpty(); }