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