/*
* 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 javax.annotation.Nullable;
import java.util.List;
import android.content.res.Resources;
import android.graphics.ColorFilter;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import com.facebook.common.internal.Lists;
import com.facebook.common.internal.Preconditions;
import static com.facebook.drawee.drawable.ScalingUtils.ScaleType;
/**
* Class to construct a {@link GenericDraweeHierarchy}.
*
* <p/> This class does not do deep copies of most of the input parameters. There should be one
* instance of the hierarchy per DraweeView, so that each hierarchy has a unique set of drawables.
*/
public class GenericDraweeHierarchyBuilder {
public static final int DEFAULT_FADE_DURATION = 300;
public static final ScaleType DEFAULT_SCALE_TYPE = ScaleType.CENTER_INSIDE;
public static final ScaleType DEFAULT_ACTUAL_IMAGE_SCALE_TYPE = ScaleType.CENTER_CROP;
private Resources mResources;
private int mFadeDuration;
private Drawable mPlaceholderImage;
private @Nullable ScaleType mPlaceholderImageScaleType;
private Drawable mRetryImage;
private ScaleType mRetryImageScaleType;
private Drawable mFailureImage;
private ScaleType mFailureImageScaleType;
private Drawable mProgressBarImage;
private ScaleType mProgressBarImageScaleType;
private ScaleType mActualImageScaleType;
private Matrix mActualImageMatrix;
private PointF mActualImageFocusPoint;
private ColorFilter mActualImageColorFilter;
private List<Drawable> mBackgrounds;
private List<Drawable> mOverlays;
private Drawable mPressedStateOverlay;
private RoundingParams mRoundingParams;
public GenericDraweeHierarchyBuilder(Resources resources) {
mResources = resources;
init();
}
public static GenericDraweeHierarchyBuilder newInstance(Resources resources) {
return new GenericDraweeHierarchyBuilder(resources);
}
/**
* Initializes this builder to its defaults.
*/
private void init() {
mFadeDuration = DEFAULT_FADE_DURATION;
mPlaceholderImage = null;
mPlaceholderImageScaleType = null;
mRetryImage = null;
mRetryImageScaleType = null;
mFailureImage = null;
mFailureImageScaleType = null;
mProgressBarImage = null;
mProgressBarImageScaleType = null;
mActualImageScaleType = DEFAULT_ACTUAL_IMAGE_SCALE_TYPE;
mActualImageMatrix = null;
mActualImageFocusPoint = null;
mBackgrounds = null;
mOverlays = null;
mPressedStateOverlay = null;
mRoundingParams = null;
mActualImageColorFilter = null;
}
/**
* Resets this builder to its initial values making it reusable.
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder reset() {
init();
return this;
}
/**
* Gets resources.
* @return
*/
public Resources getResources() {
return mResources;
}
/**
* Sets the duration of the fade animation.
* If not set, default value of 300ms will be used.
* @param fadeDuration duration in milliseconds
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setFadeDuration(int fadeDuration) {
mFadeDuration = fadeDuration;
return this;
}
public int getFadeDuration() {
return mFadeDuration;
}
/**
* Sets the placeholder image, with default scale type CENTER_INSIDE. If no placeholder is set,
* a transparent ColorDrawable will be used.
* @param placeholderDrawable drawable to be used as placeholder image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setPlaceholderImage(Drawable placeholderDrawable) {
return setPlaceholderImage(placeholderDrawable, DEFAULT_SCALE_TYPE);
}
/**
* Sets the placeholder image and scale type. If no placeholder is set, a transparent
* ColorDrawable will be used.
* @param placeholderDrawable drawable to be used as placeholder image
* @param placeholderImageScaleType scale type for the placeholder image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setPlaceholderImage(
Drawable placeholderDrawable,
@Nullable ScaleType placeholderImageScaleType) {
mPlaceholderImage = placeholderDrawable;
mPlaceholderImageScaleType = placeholderImageScaleType;
return this;
}
public Drawable getPlaceholderImage() {
return mPlaceholderImage;
}
public @Nullable ScaleType getPlaceholderImageScaleType() {
return mPlaceholderImageScaleType;
}
/**
* Sets the retry image, with default scale type CENTER_INSIDE.
* @param retryDrawable drawable to be used as retry image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setRetryImage(Drawable retryDrawable) {
return setRetryImage(retryDrawable, DEFAULT_SCALE_TYPE);
}
/**
* Sets the retry image and scale type.
* @param retryDrawable drawable to be used as retry image
* @param retryImageScaleType scale type for the retry image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setRetryImage(
Drawable retryDrawable,
ScaleType retryImageScaleType) {
mRetryImage = retryDrawable;
mRetryImageScaleType = retryImageScaleType;
return this;
}
public Drawable getRetryImage() {
return mRetryImage;
}
public ScaleType getRetryImageScaleType() {
return mRetryImageScaleType;
}
/**
* Sets the failure image, with default scale type CENTER_INSIDE.
* @param failureDrawable drawable to be used as failure image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setFailureImage(Drawable failureDrawable) {
return setFailureImage(failureDrawable, DEFAULT_SCALE_TYPE);
}
/**
* Sets the failure image, and scale type.
* @param failureDrawable drawable to be used as failure image
* @param failureImageScaleType scale type for the failure image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setFailureImage(
Drawable failureDrawable,
ScaleType failureImageScaleType) {
mFailureImage = failureDrawable;
mFailureImageScaleType = failureImageScaleType;
return this;
}
public Drawable getFailureImage() {
return mFailureImage;
}
public ScaleType getFailureImageScaleType() {
return mFailureImageScaleType;
}
/**
* Sets the progressBar image, with default scale type CENTER_INSIDE.
* @param progressBarImage drawable to be used as progressBar image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setProgressBarImage(Drawable progressBarImage) {
return setProgressBarImage(progressBarImage, DEFAULT_SCALE_TYPE);
}
/**
* Sets the progressBar image, and scale type.
* @param progressBarImage drawable to be used as progressBar image
* @param progressBarImageScaleType scale type for the progressBar image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setProgressBarImage(
Drawable progressBarImage,
ScaleType progressBarImageScaleType) {
mProgressBarImage = progressBarImage;
mProgressBarImageScaleType = progressBarImageScaleType;
return this;
}
public Drawable getProgressBarImage() {
return mProgressBarImage;
}
public ScaleType getProgressBarImageScaleType() {
return mProgressBarImageScaleType;
}
/**
* Sets the scale type, and removes the transformation matrix, for the actual image. If scale
* type is not set, and nor is a transformation matrix, then the actual image will be drawn
* with scale type CENTER_CROP.
* @param actualImageScaleType scale type for the actual image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setActualImageScaleType(ScaleType actualImageScaleType) {
mActualImageScaleType = actualImageScaleType;
mActualImageMatrix = null;
return this;
}
public ScaleType getActualImageScaleType() {
return mActualImageScaleType;
}
/**
* Sets the transformation matrix, and removes the scale type, for the actual image. If matrix
* is not set, then the image will be drawn without a matrix being applied to it.
* @param actualImageMatrix matrix for the actual image
* @return modified instance of this builder
* @deprecated this is likely not something you want
*/
@Deprecated
public GenericDraweeHierarchyBuilder setActualImageMatrix(Matrix actualImageMatrix) {
mActualImageMatrix = actualImageMatrix;
mActualImageScaleType = null;
return this;
}
public Matrix getActualImageMatrix() {
return mActualImageMatrix;
}
/**
* Sets the focus point for the actual image.
* If scale type FOCUS_CROP is used, focus point will attempted to be centered within a view.
* Each coordinate is a real number in [0,1] range, in the coordinate system where top-left
* corner of the image corresponds to (0, 0) and the bottom-right corner corresponds to (1, 1).
* @param focusPoint focus point of the image
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setActualImageFocusPoint(PointF focusPoint) {
mActualImageFocusPoint = focusPoint;
return this;
}
public PointF getActualImageFocusPoint() {
return mActualImageFocusPoint;
}
/**
* Sets the color filter.
*
* @param colorFilter color filter to be set
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setActualImageColorFilter(ColorFilter colorFilter) {
mActualImageColorFilter = colorFilter;
return this;
}
public ColorFilter getActualImageColorFilter() {
return mActualImageColorFilter;
}
/**
* Sets the backgrounds.
* Backgrounds are drawn in list order before the rest of the hierarchy and overlays. The
* first background will be drawn at the bottom.
* @param backgrounds background drawables
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setBackgrounds(List<Drawable> backgrounds) {
mBackgrounds = backgrounds;
return this;
}
/**
* Sets a single background.
* @param background background drawable
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setBackground(Drawable background) {
mBackgrounds = Lists.newArrayList(background);
return this;
}
public List<Drawable> getBackgrounds() {
return mBackgrounds;
}
/**
* Sets the overlays.
* Overlays are drawn in list order after the backgrounds and the rest of the hierarchy. The
* last overlay will be drawn at the top.
* @param overlays overlay drawables
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setOverlays(List<Drawable> overlays) {
mOverlays = overlays;
return this;
}
/**
* Sets a single overlay.
* @param overlay overlay drawable
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setOverlay(Drawable overlay) {
mOverlays = Lists.newArrayList(overlay);
return this;
}
public List<Drawable> getOverlays() {
return mOverlays;
}
/**
* Sets Overlay for pressed state
* @param drawable for pressed state
* @return
*/
public GenericDraweeHierarchyBuilder setPressedStateOverlay(Drawable drawable) {
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, drawable);
mPressedStateOverlay = stateListDrawable;
return this;
}
public Drawable getPressedStateOverlay() {
return mPressedStateOverlay;
}
/**
* Sets rounding params.
*
* @param roundingParams rounding params to be set
* @return modified instance of this builder
*/
public GenericDraweeHierarchyBuilder setRoundingParams(RoundingParams roundingParams) {
mRoundingParams = roundingParams;
return this;
}
public RoundingParams getRoundingParams() {
return mRoundingParams;
}
private void validate() {
if (mOverlays != null) {
for (Drawable overlay : mOverlays) {
Preconditions.checkNotNull(overlay);
}
}
if (mBackgrounds != null) {
for (Drawable background : mBackgrounds) {
Preconditions.checkNotNull(background);
}
}
}
public GenericDraweeHierarchy build() {
validate();
return new GenericDraweeHierarchy(this);
}
}