@SuppressWarnings("WeakerAccess") @Synthetic final void pauseMyRequest() { Request request = getRequest(); if (request != null) { isClearedByUs = true; request.clear(); isClearedByUs = false; } }
/** Returns any stored request using {@link android.view.View#getTag()}. */ @Override @Nullable public final Request getRequest() { Object tag = getTag(); if (tag != null) { if (tag instanceof Request) { return (Request) tag; } else { throw new IllegalArgumentException("You must not pass non-R.id ids to setTag(id)"); } } return null; }
@Override public final void onLoadStarted(@Nullable Drawable placeholder) { maybeAddAttachStateListener(); onResourceLoading(placeholder); }
@Override public final void onLoadCleared(@Nullable Drawable placeholder) { sizeDeterminer.clearCallbacksAndListener(); onResourceCleared(placeholder); if (!isClearedByUs) { maybeRemoveAttachStateListener(); } }
@Test public void testDoesNotAddMultipleListenersIfMultipleCallbacksAreAdded() { SizeReadyCallback cb1 = mock(SizeReadyCallback.class); SizeReadyCallback cb2 = mock(SizeReadyCallback.class); target.getSize(cb1); target.getSize(cb2); view.getViewTreeObserver().dispatchOnPreDraw(); // assertThat(shadowObserver.getPreDrawListeners()).hasSize(1); }
@Test public void testCanSetAndRetrieveRequest() { target.setRequest(request); assertEquals(request, target.getRequest()); }
@Test public void clearOnDetach_onDetach_afterMultipleClearOnDetaches_removesListener() { activity.visible(); attachStateTarget .clearOnDetach() .clearOnDetach() .clearOnDetach(); attachStateTarget.onLoadCleared(/*placeholder=*/ null); attachStateTarget.setRequest(request); parent.removeView(view); verify(request, never()).clear(); }
@Override public void onViewDetachedFromWindow(View v) { pauseMyRequest(); } };
maybeAddAttachStateListener(); return this;
@Test public void testReturnsWrappedView() { assertEquals(view, target.getView()); }
@Test public void getSize_withWidthAndHeightEqualToPadding_doesNotCallSizeReady() { view.setLayoutParams(new FrameLayout.LayoutParams(100, 100)); view.requestLayout(); view.setPadding(50, 50, 50, 50); target.getSize(cb); verify(cb, never()).onSizeReady(anyInt(), anyInt()); }
@Test public void testRetrievesRequestFromPreviousTargetForView() { target.setRequest(request); CustomViewTarget<View, Object> second = new TestViewTarget(view); assertEquals(request, second.getRequest()); }
@Test public void clearOnDetach_moreThanOnce_registersObserverOnce() { activity.visible(); attachStateTarget.setRequest(request); attachStateTarget .clearOnDetach() .clearOnDetach(); parent.removeView(view); verify(request).clear(); }
@SuppressWarnings("WeakerAccess") @Synthetic final void resumeMyRequest() { Request request = getRequest(); if (request != null && request.isCleared()) { request.begin(); } }
@Test public void testSizeCallbackIsCalledSynchronouslyIfLayoutParamsConcreteSizeSet() { int dimens = 444; LayoutParams layoutParams = new FrameLayout.LayoutParams(dimens, dimens); view.setLayoutParams(layoutParams); view.requestLayout(); target.getSize(cb); verify(cb).onSizeReady(eq(dimens), eq(dimens)); }
@Test public void testReturnsNullFromGetRequestIfNoRequestSet() { assertNull(target.getRequest()); }
@Test public void testSizeCallbackIsCalledSynchronouslyIfViewSizeSet() { int dimens = 333; // activity.get().setContentView(view); view.layout(0, 0, dimens, dimens); target.getSize(cb); verify(cb).onSizeReady(eq(dimens), eq(dimens)); }
@Test public void testSizeCallbackIsCalledPreDrawIfNoDimensAndNoLayoutParamsButLayoutParamsSetLater() { target.getSize(cb); int width = 689; int height = 354; LayoutParams layoutParams = new FrameLayout.LayoutParams(width, height); view.setLayoutParams(layoutParams); view.requestLayout(); view.getViewTreeObserver().dispatchOnPreDraw(); verify(cb).onSizeReady(eq(width), eq(height)); }
@Test public void testDecreasesDimensionsByViewPadding() { activity.visible(); view.setLayoutParams(new FrameLayout.LayoutParams(100, 100)); view.setPadding(25, 25, 25, 25); view.requestLayout(); target.getSize(cb); verify(cb).onSizeReady(50, 50); }