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