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