Java 类com.facebook.drawee.drawable.ForwardingDrawable 实例源码

项目:GitHub    文件:WrappingUtils.java   
/**
 * Applies rounding on the drawable's leaf.
 *
 * <p> Currently only {@link BitmapDrawable} or {@link ColorDrawable} leafs can be rounded.
 * <p> If the leaf cannot be rounded, or the rounding params do not specify BITMAP_ONLY mode,
 * the given drawable is returned without being rounded.
 * <p> If the given drawable is a leaf itself, and it can be rounded, then the rounded drawable
 * is returned.
 * <p> If the given drawable is not a leaf, and its leaf can be rounded, the leaf gets rounded,
 * and the original drawable is returned.
 *
 * @return the rounded drawable, or the original drawable if the rounding didn't take place
 * or it took place on a drawable's child
 */
static Drawable maybeApplyLeafRounding(
    @Nullable Drawable drawable,
    @Nullable RoundingParams roundingParams,
    Resources resources) {
  if (drawable == null || roundingParams == null ||
      roundingParams.getRoundingMethod() != RoundingParams.RoundingMethod.BITMAP_ONLY) {
    return drawable;
  }
  if (drawable instanceof ForwardingDrawable) {
    DrawableParent parent = findDrawableParentForLeaf((ForwardingDrawable) drawable);
    Drawable child = parent.setDrawable(sEmptyDrawable);
    child = applyLeafRounding(child, roundingParams, resources);
    parent.setDrawable(child);
    return drawable;
  } else {
    return applyLeafRounding(drawable, roundingParams, resources);
  }
}
项目:GitHub    文件:GenericDraweeHierarchyTest.java   
@Before
public void setUp() {
  mBuilder = new GenericDraweeHierarchyBuilder(null);

  mBackground = DrawableTestUtils.mockDrawable();
  mOverlay1 = DrawableTestUtils.mockDrawable();
  mOverlay2 = DrawableTestUtils.mockDrawable();
  mPlaceholderImage = DrawableTestUtils.mockBitmapDrawable();
  mFailureImage = DrawableTestUtils.mockBitmapDrawable();
  mRetryImage = DrawableTestUtils.mockBitmapDrawable();
  mProgressBarImage = DrawableTestUtils.mockBitmapDrawable();
  mActualImage1 = DrawableTestUtils.mockBitmapDrawable();
  mActualImage2 = DrawableTestUtils.mockBitmapDrawable();
  mWrappedLeaf = new ColorDrawable(Color.BLUE);
  mWrappedImage = new ForwardingDrawable(new ForwardingDrawable(mWrappedLeaf));
  mFocusPoint = new PointF(0.1f, 0.4f);
}
项目:GitHub    文件:GenericDraweeHierarchyTest.java   
@Test
public void testHierarchy_NoScaleTypeNorMatrix() throws Exception {
  GenericDraweeHierarchy dh = mBuilder
      .setPlaceholderImage(mPlaceholderImage, null)
      .setRetryImage(mRetryImage, null)
      .setFailureImage(mFailureImage, null)
      .setProgressBarImage(mProgressBarImage, null)
      .setActualImageScaleType(null)
      .build();
  RootDrawable rootDrawable = (RootDrawable) dh.getTopLevelDrawable();
  FadeDrawable fadeDrawable = (FadeDrawable) rootDrawable.getCurrent();
  assertEquals(7, fadeDrawable.getNumberOfLayers());
  assertNull(fadeDrawable.getDrawable(0));
  assertSame(mPlaceholderImage, fadeDrawable.getDrawable(1));
  assertSame(ForwardingDrawable.class, fadeDrawable.getDrawable(2).getClass());
  assertSame(mProgressBarImage, fadeDrawable.getDrawable(3));
  assertSame(mRetryImage, fadeDrawable.getDrawable(4));
  assertSame(mFailureImage, fadeDrawable.getDrawable(5));
  assertNull(fadeDrawable.getDrawable(6));
  verifyCallback(rootDrawable, mPlaceholderImage);
}
项目:fresco    文件:WrappingUtils.java   
/**
 * Applies rounding on the drawable's leaf.
 *
 * <p> Currently only {@link BitmapDrawable} or {@link ColorDrawable} leafs can be rounded.
 * <p> If the leaf cannot be rounded, or the rounding params do not specify BITMAP_ONLY mode,
 * the given drawable is returned without being rounded.
 * <p> If the given drawable is a leaf itself, and it can be rounded, then the rounded drawable
 * is returned.
 * <p> If the given drawable is not a leaf, and its leaf can be rounded, the leaf gets rounded,
 * and the original drawable is returned.
 *
 * @return the rounded drawable, or the original drawable if the rounding didn't take place
 * or it took place on a drawable's child
 */
