17e82b99953680915596eaf0eb35927388e574ca8Chris Banes/*
27e82b99953680915596eaf0eb35927388e574ca8Chris Banes * Copyright (C) 2015 The Android Open Source Project
37e82b99953680915596eaf0eb35927388e574ca8Chris Banes *
47e82b99953680915596eaf0eb35927388e574ca8Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
57e82b99953680915596eaf0eb35927388e574ca8Chris Banes * you may not use this file except in compliance with the License.
67e82b99953680915596eaf0eb35927388e574ca8Chris Banes * You may obtain a copy of the License at
77e82b99953680915596eaf0eb35927388e574ca8Chris Banes *
87e82b99953680915596eaf0eb35927388e574ca8Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
97e82b99953680915596eaf0eb35927388e574ca8Chris Banes *
107e82b99953680915596eaf0eb35927388e574ca8Chris Banes * Unless required by applicable law or agreed to in writing, software
117e82b99953680915596eaf0eb35927388e574ca8Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
127e82b99953680915596eaf0eb35927388e574ca8Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137e82b99953680915596eaf0eb35927388e574ca8Chris Banes * See the License for the specific language governing permissions and
147e82b99953680915596eaf0eb35927388e574ca8Chris Banes * limitations under the License.
157e82b99953680915596eaf0eb35927388e574ca8Chris Banes */
167e82b99953680915596eaf0eb35927388e574ca8Chris Banes
177e82b99953680915596eaf0eb35927388e574ca8Chris Banespackage android.support.v4.graphics.drawable;
187e82b99953680915596eaf0eb35927388e574ca8Chris Banes
197797b9f22c8c404309b778a0966266d2b1a84915Chris Banesimport android.content.res.ColorStateList;
207e82b99953680915596eaf0eb35927388e574ca8Chris Banesimport android.content.res.Resources;
217e82b99953680915596eaf0eb35927388e574ca8Chris Banesimport android.graphics.Outline;
227797b9f22c8c404309b778a0966266d2b1a84915Chris Banesimport android.graphics.PorterDuff;
237e82b99953680915596eaf0eb35927388e574ca8Chris Banesimport android.graphics.Rect;
247e82b99953680915596eaf0eb35927388e574ca8Chris Banesimport android.graphics.drawable.Drawable;
259925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banesimport android.graphics.drawable.DrawableContainer;
269925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banesimport android.graphics.drawable.GradientDrawable;
279925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banesimport android.graphics.drawable.InsetDrawable;
289925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banesimport android.os.Build;
294da36b0dfa8436b197314094337fa3102fcca1bcChris Banesimport android.support.annotation.NonNull;
309925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banesimport android.support.annotation.Nullable;
318f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viveretteimport android.support.annotation.RequiresApi;
327e82b99953680915596eaf0eb35927388e574ca8Chris Banes
338f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viverette@RequiresApi(21)
34847790c44721520e4ec47f99f8af12d6caf713ffAurimas Liutikasclass DrawableWrapperApi21 extends DrawableWrapperApi19 {
357e82b99953680915596eaf0eb35927388e574ca8Chris Banes
36847790c44721520e4ec47f99f8af12d6caf713ffAurimas Liutikas    DrawableWrapperApi21(Drawable drawable) {
379925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        super(drawable);
387797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
397797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
40847790c44721520e4ec47f99f8af12d6caf713ffAurimas Liutikas    DrawableWrapperApi21(DrawableWrapperState state, Resources resources) {
419925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        super(state, resources);
427e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
437e82b99953680915596eaf0eb35927388e574ca8Chris Banes
447e82b99953680915596eaf0eb35927388e574ca8Chris Banes    @Override
457e82b99953680915596eaf0eb35927388e574ca8Chris Banes    public void setHotspot(float x, float y) {
467e82b99953680915596eaf0eb35927388e574ca8Chris Banes        mDrawable.setHotspot(x, y);
477e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
487e82b99953680915596eaf0eb35927388e574ca8Chris Banes
497e82b99953680915596eaf0eb35927388e574ca8Chris Banes    @Override
507e82b99953680915596eaf0eb35927388e574ca8Chris Banes    public void setHotspotBounds(int left, int top, int right, int bottom) {
517e82b99953680915596eaf0eb35927388e574ca8Chris Banes        mDrawable.setHotspotBounds(left, top, right, bottom);
527e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
537e82b99953680915596eaf0eb35927388e574ca8Chris Banes
547e82b99953680915596eaf0eb35927388e574ca8Chris Banes    @Override
557e82b99953680915596eaf0eb35927388e574ca8Chris Banes    public void getOutline(Outline outline) {
567e82b99953680915596eaf0eb35927388e574ca8Chris Banes        mDrawable.getOutline(outline);
577e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
587e82b99953680915596eaf0eb35927388e574ca8Chris Banes
597e82b99953680915596eaf0eb35927388e574ca8Chris Banes    @Override
607e82b99953680915596eaf0eb35927388e574ca8Chris Banes    public Rect getDirtyBounds() {
617e82b99953680915596eaf0eb35927388e574ca8Chris Banes        return mDrawable.getDirtyBounds();
627e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
637797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
647797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
657797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    public void setTintList(ColorStateList tint) {
669925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        if (isCompatTintEnabled()) {
67be678137d44778590a6220ae0ef13649e83363a9Chris Banes            super.setTintList(tint);
687797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        } else {
697797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            mDrawable.setTintList(tint);
707797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        }
717797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
727797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
737797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
747797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    public void setTint(int tintColor) {
759925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        if (isCompatTintEnabled()) {
76be678137d44778590a6220ae0ef13649e83363a9Chris Banes            super.setTint(tintColor);
777797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        } else {
787797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            mDrawable.setTint(tintColor);
797797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        }
807797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
817797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
827797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
837797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    public void setTintMode(PorterDuff.Mode tintMode) {
849925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        if (isCompatTintEnabled()) {
85be678137d44778590a6220ae0ef13649e83363a9Chris Banes            super.setTintMode(tintMode);
867797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        } else {
877797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            mDrawable.setTintMode(tintMode);
887797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        }
897797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
907797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
917797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
927797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    public boolean setState(int[] stateSet) {
937797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        if (super.setState(stateSet)) {
947797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            // Manually invalidate because the framework doesn't currently force an invalidation
957797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            // on a state change
967797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            invalidateSelf();
977797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            return true;
987797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        }
997797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        return false;
1007797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
1017797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
1027797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
1037797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    protected boolean isCompatTintEnabled() {
1049925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        if (Build.VERSION.SDK_INT == 21) {
1059925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes            final Drawable drawable = mDrawable;
1069925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes            return drawable instanceof GradientDrawable || drawable instanceof DrawableContainer
1079925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes                    || drawable instanceof InsetDrawable;
1089925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        }
1099925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        return false;
1109925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    }
1119925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes
1124da36b0dfa8436b197314094337fa3102fcca1bcChris Banes    @NonNull
1139925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    @Override
1149925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    DrawableWrapperState mutateConstantState() {
1159925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        return new DrawableWrapperStateLollipop(mState, null);
1169925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    }
1179925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes
1189925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    private static class DrawableWrapperStateLollipop extends DrawableWrapperState {
1199925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        DrawableWrapperStateLollipop(@Nullable DrawableWrapperState orig,
1209925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes                @Nullable Resources res) {
1219925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes            super(orig, res);
1229925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        }
1239925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes
1249925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        @Override
1259925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        public Drawable newDrawable(@Nullable Resources res) {
126847790c44721520e4ec47f99f8af12d6caf713ffAurimas Liutikas            return new DrawableWrapperApi21(this, res);
1279925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        }
1287797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
1297e82b99953680915596eaf0eb35927388e574ca8Chris Banes}
130