DrawableWrapperApi21.java revision 4da36b0dfa8436b197314094337fa3102fcca1bc
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;
317e82b99953680915596eaf0eb35927388e574ca8Chris Banes
327e82b99953680915596eaf0eb35927388e574ca8Chris Banesclass DrawableWrapperLollipop extends DrawableWrapperKitKat {
337e82b99953680915596eaf0eb35927388e574ca8Chris Banes
347e82b99953680915596eaf0eb35927388e574ca8Chris Banes    DrawableWrapperLollipop(Drawable drawable) {
359925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        super(drawable);
367797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
377797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
389925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    DrawableWrapperLollipop(DrawableWrapperState state, Resources resources) {
399925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        super(state, resources);
407e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
417e82b99953680915596eaf0eb35927388e574ca8Chris Banes
427e82b99953680915596eaf0eb35927388e574ca8Chris Banes    @Override
437e82b99953680915596eaf0eb35927388e574ca8Chris Banes    public void setHotspot(float x, float y) {
447e82b99953680915596eaf0eb35927388e574ca8Chris Banes        mDrawable.setHotspot(x, y);
457e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
467e82b99953680915596eaf0eb35927388e574ca8Chris Banes
477e82b99953680915596eaf0eb35927388e574ca8Chris Banes    @Override
487e82b99953680915596eaf0eb35927388e574ca8Chris Banes    public void setHotspotBounds(int left, int top, int right, int bottom) {
497e82b99953680915596eaf0eb35927388e574ca8Chris Banes        mDrawable.setHotspotBounds(left, top, right, bottom);
507e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
517e82b99953680915596eaf0eb35927388e574ca8Chris Banes
527e82b99953680915596eaf0eb35927388e574ca8Chris Banes    @Override
537e82b99953680915596eaf0eb35927388e574ca8Chris Banes    public void getOutline(Outline outline) {
547e82b99953680915596eaf0eb35927388e574ca8Chris Banes        mDrawable.getOutline(outline);
557e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
567e82b99953680915596eaf0eb35927388e574ca8Chris Banes
577e82b99953680915596eaf0eb35927388e574ca8Chris Banes    @Override
587e82b99953680915596eaf0eb35927388e574ca8Chris Banes    public Rect getDirtyBounds() {
597e82b99953680915596eaf0eb35927388e574ca8Chris Banes        return mDrawable.getDirtyBounds();
607e82b99953680915596eaf0eb35927388e574ca8Chris Banes    }
617797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
627797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
637797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    public void setTintList(ColorStateList tint) {
649925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        if (isCompatTintEnabled()) {
657797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            setCompatTintList(tint);
667797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        } else {
677797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            mDrawable.setTintList(tint);
687797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        }
697797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
707797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
717797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
727797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    public void setTint(int tintColor) {
739925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        if (isCompatTintEnabled()) {
747797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            setCompatTint(tintColor);
757797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        } else {
767797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            mDrawable.setTint(tintColor);
777797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        }
787797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
797797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
807797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
817797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    public void setTintMode(PorterDuff.Mode tintMode) {
829925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        if (isCompatTintEnabled()) {
837797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            setCompatTintMode(tintMode);
847797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        } else {
857797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            mDrawable.setTintMode(tintMode);
867797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        }
877797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
887797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
897797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
907797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    public boolean setState(int[] stateSet) {
917797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        if (super.setState(stateSet)) {
927797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            // Manually invalidate because the framework doesn't currently force an invalidation
937797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            // on a state change
947797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            invalidateSelf();
957797b9f22c8c404309b778a0966266d2b1a84915Chris Banes            return true;
967797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        }
977797b9f22c8c404309b778a0966266d2b1a84915Chris Banes        return false;
987797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
997797b9f22c8c404309b778a0966266d2b1a84915Chris Banes
1007797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    @Override
1017797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    protected boolean isCompatTintEnabled() {
1029925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        if (Build.VERSION.SDK_INT == 21) {
1039925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes            final Drawable drawable = mDrawable;
1049925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes            return drawable instanceof GradientDrawable || drawable instanceof DrawableContainer
1059925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes                    || drawable instanceof InsetDrawable;
1069925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        }
1079925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        return false;
1089925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    }
1099925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes
1104da36b0dfa8436b197314094337fa3102fcca1bcChris Banes    @NonNull
1119925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    @Override
1129925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    DrawableWrapperState mutateConstantState() {
1139925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        return new DrawableWrapperStateLollipop(mState, null);
1149925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    }
1159925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes
1169925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes    private static class DrawableWrapperStateLollipop extends DrawableWrapperState {
1179925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        DrawableWrapperStateLollipop(@Nullable DrawableWrapperState orig,
1189925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes                @Nullable Resources res) {
1199925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes            super(orig, res);
1209925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        }
1219925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes
1229925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        @Override
1239925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        public Drawable newDrawable(@Nullable Resources res) {
1249925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes            return new DrawableWrapperLollipop(this, res);
1259925d4a53e0dbaacf07901fb48907fe1aff9bbbdChris Banes        }
1267797b9f22c8c404309b778a0966266d2b1a84915Chris Banes    }
1277e82b99953680915596eaf0eb35927388e574ca8Chris Banes}
128