1469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/*
2469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Copyright (C) 2014 The Android Open Source Project
3469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes *
4469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * you may not use this file except in compliance with the License.
6469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * You may obtain a copy of the License at
7469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes *
8469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes *
10469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Unless required by applicable law or agreed to in writing, software
11469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * See the License for the specific language governing permissions and
14469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * limitations under the License.
15469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */
16469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
17469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banespackage android.support.v7.internal.widget;
18469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
19469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.content.res.ColorStateList;
20469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.Canvas;
21469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.ColorFilter;
22469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.PorterDuff;
23469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.Rect;
24469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.Region;
25469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.drawable.Drawable;
26469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.drawable.DrawableContainer;
27469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.os.Build;
28469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.support.v4.graphics.drawable.DrawableCompat;
29469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.view.View;
30469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
31469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/**
32469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Base wrapper that delegates all calls to another {@link Drawable}. The wrapped {@link Drawable}
33469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * <em>must</em> be fully released from any {@link View} before wrapping, otherwise internal {@link
34469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Drawable.Callback} may be dropped.
35469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */
36469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesclass DrawableWrapper extends Drawable implements Drawable.Callback {
37469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
38a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes    private Drawable mDrawable;
39469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
40469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public DrawableWrapper(Drawable drawable) {
41a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes        setWrappedDrawable(drawable);
42469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
43469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
44469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
45469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void draw(Canvas canvas) {
46469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        mDrawable.draw(canvas);
47469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
48469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
49469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
50469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setBounds(int left, int top, int right, int bottom) {
51469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        super.setBounds(left, top, right, bottom);
52469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        mDrawable.setBounds(left, top, right, bottom);
53469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
54469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
55469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
56469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setChangingConfigurations(int configs) {
57469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        mDrawable.setChangingConfigurations(configs);
58469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
59469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
60469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
61469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public int getChangingConfigurations() {
62469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getChangingConfigurations();
63469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
64469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
65469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
66469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setDither(boolean dither) {
67469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        mDrawable.setDither(dither);
68469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
69469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
70469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
71469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setFilterBitmap(boolean filter) {
72469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        mDrawable.setFilterBitmap(filter);
73469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
74469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
75469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
76469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setAlpha(int alpha) {
77469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        mDrawable.setAlpha(alpha);
78469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
79469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
80469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
81469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setColorFilter(ColorFilter cf) {
82469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        mDrawable.setColorFilter(cf);
83469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
84469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
85469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
86469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public boolean isStateful() {
87469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.isStateful();
88469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
89469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
90469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
91469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public boolean setState(final int[] stateSet) {
92469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.setState(stateSet);
93469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
94469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
95469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
96469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public int[] getState() {
97469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getState();
98469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
99469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
100469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void jumpToCurrentState() {
101469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        DrawableCompat.jumpToCurrentState(mDrawable);
102469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
103469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
104469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
105469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public Drawable getCurrent() {
106469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getCurrent();
107469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
108469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
109469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
110469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public boolean setVisible(boolean visible, boolean restart) {
111469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return super.setVisible(visible, restart) || mDrawable.setVisible(visible, restart);
112469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
113469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
114469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
115469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public int getOpacity() {
116469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getOpacity();
117469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
118469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
119469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
120469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public Region getTransparentRegion() {
121469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getTransparentRegion();
122469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
123469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
124469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
125469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public int getIntrinsicWidth() {
126469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getIntrinsicWidth();
127469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
128469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
129469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
130469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public int getIntrinsicHeight() {
131469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getIntrinsicHeight();
132469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
133469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
134469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
135469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public int getMinimumWidth() {
136469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getMinimumWidth();
137469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
138469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
139469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
140469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public int getMinimumHeight() {
141469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getMinimumHeight();
142469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
143469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
144469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
145469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public boolean getPadding(Rect padding) {
146469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.getPadding(padding);
147469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
148469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
149469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    /**
150469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes     * {@inheritDoc}
151469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes     */
152469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void invalidateDrawable(Drawable who) {
153469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        invalidateSelf();
154469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
155469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
156469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    /**
157469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes     * {@inheritDoc}
158469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes     */
159469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void scheduleDrawable(Drawable who, Runnable what, long when) {
160469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        scheduleSelf(what, when);
161469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
162469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
163469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    /**
164469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes     * {@inheritDoc}
165469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes     */
166469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void unscheduleDrawable(Drawable who, Runnable what) {
167469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        unscheduleSelf(what);
168469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
169469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
170469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
171469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    protected boolean onLevelChange(int level) {
172469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return mDrawable.setLevel(level);
173469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
174469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
175469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
176469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setAutoMirrored(boolean mirrored) {
177469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        DrawableCompat.setAutoMirrored(mDrawable, mirrored);
178469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
179469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
180469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
181469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public boolean isAutoMirrored() {
182469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        return DrawableCompat.isAutoMirrored(mDrawable);
183469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
184469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
185469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
186469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setTint(int tint) {
187469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        DrawableCompat.setTint(mDrawable, tint);
188469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
189469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
190469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
191469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setTintList(ColorStateList tint) {
192469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        DrawableCompat.setTintList(mDrawable, tint);
193469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
194469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
195469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    @Override
196469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public void setTintMode(PorterDuff.Mode tintMode) {
197469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        DrawableCompat.setTintMode(mDrawable, tintMode);
198469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
19980e66c1609421dacff3e49770411e201039aa1d8Chris Banes
20080e66c1609421dacff3e49770411e201039aa1d8Chris Banes    @Override
20180e66c1609421dacff3e49770411e201039aa1d8Chris Banes    public void setHotspot(float x, float y) {
20280e66c1609421dacff3e49770411e201039aa1d8Chris Banes        DrawableCompat.setHotspot(mDrawable, x, y);
20380e66c1609421dacff3e49770411e201039aa1d8Chris Banes    }
20480e66c1609421dacff3e49770411e201039aa1d8Chris Banes
20580e66c1609421dacff3e49770411e201039aa1d8Chris Banes    @Override
20680e66c1609421dacff3e49770411e201039aa1d8Chris Banes    public void setHotspotBounds(int left, int top, int right, int bottom) {
20780e66c1609421dacff3e49770411e201039aa1d8Chris Banes        DrawableCompat.setHotspotBounds(mDrawable, left, top, right, bottom);
20880e66c1609421dacff3e49770411e201039aa1d8Chris Banes    }
209a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes
210a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes    public Drawable getWrappedDrawable() {
211a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes        return mDrawable;
212a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes    }
213a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes
214a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes    public void setWrappedDrawable(Drawable drawable) {
215a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes        if (mDrawable != null) {
216a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes            mDrawable.setCallback(null);
217a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes        }
218a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes
219a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes        mDrawable = drawable;
220a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes
221a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes        if (drawable != null) {
222a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes            drawable.setCallback(this);
223a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes        }
224a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes    }
225469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes}
226