/* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.drawee.generic; import android.annotation.TargetApi; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.StateListDrawable; import com.facebook.common.internal.Lists; import com.facebook.drawee.drawable.AndroidGraphicsTestUtils; import com.facebook.drawee.drawable.DrawableTestUtils; import com.facebook.drawee.drawable.FadeDrawable; import com.facebook.drawee.drawable.MatrixDrawable; import com.facebook.drawee.drawable.RoundedBitmapDrawable; import com.facebook.drawee.drawable.RoundedCornersDrawable; import com.facebook.drawee.drawable.ScaleTypeDrawable; import com.facebook.drawee.drawable.SettableDrawable; import com.facebook.testing.robolectric.v2.WithTestDefaultsRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static com.facebook.drawee.drawable.ScalingUtils.ScaleType; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(WithTestDefaultsRunner.class) public class GenericDraweeHierarchyTest { private final BitmapDrawable mPlaceholderImage = mock(BitmapDrawable.class); private final BitmapDrawable mFailureImage = mock(BitmapDrawable.class); private final BitmapDrawable mRetryImage = mock(BitmapDrawable.class); private final BitmapDrawable mProgressBarImage = mock(BitmapDrawable.class); private final BitmapDrawable mActualImage1 = mock(BitmapDrawable.class); private final BitmapDrawable mActualImage2 = mock(BitmapDrawable.class); private final Matrix mActualImageMatrix = mock(Matrix.class); private final PointF mFocusPoint = new PointF(0.1f, 0.4f); private final Drawable mBackground1 = mock(BitmapDrawable.class); private final Drawable mBackground2 = mock(BitmapDrawable.class); private final Drawable mOverlay1 = mock(BitmapDrawable.class); private final Drawable mOverlay2 = mock(BitmapDrawable.class); private GenericDraweeHierarchyBuilder mBuilder; @Before public void setUp() { when(mPlaceholderImage.getBounds()).thenReturn(new Rect()); when(mPlaceholderImage.getPaint()).thenReturn(new Paint()); when(mFailureImage.getBounds()).thenReturn(new Rect()); when(mFailureImage.getPaint()).thenReturn(new Paint()); when(mRetryImage.getBounds()).thenReturn(new Rect()); when(mRetryImage.getPaint()).thenReturn(new Paint()); when(mProgressBarImage.getBounds()).thenReturn(new Rect()); when(mProgressBarImage.getPaint()).thenReturn(new Paint()); when(mActualImage1.getBounds()).thenReturn(new Rect()); when(mActualImage1.getPaint()).thenReturn(new Paint()); when(mActualImage2.getBounds()).thenReturn(new Rect()); when(mActualImage2.getPaint()).thenReturn(new Paint()); mBuilder = new GenericDraweeHierarchyBuilder(null); } @Test public void testHierarchy_WithScaleType() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, ScaleType.CENTER) .setRetryImage(mRetryImage, ScaleType.FIT_CENTER) .setFailureImage(mFailureImage, ScaleType.CENTER_INSIDE) .setProgressBarImage(mProgressBarImage, ScaleType.CENTER_CROP) .setActualImageScaleType(ScaleType.FOCUS_CROP) .setActualImageFocusPoint(mFocusPoint) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(0).getClass()); ScaleTypeDrawable placeholderBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(0); assertEquals(ScaleType.CENTER, placeholderBranch.getScaleType()); assertEquals(mPlaceholderImage, placeholderBranch.getCurrent()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); ScaleTypeDrawable actualImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(1); assertEquals(ScaleType.FOCUS_CROP, actualImageBranch.getScaleType()); assertEquals(SettableDrawable.class, actualImageBranch.getCurrent().getClass()); AndroidGraphicsTestUtils.assertEquals(mFocusPoint, actualImageBranch.getFocusPoint(), 0f); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); ScaleTypeDrawable progressBarImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(2); assertEquals(ScaleType.CENTER_CROP, progressBarImageBranch.getScaleType()); assertEquals(mProgressBarImage, progressBarImageBranch.getCurrent()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(3).getClass()); ScaleTypeDrawable retryImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(3); assertEquals(ScaleType.FIT_CENTER, retryImageBranch.getScaleType()); assertEquals(mRetryImage, retryImageBranch.getCurrent()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(4).getClass()); ScaleTypeDrawable failureImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(4); assertEquals(ScaleType.CENTER_INSIDE, failureImageBranch.getScaleType()); assertEquals(mFailureImage, failureImageBranch.getCurrent()); } @Test public void testHierarchy_WithMatrix() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setRetryImage(mRetryImage, null) .setFailureImage(mFailureImage, null) .setProgressBarImage(mProgressBarImage, null) .setActualImageMatrix(mActualImageMatrix) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(0)); assertEquals(MatrixDrawable.class, fadeDrawable.getDrawable(1).getClass()); MatrixDrawable actualImageBranch = (MatrixDrawable) fadeDrawable.getDrawable(1); assertEquals(mActualImageMatrix, actualImageBranch.getMatrix()); assertEquals(SettableDrawable.class, actualImageBranch.getCurrent().getClass()); assertEquals(mProgressBarImage, fadeDrawable.getDrawable(2)); assertEquals(mRetryImage, fadeDrawable.getDrawable(3)); assertEquals(mFailureImage, fadeDrawable.getDrawable(4)); } @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(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(0)); assertEquals(SettableDrawable.class, fadeDrawable.getDrawable(1).getClass()); assertEquals(mProgressBarImage, fadeDrawable.getDrawable(2)); assertEquals(mRetryImage, fadeDrawable.getDrawable(3)); assertEquals(mFailureImage, fadeDrawable.getDrawable(4)); } @Test public void testHierarchy_NoPlaceholderImage() throws Exception { GenericDraweeHierarchy dh = mBuilder .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); // transparent color drawable will be used as placeholder assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(0).getClass()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); ScaleTypeDrawable actualImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(1); assertEquals(ScaleType.CENTER_CROP, actualImageBranch.getScaleType()); assertEquals(SettableDrawable.class, actualImageBranch.getCurrent().getClass()); } @Test public void testHierarchy_WithPlaceholderImage() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, ScaleType.CENTER) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(0).getClass()); ScaleTypeDrawable placeholderBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(0); assertEquals(ScaleType.CENTER, placeholderBranch.getScaleType()); assertEquals(mPlaceholderImage, placeholderBranch.getCurrent()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); ScaleTypeDrawable actualImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(1); assertEquals(ScaleType.CENTER_CROP, actualImageBranch.getScaleType()); assertEquals(SettableDrawable.class, actualImageBranch.getCurrent().getClass()); } @Test public void testHierarchy_WithFailureImage() throws Exception { GenericDraweeHierarchy dh = mBuilder .setFailureImage(mFailureImage, ScaleType.CENTER) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); // transparent color drawable is used as placeholder when not specified otherwise assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(0).getClass()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); ScaleTypeDrawable actualImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(1); assertEquals(ScaleType.CENTER_CROP, actualImageBranch.getScaleType()); assertEquals(SettableDrawable.class, actualImageBranch.getCurrent().getClass()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); ScaleTypeDrawable failureImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(2); assertEquals(ScaleType.CENTER, failureImageBranch.getScaleType()); assertEquals(mFailureImage, failureImageBranch.getCurrent()); } @Test public void testHierarchy_WithRetryImage() throws Exception { GenericDraweeHierarchy dh = mBuilder .setRetryImage(mRetryImage, ScaleType.CENTER) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); // transparent color drawable is used as placeholder when not specified otherwise assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(0).getClass()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); ScaleTypeDrawable actualImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(1); assertEquals(ScaleType.CENTER_CROP, actualImageBranch.getScaleType()); assertEquals(SettableDrawable.class, actualImageBranch.getCurrent().getClass()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); ScaleTypeDrawable retryImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(2); assertEquals(ScaleType.CENTER, retryImageBranch.getScaleType()); assertEquals(mRetryImage, retryImageBranch.getCurrent()); } @Test public void testHierarchy_WithProgressBarImage() throws Exception { GenericDraweeHierarchy dh = mBuilder .setProgressBarImage(mProgressBarImage, ScaleType.CENTER) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); // transparent color drawable is used as placeholder when not specified otherwise assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(0).getClass()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); ScaleTypeDrawable actualImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(1); assertEquals(ScaleType.CENTER_CROP, actualImageBranch.getScaleType()); assertEquals(SettableDrawable.class, actualImageBranch.getCurrent().getClass()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); ScaleTypeDrawable progressBarImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(2); assertEquals(ScaleType.CENTER, progressBarImageBranch.getScaleType()); assertEquals(mProgressBarImage, progressBarImageBranch.getCurrent()); } @Test public void testHierarchy_WithAllBranches() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, ScaleType.CENTER) .setRetryImage(mRetryImage, ScaleType.FIT_CENTER) .setFailureImage(mFailureImage, ScaleType.FIT_CENTER) .setProgressBarImage(mProgressBarImage, ScaleType.CENTER) .setActualImageScaleType(ScaleType.CENTER_CROP) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(6, fadeDrawable.getNumberOfLayers()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(0).getClass()); ScaleTypeDrawable placeholderBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(0); assertEquals(ScaleType.CENTER, placeholderBranch.getScaleType()); assertEquals(mPlaceholderImage, placeholderBranch.getCurrent()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); ScaleTypeDrawable imageBranch1 = (ScaleTypeDrawable) fadeDrawable.getDrawable(1); assertEquals(ScaleType.CENTER_CROP, imageBranch1.getScaleType()); assertEquals(SettableDrawable.class, imageBranch1.getCurrent().getClass()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); ScaleTypeDrawable progressBarImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(2); assertEquals(ScaleType.CENTER, progressBarImageBranch.getScaleType()); assertEquals(mProgressBarImage, progressBarImageBranch.getCurrent()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(3).getClass()); ScaleTypeDrawable retryImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(3); assertEquals(ScaleType.FIT_CENTER, retryImageBranch.getScaleType()); assertEquals(mRetryImage, retryImageBranch.getCurrent()); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(4).getClass()); ScaleTypeDrawable failureImageBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(4); assertEquals(ScaleType.FIT_CENTER, failureImageBranch.getScaleType()); assertEquals(mFailureImage, failureImageBranch.getCurrent()); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(5).getClass()); // controller overlay } @Test public void testHierarchy_WithBackgrounds() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setBackgrounds(Lists.newArrayList(mBackground1, mBackground2)) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(5, fadeDrawable.getNumberOfLayers()); assertEquals(mBackground1, fadeDrawable.getDrawable(0)); assertEquals(mBackground2, fadeDrawable.getDrawable(1)); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(2)); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(3).getClass()); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(4).getClass()); // controller overlay } @Test public void testHierarchy_WithSingleBackground() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setBackground(mBackground1) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(4, fadeDrawable.getNumberOfLayers()); assertEquals(mBackground1, fadeDrawable.getDrawable(0)); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(1)); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(3).getClass()); // controller overlay } @Test public void testHierarchy_WithOverlays() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setOverlays(Lists.newArrayList(mOverlay1, mOverlay2)) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(5, fadeDrawable.getNumberOfLayers()); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(0)); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); assertEquals(mOverlay1, fadeDrawable.getDrawable(2)); assertEquals(mOverlay2, fadeDrawable.getDrawable(3)); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(4).getClass()); // controller overlay } @Test public void testHierarchy_WithSingleOverlay() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setOverlay(mOverlay1) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(4, fadeDrawable.getNumberOfLayers()); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(0)); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(1).getClass()); assertEquals(mOverlay1, fadeDrawable.getDrawable(2)); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(3).getClass()); // controller overlay } @Test public void testHierarchy_WithBackgroundsAndOverlays() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setBackgrounds(Lists.newArrayList(mBackground1, mBackground2)) .setOverlays(Lists.newArrayList(mOverlay1, mOverlay2)) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(7, fadeDrawable.getNumberOfLayers()); assertEquals(mBackground1, fadeDrawable.getDrawable(0)); assertEquals(mBackground2, fadeDrawable.getDrawable(1)); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(2)); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(3).getClass()); assertEquals(mOverlay1, fadeDrawable.getDrawable(4)); assertEquals(mOverlay2, fadeDrawable.getDrawable(5)); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(6).getClass()); // controller overlay } @Test public void testHierarchy_WithSingleBackgroundAndOverlay() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setBackground(mBackground2) .setOverlay(mOverlay2) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(5, fadeDrawable.getNumberOfLayers()); assertEquals(mBackground2, fadeDrawable.getDrawable(0)); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(1)); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); assertEquals(mOverlay2, fadeDrawable.getDrawable(3)); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(4).getClass()); // controller overlay } @Test public void testHierarchy_WithPressedStateOverlaySetFirst() throws Exception { //Setting PressedStateOverlay before Overlays and Backgroud GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setPressedStateOverlay(mOverlay1) .setBackground(mBackground2) .setOverlay(mOverlay2) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(6, fadeDrawable.getNumberOfLayers()); assertEquals(mBackground2, fadeDrawable.getDrawable(0)); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(1)); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); assertEquals(mOverlay2, fadeDrawable.getDrawable(3)); assertEquals(StateListDrawable.class, fadeDrawable.getDrawable(4).getClass()); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(5).getClass()); // controller overlay } @Test public void testHierarchy_WithPressedStateOverlaySetLast() throws Exception { //Setting PressedStateOverlay after Overlays and Backgroud GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setBackground(mBackground2) .setOverlay(mOverlay2) .setPressedStateOverlay(mOverlay1) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertAssignableFrom(FadeDrawable.class, dh.getTopLevelDrawable().getClass()); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(6, fadeDrawable.getNumberOfLayers()); assertEquals(mBackground2, fadeDrawable.getDrawable(0)); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(1)); assertEquals(ScaleTypeDrawable.class, fadeDrawable.getDrawable(2).getClass()); assertEquals(mOverlay2, fadeDrawable.getDrawable(3)); assertEquals(StateListDrawable.class, fadeDrawable.getDrawable(4).getClass()); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(5).getClass()); // controller overlay } @Test public void testHierarchy_WithRoundedCornersDrawable() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setActualImageScaleType(null) .setRoundingParams(RoundingParams.fromCornersRadius(10).setOverlayColor(0xFFFFFFFF)) .setFadeDuration(250) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertEquals(RoundedCornersDrawable.class, dh.getTopLevelDrawable().getClass()); } @Test public void testHierarchy_WithRoundedCornersDrawableAsCircle() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setActualImageScaleType(null) .setRoundingParams(RoundingParams.asCircle().setOverlayColor(0xFFFFFFFF)) .setFadeDuration(100) .build(); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicWidth()); assertEquals(-1, dh.getTopLevelDrawable().getIntrinsicHeight()); assertEquals(RoundedCornersDrawable.class, dh.getTopLevelDrawable().getClass()); } @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 = 0; final int actualImageIndex = 1; FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(placeholderImageIndex)); assertEquals( SettableDrawable.class, fadeDrawable.getDrawable(actualImageIndex).getClass()); SettableDrawable actualImageSettableDrawable = (SettableDrawable) 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, false, 100); 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, true, 100); 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()); } @Test public void testControlling_WithAllLayers() throws Exception { GenericDraweeHierarchy dh = mBuilder .setBackgrounds(Lists.newArrayList(mBackground1, mBackground2)) .setOverlays(Lists.newArrayList(mOverlay1, mOverlay2)) .setPlaceholderImage(mPlaceholderImage, null) .setRetryImage(mRetryImage, null) .setFailureImage(mFailureImage, null) .setProgressBarImage(mProgressBarImage, null) .setActualImageScaleType(null) .setFadeDuration(250) .build(); // image indexes in DH tree final int backgroundsIndex = 0; final int numBackgrounds = 2; final int placeholderImageIndex = numBackgrounds + 0; final int actualImageIndex = numBackgrounds + 1; final int progressBarImageIndex = numBackgrounds + 2; final int retryImageIndex = numBackgrounds + 3; final int failureImageIndex = numBackgrounds + 4; final int numBranches = 5; final int overlaysIndex = numBackgrounds + numBranches; final int numOverlays = 2; FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(placeholderImageIndex)); assertEquals(mProgressBarImage, fadeDrawable.getDrawable(progressBarImageIndex)); assertEquals(mRetryImage, fadeDrawable.getDrawable(retryImageIndex)); assertEquals(mFailureImage, fadeDrawable.getDrawable(failureImageIndex)); assertEquals( SettableDrawable.class, fadeDrawable.getDrawable(actualImageIndex).getClass()); SettableDrawable finalImageSettableDrawable = (SettableDrawable) fadeDrawable.getDrawable(actualImageIndex); // initial state -> final image (immediate) // initial state, show progress bar assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); dh.setProgress(0, true); assertEquals(ColorDrawable.class, finalImageSettableDrawable.getCurrent().getClass()); assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set final image (immediate) dh.setImage(mActualImage2, true, 100); assertEquals(mActualImage2, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // initial state -> final image (non-immediate) // reset hierarchy to initial state, show progress bar dh.reset(); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); dh.setProgress(0, true); assertEquals(ColorDrawable.class, finalImageSettableDrawable.getCurrent().getClass()); assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set final image (non-immediate) dh.setImage(mActualImage2, false, 100); assertEquals(mActualImage2, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState()); assertEquals(250, fadeDrawable.getTransitionDuration()); // initial state -> temporary image (immediate) -> final image (non-immediate) // reset hierarchy to initial state, show progress bar dh.reset(); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); dh.setProgress(0, true); assertEquals(ColorDrawable.class, finalImageSettableDrawable.getCurrent().getClass()); assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set temporary image (immediate) dh.setImage(mActualImage1, true, 50); assertEquals(mActualImage1, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set final image (non-immediate) dh.setImage(mActualImage2, false, 100); assertEquals(mActualImage2, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState()); assertEquals(250, fadeDrawable.getTransitionDuration()); // initial state -> temporary image (non-immediate) -> final image (non-immediate) // reset hierarchy to initial state, show progress bar dh.reset(); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); dh.setProgress(0, true); assertEquals(ColorDrawable.class, finalImageSettableDrawable.getCurrent().getClass()); assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set temporary image (non-immediate) dh.setImage(mActualImage1, false, 50); assertEquals(mActualImage1, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState()); assertEquals(250, fadeDrawable.getTransitionDuration()); // set final image (non-immediate) dh.setImage(mActualImage2, false, 100); assertEquals(mActualImage2, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState()); assertEquals(250, fadeDrawable.getTransitionDuration()); // initial state -> temporary image (immediate) -> retry // reset hierarchy to initial state, show progress bar dh.reset(); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); dh.setProgress(0, true); assertEquals(ColorDrawable.class, finalImageSettableDrawable.getCurrent().getClass()); assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set temporary image (immediate) dh.setImage(mActualImage1, true, 50); assertEquals(mActualImage1, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set retry dh.setRetry(new RuntimeException()); assertEquals(mActualImage1, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState()); assertEquals(250, fadeDrawable.getTransitionDuration()); // initial state -> temporary image (immediate) -> failure // reset hierarchy to initial state, show progress bar dh.reset(); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); dh.setProgress(0, true); assertEquals(ColorDrawable.class, finalImageSettableDrawable.getCurrent().getClass()); assertEquals(true, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set temporary image (immediate) dh.setImage(mActualImage1, true, 50); assertEquals(mActualImage1, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set failure dh.setFailure(new RuntimeException()); assertEquals(mActualImage1, finalImageSettableDrawable.getCurrent()); assertEquals(false, fadeDrawable.isLayerOn(placeholderImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(actualImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(progressBarImageIndex)); assertEquals(false, fadeDrawable.isLayerOn(retryImageIndex)); assertEquals(true, fadeDrawable.isLayerOn(failureImageIndex)); assertLayersOn(fadeDrawable, backgroundsIndex, numBackgrounds); assertLayersOn(fadeDrawable, overlaysIndex, numOverlays); assertEquals(FadeDrawable.TRANSITION_STARTING, fadeDrawable.getTransitionState()); assertEquals(250, fadeDrawable.getTransitionDuration()); } @Test public void testControlling_WithCornerRadii() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setActualImageScaleType(null) .setRoundingParams(RoundingParams.fromCornersRadius(10)) .setFadeDuration(250) .build(); // image indexes in DH tree final int imageIndex = 1; FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); SettableDrawable settableDrawable = (SettableDrawable) fadeDrawable.getDrawable(imageIndex); // set temporary image dh.setImage(mActualImage1, true, 50); assertNotSame(mActualImage1, settableDrawable.getCurrent()); assertEquals(RoundedBitmapDrawable.class, settableDrawable.getCurrent().getClass()); assertEquals(true, fadeDrawable.isLayerOn(imageIndex)); assertEquals(FadeDrawable.TRANSITION_NONE, fadeDrawable.getTransitionState()); // set final image dh.setImage(mActualImage2, false, 100); 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()); } @Test public void testControlling_WithControllerOverlay() { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, null) .setActualImageScaleType(null) .setFadeDuration(250) .build(); Drawable controllerOverlay = DrawableTestUtils.mockDrawable(); // image indexes in DH tree final int placeholderImageIndex = 0; final int actualImageIndex = 1; final int controllerOverlayIndex = 2; FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); // initial state assertEquals(mPlaceholderImage, fadeDrawable.getDrawable(placeholderImageIndex)); assertEquals(SettableDrawable.class, fadeDrawable.getDrawable(actualImageIndex).getClass()); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(controllerOverlayIndex).getClass()); // set controller overlay dh.setControllerOverlay(controllerOverlay); assertEquals(controllerOverlay, fadeDrawable.getDrawable(controllerOverlayIndex)); // clear controller overlay dh.setControllerOverlay(null); assertEquals(ColorDrawable.class, fadeDrawable.getDrawable(controllerOverlayIndex).getClass()); } private void assertLayersOn(FadeDrawable fadeDrawable, int firstLayerIndex, int numberOfLayers) { for (int i = 0; i < numberOfLayers; i++) { assertEquals(true, fadeDrawable.isLayerOn(firstLayerIndex + i)); } } @Test @TargetApi(11) public void testSetPlaceholderImage() throws Exception { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage, ScaleType.FIT_XY) .build(); FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); ScaleTypeDrawable placeholderBranch = (ScaleTypeDrawable) fadeDrawable.getDrawable(0); assertEquals(mPlaceholderImage, placeholderBranch.getCurrent()); dh.setPlaceholderImage(null); assertTrue(placeholderBranch.getCurrent() instanceof ColorDrawable); assertEquals(Color.TRANSPARENT, ((ColorDrawable) placeholderBranch.getCurrent()).getColor()); Drawable newPlaceholder = mock(Drawable.class); dh.setPlaceholderImage(newPlaceholder); assertSame(placeholderBranch, fadeDrawable.getDrawable(0)); assertSame(newPlaceholder, placeholderBranch.getCurrent()); assertEquals(ScaleType.FIT_XY, placeholderBranch.getScaleType()); } @Test public void testSetActualImageFocusPoint() { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage) .setProgressBarImage(mProgressBarImage) .setActualImageScaleType(ScaleType.FOCUS_CROP) .build(); // image indexes in DH tree final int imageIndex = 1; FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); ScaleTypeDrawable scaleTypeDrawable = (ScaleTypeDrawable) fadeDrawable.getDrawable(imageIndex); assertNull(scaleTypeDrawable.getFocusPoint()); PointF focus1 = new PointF(0.3f, 0.4f); dh.setActualImageFocusPoint(focus1); AndroidGraphicsTestUtils.assertEquals(focus1, scaleTypeDrawable.getFocusPoint(), 0f); PointF focus2 = new PointF(0.6f, 0.7f); dh.setActualImageFocusPoint(focus2); AndroidGraphicsTestUtils.assertEquals(focus2, scaleTypeDrawable.getFocusPoint(), 0f); } @Test public void testSetActualImageScaleType() { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage) .build(); // image indexes in DH tree final int imageIndex = 1; FadeDrawable fadeDrawable = (FadeDrawable) dh.getTopLevelDrawable(); ScaleTypeDrawable scaleTypeDrawable = (ScaleTypeDrawable) fadeDrawable.getDrawable(imageIndex); ScaleType scaleType1 = ScaleType.FOCUS_CROP; dh.setActualImageScaleType(scaleType1); assertEquals(scaleType1, scaleTypeDrawable.getScaleType()); ScaleType scaleType2 = ScaleType.CENTER; dh.setActualImageScaleType(scaleType2); assertEquals(scaleType2, scaleTypeDrawable.getScaleType()); } @Test public void testSetRoundingParams_OverlayColor() { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage) .setRoundingParams(RoundingParams.asCircle().setOverlayColor(0xC0123456)) .build(); assertEquals(RoundedCornersDrawable.class, dh.getTopLevelDrawable().getClass()); assertTrue(dh.getRoundingParams().getRoundAsCircle()); assertEquals( RoundingParams.RoundingMethod.OVERLAY_COLOR, dh.getRoundingParams().getRoundingMethod()); assertEquals(0xC0123456, dh.getRoundingParams().getOverlayColor()); dh.setRoundingParams(RoundingParams.fromCornersRadius(9).setOverlayColor(0xFFFFFFFF)); assertFalse(dh.getRoundingParams().getRoundAsCircle()); assertEquals( RoundingParams.RoundingMethod.OVERLAY_COLOR, dh.getRoundingParams().getRoundingMethod()); float[] expectedRadii = new float[] {9, 9, 9, 9, 9, 9, 9, 9}; assertArrayEquals(expectedRadii, dh.getRoundingParams().getCornersRadii(), 0); assertEquals(0xFFFFFFFF, dh.getRoundingParams().getOverlayColor()); } @Test public void testSetRoundingParams_Border() { int borderColor = Color.CYAN; float borderWidth = 0.4f; RoundingParams roundingParams = RoundingParams .asCircle() .setOverlayColor(Color.GRAY) .setBorder(borderColor, borderWidth); GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage) .setRoundingParams(roundingParams) .build(); assertEquals(RoundedCornersDrawable.class, dh.getTopLevelDrawable().getClass()); assertTrue(dh.getRoundingParams().getRoundAsCircle()); assertEquals(borderColor, dh.getRoundingParams().getBorderColor()); assertEquals(borderWidth, dh.getRoundingParams().getBorderWidth(), 0); assertEquals(Color.GRAY, dh.getRoundingParams().getOverlayColor()); int borderColor2 = Color.RED; float borderWidth2 = 0.3f; roundingParams = RoundingParams .fromCornersRadius(9) .setOverlayColor(Color.RED) .setBorder(borderColor2, borderWidth2); dh.setRoundingParams(roundingParams); assertFalse(dh.getRoundingParams().getRoundAsCircle()); float[] expectedRadii = new float[] {9, 9, 9, 9, 9, 9, 9, 9}; assertArrayEquals(expectedRadii, dh.getRoundingParams().getCornersRadii(), 0); assertEquals(borderColor2, dh.getRoundingParams().getBorderColor()); assertEquals(borderWidth2, dh.getRoundingParams().getBorderWidth(), 0); assertEquals(Color.RED, dh.getRoundingParams().getOverlayColor()); } @Test public void testSetRoundingParams_BitmapOnly() { GenericDraweeHierarchy dh = mBuilder .setPlaceholderImage(mPlaceholderImage) .setRoundingParams(RoundingParams.asCircle()) .build(); assertTrue(dh.getRoundingParams().getRoundAsCircle()); assertEquals( RoundingParams.RoundingMethod.BITMAP_ONLY, dh.getRoundingParams().getRoundingMethod()); dh.setRoundingParams(RoundingParams.fromCornersRadius(9)); assertFalse(dh.getRoundingParams().getRoundAsCircle()); assertEquals( RoundingParams.RoundingMethod.BITMAP_ONLY, dh.getRoundingParams().getRoundingMethod()); float[] expectedRadii = new float[] {9, 9, 9, 9, 9, 9, 9, 9}; assertArrayEquals(expectedRadii, dh.getRoundingParams().getCornersRadii(), 0); } private <T, F> void assertAssignableFrom(Class<T> to, Class<F> from) { assertTrue(to + " is not assignable from " + from, to.isAssignableFrom(from)); } }