static Drawable maybeApplyLeafRounding(
    @Nullable Drawable drawable,
    @Nullable RoundingParams roundingParams,
    Resources resources) {
  if (drawable == null || roundingParams == null ||
      roundingParams.getRoundingMethod() != RoundingParams.RoundingMethod.BITMAP_ONLY) {
    return drawable;
  }
  if (drawable instanceof ForwardingDrawable) {
    DrawableParent parent = findDrawableParentForLeaf((ForwardingDrawable) drawable);
    Drawable child = parent.setDrawable(sEmptyDrawable);
    child = applyLeafRounding(child, roundingParams, resources);
    parent.setDrawable(child);
    return drawable;
  } else {
    return applyLeafRounding(drawable, roundingParams, resources);
  }
}
项目:fresco    文件:GenericDraweeHierarchyTest.java   
@Before
public void setUp() {
  mBuilder = new GenericDraweeHierarchyBuilder(null);

  mBackground = DrawableTestUtils.mockDrawable();
  mOverlay1 = DrawableTestUtils.mockDrawable();
  mOverlay2 = DrawableTestUtils.mockDrawable();
  mPlaceholderImage = DrawableTestUtils.mockBitmapDrawable();
  mFailureImage = DrawableTestUtils.mockBitmapDrawable();
  mRetryImage = DrawableTestUtils.mockBitmapDrawable();
  mProgressBarImage = DrawableTestUtils.mockBitmapDrawable();
  mActualImage1 = DrawableTestUtils.mockBitmapDrawable();
  mActualImage2 = DrawableTestUtils.mockBitmapDrawable();
  mWrappedLeaf = new ColorDrawable(Color.BLUE);
  mWrappedImage = new ForwardingDrawable(new ForwardingDrawable(mWrappedLeaf));
  mFocusPoint = new PointF(0.1f, 0.4f);
}
项目:fresco    文件:GenericDraweeHierarchyTest.java   
@Test
public void testHierarchy_NoScaleTypeNorMatrix() throws Exception {
  GenericDraweeHierarchy dh = mBuilder
      .setPlaceholderImage(mPlaceholderImage, null)
      .setRetryImage(mRetryImage, null)
      .setFailureImage(mFailureImage, null)
      .setProgressBarImage(mProgressBarImage, null)
      .setActualImageScaleType(null)
      .build();
  RootDrawable rootDrawable = (RootDrawable) dh.getTopLevelDrawable();
  FadeDrawable fadeDrawable = (FadeDrawable) rootDrawable.getCurrent();
  assertEquals(7, fadeDrawable.getNumberOfLayers());
  assertNull(fadeDrawable.getDrawable(0));
  assertSame(mPlaceholderImage, fadeDrawable.getDrawable(1));
  assertSame(ForwardingDrawable.class, fadeDrawable.getDrawable(2).getClass());
  assertSame(mProgressBarImage, fadeDrawable.getDrawable(3));
  assertSame(mRetryImage, fadeDrawable.getDrawable(4));
  assertSame(mFailureImage, fadeDrawable.getDrawable(5));
  assertNull(fadeDrawable.getDrawable(6));
  verifyCallback(rootDrawable, mPlaceholderImage);
}
项目:S1-Go    文件:ImageLoader.java   
public static Drawable applyRoundingBitmapOnly(
        @Nullable RoundingParams roundingParams,
        Resources resources,
        Drawable drawable) {
    if (roundingParams == null ||
            roundingParams.getRoundingMethod() != RoundingParams.RoundingMethod.BITMAP_ONLY) {
        return drawable;
    }

    if (drawable instanceof BitmapDrawable || drawable instanceof ColorDrawable) {
        return applyRounding(roundingParams, resources, drawable);
    } else {
        Drawable parent = drawable;
        Drawable child = parent.getCurrent();
        while (child != null && parent != child) {
            if (parent instanceof ForwardingDrawable &&
                    (child instanceof BitmapDrawable || child instanceof ColorDrawable)) {
                ((ForwardingDrawable) parent).setCurrent(
                        applyRounding(roundingParams, resources, child));
            }
            parent = child;
            child = parent.getCurrent();
        }
    }
    return drawable;
}
项目:GitHub    文件:GenericDraweeHierarchyTest.java   
@Test
public void testControlling_WithCornerRadii() throws Exception {
  GenericDraweeHierarchy dh = mBuilder
      .setPlaceholderImage(mPlaceholderImage, null)
      .setActualImageScaleType(null)
      .setRoundingParams(RoundingParams.fromCornersRadius(10))
      .setFadeDuration(250)
      .build();

  // actual image index in DH tree
  final int imageIndex = 2;

  FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable().getCurrent();
  ForwardingDrawable settableDrawable = (ForwardingDrawable) fadeDrawable.getDrawable(imageIndex);

  // set temporary image
  dh.setImage(mActualImage1, 0.5f, true);
  assertNotSame(mActualImage1, settableDrawable.getCurrent());
  assertEquals(RoundedBitmapDrawable.class, settableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(imageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  verifyCallback(dh.getTopLevelDrawable(), settableDrawable.getCurrent());

  // set final image
  dh.setImage(mActualImage2, 1f, false);
  assertNotSame(mActualImage2, settableDrawable.getCurrent());
  assertEquals(RoundedBitmapDrawable.class, settableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(imageIndex));
  assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState());
  assertEquals(250, fadeDrawable.getTransitionDuration());
  verifyCallback(dh.getTopLevelDrawable(), settableDrawable.getCurrent());
}
项目:GitHub    文件:GenericDraweeHierarchyTest.java   
private void assertActualImageScaleType(
    ScaleType expectedScaleType,
    PointF expectedFocusPoint,
    Drawable actualBranch) {
  assertNotNull(actualBranch);
  ScaleTypeDrawable scaleTypeDrawable = (ScaleTypeDrawable) actualBranch;
  assertSame(expectedScaleType, scaleTypeDrawable.getScaleType());
  assertSame(ForwardingDrawable.class, scaleTypeDrawable.getCurrent().getClass());
  AndroidGraphicsTestUtils.assertEquals(expectedFocusPoint, scaleTypeDrawable.getFocusPoint(), 0);
}
项目:drawee-text-view    文件:DraweeSpan.java   
/**
 * Use {@link Builder} to build a DraweeSpan.
 */
private DraweeSpan(String uri, int verticalAlignment, Drawable placeHolder, boolean showAnim) {
    super(verticalAlignment);
    mImageUri = uri;
    mShouldShowAnim = showAnim;
    mDeferredReleaser = DeferredReleaser.getInstance();
    mPlaceHolder = placeHolder;
    // create forwarding drawable with placeholder
    mActualDrawable = new ForwardingDrawable(mPlaceHolder);
}
项目:fresco    文件:GenericDraweeHierarchyTest.java   
@Test
public void testControlling_WithCornerRadii() throws Exception {
  GenericDraweeHierarchy dh = mBuilder
      .setPlaceholderImage(mPlaceholderImage, null)
      .setActualImageScaleType(null)
      .setRoundingParams(RoundingParams.fromCornersRadius(10))
      .setFadeDuration(250)
      .build();

  // actual image index in DH tree
  final int imageIndex = 2;

  FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable().getCurrent();
  ForwardingDrawable settableDrawable = (ForwardingDrawable) fadeDrawable.getDrawable(imageIndex);

  // set temporary image
  dh.setImage(mActualImage1, 0.5f, true);
  assertNotSame(mActualImage1, settableDrawable.getCurrent());
  assertEquals(RoundedBitmapDrawable.class, settableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(imageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  verifyCallback(dh.getTopLevelDrawable(), settableDrawable.getCurrent());

  // set final image
  dh.setImage(mActualImage2, 1f, false);
  assertNotSame(mActualImage2, settableDrawable.getCurrent());
  assertEquals(RoundedBitmapDrawable.class, settableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(imageIndex));
  assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState());
  assertEquals(250, fadeDrawable.getTransitionDuration());
  verifyCallback(dh.getTopLevelDrawable(), settableDrawable.getCurrent());
}
项目:fresco    文件:GenericDraweeHierarchyTest.java   
private void assertActualImageScaleType(
    ScaleType expectedScaleType,
    PointF expectedFocusPoint,
    Drawable actualBranch) {
  assertNotNull(actualBranch);
  ScaleTypeDrawable scaleTypeDrawable = (ScaleTypeDrawable) actualBranch;
  assertSame(expectedScaleType, scaleTypeDrawable.getScaleType());
  assertSame(ForwardingDrawable.class, scaleTypeDrawable.getCurrent().getClass());
  AndroidGraphicsTestUtils.assertEquals(expectedFocusPoint, scaleTypeDrawable.getFocusPoint(), 0);
}
项目:GitHub    文件:GenericDraweeHierarchy.java   
GenericDraweeHierarchy(GenericDraweeHierarchyBuilder builder) {
  mResources = builder.getResources();
  mRoundingParams = builder.getRoundingParams();

  mActualImageWrapper = new ForwardingDrawable(mEmptyActualImageDrawable);

  int numOverlays = (builder.getOverlays() != null) ? builder.getOverlays().size() : 1;
  numOverlays += (builder.getPressedStateOverlay() != null) ? 1 : 0;

  // layer indices and count
  int numLayers = OVERLAY_IMAGES_INDEX + numOverlays;

  // array of layers
  Drawable[] layers = new Drawable[numLayers];
  layers[BACKGROUND_IMAGE_INDEX] = buildBranch(builder.getBackground(), null);
  layers[PLACEHOLDER_IMAGE_INDEX] = buildBranch(
      builder.getPlaceholderImage(),
      builder.getPlaceholderImageScaleType());
  layers[ACTUAL_IMAGE_INDEX] = buildActualImageBranch(
      mActualImageWrapper,
      builder.getActualImageScaleType(),
      builder.getActualImageFocusPoint(),
      builder.getActualImageColorFilter());
  layers[PROGRESS_BAR_IMAGE_INDEX] = buildBranch(
      builder.getProgressBarImage(),
      builder.getProgressBarImageScaleType());
  layers[RETRY_IMAGE_INDEX] = buildBranch(
      builder.getRetryImage(),
      builder.getRetryImageScaleType());
  layers[FAILURE_IMAGE_INDEX] = buildBranch(
      builder.getFailureImage(),
      builder.getFailureImageScaleType());
  if (numOverlays > 0) {
    int index = 0;
    if (builder.getOverlays() != null) {
      for (Drawable overlay : builder.getOverlays()) {
        layers[OVERLAY_IMAGES_INDEX + index++] = buildBranch(overlay, null);
      }
    } else {
      index = 1; // reserve space for one overlay
    }
    if (builder.getPressedStateOverlay() != null) {
      layers[OVERLAY_IMAGES_INDEX + index] = buildBranch(builder.getPressedStateOverlay(), null);
    }
  }

  // fade drawable composed of layers
  mFadeDrawable = new FadeDrawable(layers);
  mFadeDrawable.setTransitionDuration(builder.getFadeDuration());

  // rounded corners drawable (optional)
  Drawable maybeRoundedDrawable =
      WrappingUtils.maybeWrapWithRoundedOverlayColor(mFadeDrawable, mRoundingParams);

  // top-level drawable
  mTopLevelDrawable = new RootDrawable(maybeRoundedDrawable);
  mTopLevelDrawable.mutate();

  resetFade();
}
项目:GitHub    文件:GenericDraweeHierarchyTest.java   
@Test
public void testControlling_WithPlaceholderOnly() throws Exception {
  GenericDraweeHierarchy dh = mBuilder
      .setPlaceholderImage(mPlaceholderImage, null)
      .setActualImageScaleType(null)
      .setFadeDuration(250)
      .build();

  // image indexes in DH tree
  final int placeholderImageIndex = 1;
  final int actualImageIndex = 2;

  FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable().getCurrent();

  assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(placeholderImageIndex));
  assertEquals(
      ForwardingDrawable.class,
      fadeDrawable.getDrawable(actualImageIndex).getClass());

  ForwardingDrawable actualImageSettableDrawable =
      (ForwardingDrawable) fadeDrawable.getDrawable(actualImageIndex);

  // initial state -> final image (non-immediate)
  // initial state
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  // set final image (non-immediate)
  dh.setImage(mActualImage1, 1f, false);
  assertEquals(mActualImage1, actualImageSettableDrawable.getCurrent());
  assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState());
  assertEquals(250, fadeDrawable.getTransitionDuration());

  // initial state -> final image (immediate)
  // reset hierarchy to initial state
  dh.reset();
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  // set final image (immediate)
  dh.setImage(mActualImage2, 1f, true);
  assertEquals(mActualImage2, actualImageSettableDrawable.getCurrent());
  assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());

  // initial state -> retry
  // reset hierarchy to initial state
  dh.reset();
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  // set retry
  dh.setRetry(new RuntimeException());
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState());
  assertEquals(250, fadeDrawable.getTransitionDuration());

  // initial state -> failure
  // reset hierarchy to initial state
  dh.reset();
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  // set failure
  dh.setFailure(new RuntimeException());
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState());
  assertEquals(250, fadeDrawable.getTransitionDuration());
}
项目:drawee-text-view    文件:DraweeTextView.java   
@Override
protected boolean verifyDrawable(Drawable who) {
    return super.verifyDrawable(who) || mHasDraweeInText
            // only schedule animation on AnimatableDrawable
            && (who instanceof ForwardingDrawable && who.getCurrent() instanceof Animatable);
}
项目:fresco    文件:GenericDraweeHierarchy.java   
GenericDraweeHierarchy(GenericDraweeHierarchyBuilder builder) {
  mResources = builder.getResources();
  mRoundingParams = builder.getRoundingParams();

  mActualImageWrapper = new ForwardingDrawable(mEmptyActualImageDrawable);

  int numOverlays = (builder.getOverlays() != null) ? builder.getOverlays().size() : 1;
  numOverlays += (builder.getPressedStateOverlay() != null) ? 1 : 0;

  // layer indices and count
  int numLayers = OVERLAY_IMAGES_INDEX + numOverlays;

  // array of layers
  Drawable[] layers = new Drawable[numLayers];
  layers[BACKGROUND_IMAGE_INDEX] = buildBranch(builder.getBackground(), null);
  layers[PLACEHOLDER_IMAGE_INDEX] = buildBranch(
      builder.getPlaceholderImage(),
      builder.getPlaceholderImageScaleType());
  layers[ACTUAL_IMAGE_INDEX] = buildActualImageBranch(
      mActualImageWrapper,
      builder.getActualImageScaleType(),
      builder.getActualImageFocusPoint(),
      builder.getActualImageColorFilter());
  layers[PROGRESS_BAR_IMAGE_INDEX] = buildBranch(
      builder.getProgressBarImage(),
      builder.getProgressBarImageScaleType());
  layers[RETRY_IMAGE_INDEX] = buildBranch(
      builder.getRetryImage(),
      builder.getRetryImageScaleType());
  layers[FAILURE_IMAGE_INDEX] = buildBranch(
      builder.getFailureImage(),
      builder.getFailureImageScaleType());
  if (numOverlays > 0) {
    int index = 0;
    if (builder.getOverlays() != null) {
      for (Drawable overlay : builder.getOverlays()) {
        layers[OVERLAY_IMAGES_INDEX + index++] = buildBranch(overlay, null);
      }
    } else {
      index = 1; // reserve space for one overlay
    }
    if (builder.getPressedStateOverlay() != null) {
      layers[OVERLAY_IMAGES_INDEX + index] = buildBranch(builder.getPressedStateOverlay(), null);
    }
  }

  // fade drawable composed of layers
  mFadeDrawable = new FadeDrawable(layers);
  mFadeDrawable.setTransitionDuration(builder.getFadeDuration());

  // rounded corners drawable (optional)
  Drawable maybeRoundedDrawable =
      WrappingUtils.maybeWrapWithRoundedOverlayColor(mFadeDrawable, mRoundingParams);

  // top-level drawable
  mTopLevelDrawable = new RootDrawable(maybeRoundedDrawable);
  mTopLevelDrawable.mutate();

  resetFade();
}
项目:fresco    文件:GenericDraweeHierarchyTest.java   
@Test
public void testControlling_WithPlaceholderOnly() throws Exception {
  GenericDraweeHierarchy dh = mBuilder
      .setPlaceholderImage(mPlaceholderImage, null)
      .setActualImageScaleType(null)
      .setFadeDuration(250)
      .build();

  // image indexes in DH tree
  final int placeholderImageIndex = 1;
  final int actualImageIndex = 2;

  FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable().getCurrent();

  assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(placeholderImageIndex));
  assertEquals(
      ForwardingDrawable.class,
      fadeDrawable.getDrawable(actualImageIndex).getClass());

  ForwardingDrawable actualImageSettableDrawable =
      (ForwardingDrawable) fadeDrawable.getDrawable(actualImageIndex);

  // initial state -> final image (non-immediate)
  // initial state
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  // set final image (non-immediate)
  dh.setImage(mActualImage1, 1f, false);
  assertEquals(mActualImage1, actualImageSettableDrawable.getCurrent());
  assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState());
  assertEquals(250, fadeDrawable.getTransitionDuration());

  // initial state -> final image (immediate)
  // reset hierarchy to initial state
  dh.reset();
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  // set final image (immediate)
  dh.setImage(mActualImage2, 1f, true);
  assertEquals(mActualImage2, actualImageSettableDrawable.getCurrent());
  assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());

  // initial state -> retry
  // reset hierarchy to initial state
  dh.reset();
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  // set retry
  dh.setRetry(new RuntimeException());
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState());
  assertEquals(250, fadeDrawable.getTransitionDuration());

  // initial state -> failure
  // reset hierarchy to initial state
  dh.reset();
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState());
  // set failure
  dh.setFailure(new RuntimeException());
  assertEquals(ColorDrawable.class, actualImageSettableDrawable.getCurrent().getClass());
  assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex));
  assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex));
  assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState());
  assertEquals(250, fadeDrawable.getTransitionDuration());
}