1968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu/*
2968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * Copyright (C) 2015 The Android Open Source Project
3968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu *
4968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * in compliance with the License. You may obtain a copy of the License at
6968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu *
7968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * http://www.apache.org/licenses/LICENSE-2.0
8968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu *
9968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * Unless required by applicable law or agreed to in writing, software distributed under the License
10968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * or implied. See the License for the specific language governing permissions and limitations under
12968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * the License.
13968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu */
14968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
15968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhupackage android.support.graphics.drawable;
16968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
17968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.annotation.TargetApi;
18968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.content.res.Resources;
19968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.content.res.TypedArray;
20968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.graphics.ColorFilter;
21968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.graphics.PorterDuff;
22968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.graphics.Rect;
23968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.graphics.Region;
24968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.graphics.drawable.Drawable;
25968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.os.Build;
26ebbed34a78fa6519de6c2848e68b97f9d3b98e08Tenghui Zhuimport android.support.v4.graphics.drawable.DrawableCompat;
27be678137d44778590a6220ae0ef13649e83363a9Chris Banesimport android.support.v4.graphics.drawable.TintAwareDrawable;
28968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhuimport android.util.AttributeSet;
29968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
30968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu/**
31968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu * Internal common delegation shared by VectorDrawableCompat and AnimatedVectorDrawableCompat
32968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu */
33968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu@TargetApi(Build.VERSION_CODES.LOLLIPOP)
34be678137d44778590a6220ae0ef13649e83363a9Chris Banesabstract class VectorDrawableCommon extends Drawable implements TintAwareDrawable {
35968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    /**
36968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu     * Obtains styled attributes from the theme, if available, or unstyled
37968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu     * resources if the theme is null.
38968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu     */
39968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    static TypedArray obtainAttributes(
40968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            Resources res, Resources.Theme theme, AttributeSet set, int[] attrs) {
41968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (theme == null) {
42968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return res.obtainAttributes(set, attrs);
43968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
44968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return theme.obtainStyledAttributes(set, attrs, 0, 0);
45968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
46968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
47968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    // Drawable delegation for Lollipop and above.
48968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    Drawable mDelegateDrawable;
49968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
50968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
51968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public void setColorFilter(int color, PorterDuff.Mode mode) {
52968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
53968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            mDelegateDrawable.setColorFilter(color, mode);
54968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return;
55968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
56968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        super.setColorFilter(color, mode);
57968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
58968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
59968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
60968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public ColorFilter getColorFilter() {
61968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
62ebbed34a78fa6519de6c2848e68b97f9d3b98e08Tenghui Zhu            return DrawableCompat.getColorFilter(mDelegateDrawable);
63968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
64ebbed34a78fa6519de6c2848e68b97f9d3b98e08Tenghui Zhu        return null;
65968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
66968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
67968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
68968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    protected boolean onLevelChange(int level) {
69968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
70968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return mDelegateDrawable.setLevel(level);
71968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
72968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return super.onLevelChange(level);
73968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
74968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
75968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
76968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    protected void onBoundsChange(Rect bounds) {
77968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
78968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            mDelegateDrawable.setBounds(bounds);
79968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return;
80968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
81968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        super.onBoundsChange(bounds);
82968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
83968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
84968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
85968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public void setHotspot(float x, float y) {
86968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        // API >= 21 only.
87968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
88ebbed34a78fa6519de6c2848e68b97f9d3b98e08Tenghui Zhu            DrawableCompat.setHotspot(mDelegateDrawable, x, y);
89968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
90968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return;
91968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
92968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
93968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
94968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public void setHotspotBounds(int left, int top, int right, int bottom) {
95968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
96ebbed34a78fa6519de6c2848e68b97f9d3b98e08Tenghui Zhu            DrawableCompat.setHotspotBounds(mDelegateDrawable, left, top, right, bottom);
97968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return;
98968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
99968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
100968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
101968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
102968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public void setFilterBitmap(boolean filter) {
103968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
104968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            mDelegateDrawable.setFilterBitmap(filter);
105968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return;
106968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
107968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
108968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
109968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
110968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public void jumpToCurrentState() {
111968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
112ebbed34a78fa6519de6c2848e68b97f9d3b98e08Tenghui Zhu            DrawableCompat.jumpToCurrentState(mDelegateDrawable);
113968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return;
114968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
115968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
116968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
117968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
118968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public void applyTheme(Resources.Theme t) {
119968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        // API >= 21 only.
120968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
121ebbed34a78fa6519de6c2848e68b97f9d3b98e08Tenghui Zhu            DrawableCompat.applyTheme(mDelegateDrawable, t);
122968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return;
123968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
124968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
125968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
126968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
127968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public void clearColorFilter() {
128968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
129968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            mDelegateDrawable.clearColorFilter();
130968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return;
131968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
132968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        super.clearColorFilter();
133968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
134968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
135968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
136968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public Drawable getCurrent() {
137968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
138968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return mDelegateDrawable.getCurrent();
139968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
140968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return super.getCurrent();
141968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
142968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
143968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
144968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public int getMinimumWidth() {
145968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
146968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return mDelegateDrawable.getMinimumWidth();
147968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
148968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return super.getMinimumWidth();
149968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
150968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
151968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
152968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public int getMinimumHeight() {
153968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
154968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return mDelegateDrawable.getMinimumHeight();
155968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
156968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return super.getMinimumHeight();
157968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
158968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
159968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
160968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public boolean getPadding(Rect padding) {
161968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
162968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return mDelegateDrawable.getPadding(padding);
163968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
164968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return super.getPadding(padding);
165968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
166968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
167968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
168968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public int[] getState() {
169968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
170968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return mDelegateDrawable.getState();
171968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
172968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return super.getState();
173968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
174968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
175968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
176968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
177968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public Region getTransparentRegion() {
178968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
179968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return mDelegateDrawable.getTransparentRegion();
180968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
181968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return super.getTransparentRegion();
182968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
183968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
184968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
185968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public void setChangingConfigurations(int configs) {
186968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
187968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            mDelegateDrawable.setChangingConfigurations(configs);
188968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return;
189968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
190968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        super.setChangingConfigurations(configs);
191968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
192968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu
193968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    @Override
194968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    public boolean setState(int[] stateSet) {
195968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        if (mDelegateDrawable != null) {
196968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu            return mDelegateDrawable.setState(stateSet);
197968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        }
198968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu        return super.setState(stateSet);
199968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu    }
200968dcfaff0c0a9e85ff4db2a985188f6996f5dadTeng-Hui Zhu}
201