1469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/* 2469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Copyright (C) 2014 The Android Open Source Project 3469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * 4469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * you may not use this file except in compliance with the License. 6469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * You may obtain a copy of the License at 7469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * 8469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 9469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * 10469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Unless required by applicable law or agreed to in writing, software 11469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * See the License for the specific language governing permissions and 14469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * limitations under the License. 15469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 16469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 17469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banespackage android.support.v7.internal.widget; 18469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 19469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.content.res.ColorStateList; 20469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.Color; 21469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.PorterDuff; 22469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.PorterDuffColorFilter; 23469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.drawable.Drawable; 24469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 25469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/** 26469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * A {@link DrawableWrapper} which updates it's color filter using a {@link ColorStateList}. 27469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 28469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesclass TintDrawableWrapper extends DrawableWrapper { 29469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 30469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes private final ColorStateList mTintStateList; 31415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes private final PorterDuff.Mode mTintMode; 32469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 33469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes private int mCurrentColor; 34469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 35469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public TintDrawableWrapper(Drawable drawable, ColorStateList tintStateList) { 36415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes this(drawable, tintStateList, TintManager.DEFAULT_MODE); 37415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes } 38415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 39415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes public TintDrawableWrapper(Drawable drawable, ColorStateList tintStateList, 40415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes PorterDuff.Mode tintMode) { 41469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes super(drawable); 42469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mTintStateList = tintStateList; 43415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes mTintMode = tintMode; 44469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 45469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 46469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 47469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean isStateful() { 48469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return (mTintStateList != null && mTintStateList.isStateful()) || super.isStateful(); 49469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 50469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 51469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 52469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean setState(int[] stateSet) { 53469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes boolean handled = super.setState(stateSet); 54469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes handled = updateTint(stateSet) || handled; 55469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return handled; 56469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 57469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 58469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes private boolean updateTint(int[] state) { 59469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes if (mTintStateList != null) { 60469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes final int color = mTintStateList.getColorForState(state, mCurrentColor); 61469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes if (color != mCurrentColor) { 62469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes if (color != Color.TRANSPARENT) { 63415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes setColorFilter(color, mTintMode); 64469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } else { 65469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes clearColorFilter(); 66469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 67469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mCurrentColor = color; 68469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return true; 69469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 70469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 71469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return false; 72469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 73469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 74469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes} 75