1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.support.v7.graphics.drawable;
18
19import android.content.res.ColorStateList;
20import android.graphics.Canvas;
21import android.graphics.ColorFilter;
22import android.graphics.PorterDuff;
23import android.graphics.Rect;
24import android.graphics.Region;
25import android.graphics.drawable.Drawable;
26import android.support.v4.graphics.drawable.DrawableCompat;
27import android.view.View;
28
29/**
30 * Drawable which delegates all calls to it's wrapped {@link Drawable}.
31 * <p>
32 * The wrapped {@link Drawable} <em>must</em> be fully released from any {@link View}
33 * before wrapping, otherwise internal {@link Drawable.Callback} may be dropped.
34 *
35 * @hide
36 */
37public class DrawableWrapper extends Drawable implements Drawable.Callback {
38
39    private Drawable mDrawable;
40
41    public DrawableWrapper(Drawable drawable) {
42        setWrappedDrawable(drawable);
43    }
44
45    @Override
46    public void draw(Canvas canvas) {
47        mDrawable.draw(canvas);
48    }
49
50    @Override
51    protected void onBoundsChange(Rect bounds) {
52        mDrawable.setBounds(bounds);
53    }
54
55    @Override
56    public void setChangingConfigurations(int configs) {
57        mDrawable.setChangingConfigurations(configs);
58    }
59
60    @Override
61    public int getChangingConfigurations() {
62        return mDrawable.getChangingConfigurations();
63    }
64
65    @Override
66    public void setDither(boolean dither) {
67        mDrawable.setDither(dither);
68    }
69
70    @Override
71    public void setFilterBitmap(boolean filter) {
72        mDrawable.setFilterBitmap(filter);
73    }
74
75    @Override
76    public void setAlpha(int alpha) {
77        mDrawable.setAlpha(alpha);
78    }
79
80    @Override
81    public void setColorFilter(ColorFilter cf) {
82        mDrawable.setColorFilter(cf);
83    }
84
85    @Override
86    public boolean isStateful() {
87        return mDrawable.isStateful();
88    }
89
90    @Override
91    public boolean setState(final int[] stateSet) {
92        return mDrawable.setState(stateSet);
93    }
94
95    @Override
96    public int[] getState() {
97        return mDrawable.getState();
98    }
99
100    public void jumpToCurrentState() {
101        DrawableCompat.jumpToCurrentState(mDrawable);
102    }
103
104    @Override
105    public Drawable getCurrent() {
106        return mDrawable.getCurrent();
107    }
108
109    @Override
110    public boolean setVisible(boolean visible, boolean restart) {
111        return super.setVisible(visible, restart) || mDrawable.setVisible(visible, restart);
112    }
113
114    @Override
115    public int getOpacity() {
116        return mDrawable.getOpacity();
117    }
118
119    @Override
120    public Region getTransparentRegion() {
121        return mDrawable.getTransparentRegion();
122    }
123
124    @Override
125    public int getIntrinsicWidth() {
126        return mDrawable.getIntrinsicWidth();
127    }
128
129    @Override
130    public int getIntrinsicHeight() {
131        return mDrawable.getIntrinsicHeight();
132    }
133
134    @Override
135    public int getMinimumWidth() {
136        return mDrawable.getMinimumWidth();
137    }
138
139    @Override
140    public int getMinimumHeight() {
141        return mDrawable.getMinimumHeight();
142    }
143
144    @Override
145    public boolean getPadding(Rect padding) {
146        return mDrawable.getPadding(padding);
147    }
148
149    /**
150     * {@inheritDoc}
151     */
152    public void invalidateDrawable(Drawable who) {
153        invalidateSelf();
154    }
155
156    /**
157     * {@inheritDoc}
158     */
159    public void scheduleDrawable(Drawable who, Runnable what, long when) {
160        scheduleSelf(what, when);
161    }
162
163    /**
164     * {@inheritDoc}
165     */
166    public void unscheduleDrawable(Drawable who, Runnable what) {
167        unscheduleSelf(what);
168    }
169
170    @Override
171    protected boolean onLevelChange(int level) {
172        return mDrawable.setLevel(level);
173    }
174
175    @Override
176    public void setAutoMirrored(boolean mirrored) {
177        DrawableCompat.setAutoMirrored(mDrawable, mirrored);
178    }
179
180    @Override
181    public boolean isAutoMirrored() {
182        return DrawableCompat.isAutoMirrored(mDrawable);
183    }
184
185    @Override
186    public void setTint(int tint) {
187        DrawableCompat.setTint(mDrawable, tint);
188    }
189
190    @Override
191    public void setTintList(ColorStateList tint) {
192        DrawableCompat.setTintList(mDrawable, tint);
193    }
194
195    @Override
196    public void setTintMode(PorterDuff.Mode tintMode) {
197        DrawableCompat.setTintMode(mDrawable, tintMode);
198    }
199
200    @Override
201    public void setHotspot(float x, float y) {
202        DrawableCompat.setHotspot(mDrawable, x, y);
203    }
204
205    @Override
206    public void setHotspotBounds(int left, int top, int right, int bottom) {
207        DrawableCompat.setHotspotBounds(mDrawable, left, top, right, bottom);
208    }
209
210    public Drawable getWrappedDrawable() {
211        return mDrawable;
212    }
213
214    public void setWrappedDrawable(Drawable drawable) {
215        if (mDrawable != null) {
216            mDrawable.setCallback(null);
217        }
218
219        mDrawable = drawable;
220
221        if (drawable != null) {
222            drawable.setCallback(this);
223        }
224    }
225}
226