1package com.bumptech.glide.load.resource.drawable;
2
3import android.graphics.drawable.Drawable;
4
5import com.bumptech.glide.load.engine.Resource;
6
7/**
8 * Simple wrapper for an Android {@link Drawable} which returns a
9 * {@link android.graphics.drawable.Drawable.ConstantState#newDrawable() new drawable}
10 * based on it's {@link android.graphics.drawable.Drawable.ConstantState state}.
11 *
12 * <b>Suggested usages only include {@code T}s where the new drawable is of the same or descendant class.</b>
13 *
14 * @param <T> type of the wrapped {@link Drawable}
15 */
16public abstract class DrawableResource<T extends Drawable> implements Resource<T> {
17    protected final T drawable;
18    private boolean returnedOriginalDrawable;
19
20    public DrawableResource(T drawable) {
21        if (drawable == null) {
22            throw new NullPointerException("Drawable must not be null!");
23        }
24        this.drawable = drawable;
25    }
26
27    @SuppressWarnings("unchecked")
28    // drawables should always return a copy of the same class
29    @Override
30    public final T get() {
31        if (!returnedOriginalDrawable) {
32            returnedOriginalDrawable = true;
33            return drawable;
34        } else {
35            return (T) drawable.getConstantState().newDrawable();
36        }
37    }
38}
39