1db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddpackage com.bumptech.glide.request.target;
2db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
3db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddimport android.widget.ImageView;
4db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
5db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddimport com.bumptech.glide.load.resource.drawable.GlideDrawable;
6db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddimport com.bumptech.glide.request.animation.GlideAnimation;
7db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
8db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd/**
9db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * A {@link com.bumptech.glide.request.target.Target} that can display an {@link android.graphics.drawable.Drawable} in
10db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * an {@link android.widget.ImageView}.
11db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd */
12db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddpublic class GlideDrawableImageViewTarget extends ImageViewTarget<GlideDrawable> {
13db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    private static final float SQUARE_RATIO_MARGIN = 0.05f;
14db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    private int maxLoopCount;
15db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    private GlideDrawable resource;
16db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
17db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    /**
18db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * Constructor for an {@link com.bumptech.glide.request.target.Target} that can display an
19db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * {@link com.bumptech.glide.load.resource.drawable.GlideDrawable} in an {@link android.widget.ImageView}.
20db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     *
21db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * @param view The view to display the drawable in.
22db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     */
23db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    public GlideDrawableImageViewTarget(ImageView view) {
24db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        this(view, GlideDrawable.LOOP_FOREVER);
25db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    }
26db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
27db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    /**
28db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * Constructor for an {@link com.bumptech.glide.request.target.Target} that can display an
29db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * {@link com.bumptech.glide.load.resource.drawable.GlideDrawable} in an {@link android.widget.ImageView}.
30db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     *
31db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * @param view The view to display the drawable in.
32db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * @param maxLoopCount A value to pass to to {@link com.bumptech.glide.load.resource.drawable.GlideDrawable}s
33db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     *                     indicating how many times they should repeat their animation (if they have one). See
34db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     *                     {@link com.bumptech.glide.load.resource.drawable.GlideDrawable#setLoopCount(int)}.
35db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     */
36db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    public GlideDrawableImageViewTarget(ImageView view, int maxLoopCount) {
37db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        super(view);
38db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        this.maxLoopCount = maxLoopCount;
39db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    }
40db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
41db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    /**
42db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * {@inheritDoc}
43db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * If no {@link com.bumptech.glide.request.animation.GlideAnimation} is given or if the animation does not set the
44db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * {@link android.graphics.drawable.Drawable} on the view, the drawable is set using
45db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * {@link android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable)}.
46db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     *
47db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * @param resource {@inheritDoc}
48db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * @param animation {@inheritDoc}
49db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     */
50db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    @Override
51db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) {
52db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        if (!resource.isAnimated()) {
53db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            //TODO: Try to generalize this to other sizes/shapes.
54db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            // This is a dirty hack that tries to make loading square thumbnails and then square full images less costly
55db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            // by forcing both the smaller thumb and the larger version to have exactly the same intrinsic dimensions.
56db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            // If a drawable is replaced in an ImageView by another drawable with different intrinsic dimensions,
57db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            // the ImageView requests a layout. Scrolling rapidly while replacing thumbs with larger images triggers
58db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            // lots of these calls and causes significant amounts of jank.
59db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            float viewRatio = view.getWidth() / (float) view.getHeight();
60db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            float drawableRatio = resource.getIntrinsicWidth() / (float) resource.getIntrinsicHeight();
61db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            if (Math.abs(viewRatio - 1f) <= SQUARE_RATIO_MARGIN
62db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd                    && Math.abs(drawableRatio - 1f) <= SQUARE_RATIO_MARGIN) {
63db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd                resource = new SquaringDrawable(resource, view.getWidth());
64db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            }
65db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        }
66db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        super.onResourceReady(resource, animation);
67db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        this.resource = resource;
68db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        resource.setLoopCount(maxLoopCount);
69db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        resource.start();
70db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    }
71db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
72db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    /**
73db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * Sets the drawable on the view using
74db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * {@link android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable)}.
75db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     *
76db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     * @param resource The {@link android.graphics.drawable.Drawable} to display in the view.
77db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd     */
78db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    @Override
79db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    protected void setResource(GlideDrawable resource) {
80db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        view.setImageDrawable(resource);
81db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    }
82db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
83db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    @Override
84db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    public void onStart() {
85db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        if (resource != null) {
86db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            resource.start();
87db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        }
88db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    }
89db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd
90db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    @Override
91db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    public void onStop() {
92db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        if (resource != null) {
93db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd            resource.stop();
94db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd        }
95db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd    }
96db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd}
97