AppCompatEditText.java revision 2cccf609662389d6a23dbc0711d5fb2e826e8c63
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 172cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespackage android.support.v7.widget; 18469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 19469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.content.Context; 20a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.content.res.ColorStateList; 21a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.graphics.PorterDuff; 22a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.support.annotation.Nullable; 23a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.support.v4.view.TintableBackgroundView; 242cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.v7.appcompat.R; 252cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.v7.internal.widget.TintContextWrapper; 262cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.v7.internal.widget.TintInfo; 272cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.v7.internal.widget.TintManager; 282cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.v7.internal.widget.TintTypedArray; 29469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.util.AttributeSet; 30469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.widget.EditText; 31469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 32469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/** 332cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes * A tint aware {@link android.widget.EditText}. 34fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * <p> 35fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * This will automatically be used when you use {@link android.widget.EditText} in your 36fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * layouts. You should only need to manually use this class when writing custom views. 37469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 382cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespublic class AppCompatEditText extends EditText implements TintableBackgroundView { 39469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 40469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes private static final int[] TINT_ATTRS = { 41469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes android.R.attr.background 42469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes }; 43469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 44a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes private TintInfo mBackgroundTint; 45a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 462cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context) { 47469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes this(context, null); 48469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 49469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 502cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context, AttributeSet attrs) { 512cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes this(TintContextWrapper.wrap(context), attrs, R.attr.editTextStyle); 52469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 53469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 542cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context, AttributeSet attrs, int defStyleAttr) { 55469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes super(context, attrs, defStyleAttr); 56469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 57fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes if (TintManager.SHOULD_BE_USED) { 58fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, 59fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes TINT_ATTRS, defStyleAttr, 0); 60fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes if (a.hasValue(0)) { 61a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes setSupportBackgroundTintList( 62cd6e77607caba0b3b26163791a361938afb8b9c5Chris Banes a.getTintManager().getTintList(a.getResourceId(0, -1))); 63fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes } 64fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes a.recycle(); 65fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes } 66469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 67a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 68a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 69a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 70a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, 71a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * android.content.res.ColorStateList)} 72a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 73a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 74a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 75a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 76a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { 77a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (mBackgroundTint == null) { 78a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint = new TintInfo(); 79a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 80a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint.mTintList = tint; 812cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes mBackgroundTint.mHasTintList = true; 822cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes 83a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 84a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 85a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 86a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 87a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 88a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} 89a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 90a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 91a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 92a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 93a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 94a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public ColorStateList getSupportBackgroundTintList() { 95a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes return mBackgroundTint != null ? mBackgroundTint.mTintList : null; 96a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 97a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 98a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 99a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 100a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} 101a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 102a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 103a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 104a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 105a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { 106a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (mBackgroundTint == null) { 107a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint = new TintInfo(); 108a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 109a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint.mTintMode = tintMode; 1102cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes mBackgroundTint.mHasTintMode = true; 1112cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes 112a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 113a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 114a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 115a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 116a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 117a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} 118a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 119a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 120a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 121a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 122a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 123a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public PorterDuff.Mode getSupportBackgroundTintMode() { 124a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; 125a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 126a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 127a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 128a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes protected void drawableStateChanged() { 129a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes super.drawableStateChanged(); 130a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 131a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 132a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 133a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes private void applySupportBackgroundTint() { 134a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (getBackground() != null && mBackgroundTint != null) { 135a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TintManager.tintViewBackground(this, mBackgroundTint); 136a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 137a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 138469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes} 139