AppCompatBackgroundHelper.java revision 091b0f935e68ce9bfecc2422e60eada33fa3b09c
1091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes/*
2091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * Copyright (C) 2015 The Android Open Source Project
3091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes *
4091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * you may not use this file except in compliance with the License.
6091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * You may obtain a copy of the License at
7091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes *
8091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes *
10091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * Unless required by applicable law or agreed to in writing, software
11091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * See the License for the specific language governing permissions and
14091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * limitations under the License.
15091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes */
16091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
17091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banespackage android.support.v7.widget;
18091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
19091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.content.res.ColorStateList;
20091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.content.res.TypedArray;
21091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.graphics.PorterDuff;
22091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.graphics.drawable.Drawable;
23091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.v4.view.ViewCompat;
24091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.v7.appcompat.R;
25091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.v7.graphics.drawable.DrawableUtils;
26091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.v7.internal.widget.TintInfo;
27091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.v7.internal.widget.TintManager;
28091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.util.AttributeSet;
29091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.view.View;
30091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
31091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesclass AppCompatBackgroundHelper {
32091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
33091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    private final View mView;
34091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    private final TintManager mTintManager;
35091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
36091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    private TintInfo mInternalBackgroundTint;
37091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    private TintInfo mBackgroundTint;
38091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
39091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    AppCompatBackgroundHelper(View view, TintManager tintManager) {
40091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        mView = view;
41091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        mTintManager = tintManager;
42091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
43091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
44091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    void loadFromAttributes(AttributeSet attrs, int defStyleAttr) {
45091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        TypedArray a = mView.getContext().obtainStyledAttributes(attrs,
46091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                R.styleable.ViewBackgroundHelper, defStyleAttr, 0);
47091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        try {
48091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            if (a.hasValue(R.styleable.ViewBackgroundHelper_android_background)) {
49091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                ColorStateList tint = mTintManager.getTintList(
50091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                        a.getResourceId(R.styleable.ViewBackgroundHelper_android_background, -1));
51091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                if (tint != null) {
52091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                    setInternalBackgroundTint(tint);
53091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                }
54091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            }
55091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            if (a.hasValue(R.styleable.ViewBackgroundHelper_backgroundTint)) {
56091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                ViewCompat.setBackgroundTintList(mView,
57091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                        a.getColorStateList(R.styleable.ViewBackgroundHelper_backgroundTint));
58091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            }
59091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            if (a.hasValue(R.styleable.ViewBackgroundHelper_backgroundTintMode)) {
60091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                ViewCompat.setBackgroundTintMode(mView,
61091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                        DrawableUtils.parseTintMode(
62091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                                a.getInt(R.styleable.ViewBackgroundHelper_backgroundTintMode, -1),
63091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                                null));
64091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            }
65091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        } finally {
66091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            a.recycle();
67091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
68091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
69091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
70091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    void onSetBackgroundResource(int resId) {
71091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        // Update the default background tint
72091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        setInternalBackgroundTint(mTintManager != null ? mTintManager.getTintList(resId) : null);
73091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
74091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
75091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    void onSetBackgroundDrawable(Drawable background) {
76091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        // We don't know that this drawable is, so we need to clear the default background tint
77091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        setInternalBackgroundTint(null);
78091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
79091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
80091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    void setSupportBackgroundTintList(ColorStateList tint) {
81091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (mBackgroundTint == null) {
82091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            mBackgroundTint = new TintInfo();
83091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
84091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        mBackgroundTint.mTintList = tint;
85091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        mBackgroundTint.mHasTintList = true;
86091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
87091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        applySupportBackgroundTint();
88091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
89091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
90091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    ColorStateList getSupportBackgroundTintList() {
91091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        return mBackgroundTint != null ? mBackgroundTint.mTintList : null;
92091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
93091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
94091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    void setSupportBackgroundTintMode(PorterDuff.Mode tintMode) {
95091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (mBackgroundTint == null) {
96091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            mBackgroundTint = new TintInfo();
97091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
98091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        mBackgroundTint.mTintMode = tintMode;
99091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        mBackgroundTint.mHasTintMode = true;
100091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
101091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        applySupportBackgroundTint();
102091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
103091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
104091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    PorterDuff.Mode getSupportBackgroundTintMode() {
105091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        return mBackgroundTint != null ? mBackgroundTint.mTintMode : null;
106091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
107091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
108091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    void applySupportBackgroundTint() {
109091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (mView.getBackground() != null) {
110091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            if (mBackgroundTint != null) {
111091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                TintManager.tintViewBackground(mView, mBackgroundTint);
112091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            } else if (mInternalBackgroundTint != null) {
113091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                TintManager.tintViewBackground(mView, mInternalBackgroundTint);
114091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            }
115091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
116091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
117091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
118091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    void setInternalBackgroundTint(ColorStateList tint) {
119091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (tint != null) {
120091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            if (mInternalBackgroundTint == null) {
121091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                mInternalBackgroundTint = new TintInfo();
122091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            }
123091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            mInternalBackgroundTint.mTintList = tint;
124091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            mInternalBackgroundTint.mHasTintList = true;
125091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        } else {
126091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            mInternalBackgroundTint = null;
127091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
128091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        applySupportBackgroundTint();
129091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
130091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes}
131