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