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; 22684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banesimport android.graphics.drawable.Drawable; 23091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.annotation.DrawableRes; 24a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.support.annotation.Nullable; 25a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.support.v4.view.TintableBackgroundView; 262cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.v7.appcompat.R; 27469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.util.AttributeSet; 28469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.widget.EditText; 29469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 30469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/** 31091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * A {@link EditText} which supports compatible features on older version of the platform, 32091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * including: 33091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <ul> 34091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <li>Supports {@link R.attr#textAllCaps} style attribute which works back to 35091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.os.Build.VERSION_CODES#ECLAIR_MR1 Eclair MR1}.</li> 36091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <li>Allows dynamic tint of it background via the background tint methods in 37091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat}.</li> 38091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and 39091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link R.attr#backgroundTintMode}.</li> 40091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * </ul> 41091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * 42091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <p>This will automatically be used when you use {@link android.widget.EditText} in your 43091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * layouts. You should only need to manually use this class when writing custom views.</p> 44469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 452cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespublic class AppCompatEditText extends EditText implements TintableBackgroundView { 46469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 477e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes private AppCompatDrawableManager mDrawableManager; 48091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes private AppCompatBackgroundHelper mBackgroundTintHelper; 49091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes private AppCompatTextHelper mTextHelper; 50a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 512cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context) { 52469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes this(context, null); 53469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 54469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 552cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context, AttributeSet attrs) { 56dd5571652e2ea0eea4af8dbbf10304675d640e1aChris Banes this(context, attrs, R.attr.editTextStyle); 57469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 58469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 592cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context, AttributeSet attrs, int defStyleAttr) { 60dd5571652e2ea0eea4af8dbbf10304675d640e1aChris Banes super(TintContextWrapper.wrap(context), attrs, defStyleAttr); 61469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 627e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes mDrawableManager = AppCompatDrawableManager.get(); 637e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes mBackgroundTintHelper = new AppCompatBackgroundHelper(this, mDrawableManager); 64091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr); 65091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes 66f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper = AppCompatTextHelper.create(this); 67091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mTextHelper.loadFromAttributes(attrs, defStyleAttr); 68f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper.applyCompoundDrawablesTints(); 69469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 70a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 71684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes @Override 72091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setBackgroundResource(@DrawableRes int resId) { 73684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes super.setBackgroundResource(resId); 74091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 75091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.onSetBackgroundResource(resId); 76091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 77684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 78684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 79684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes @Override 80684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes public void setBackgroundDrawable(Drawable background) { 81684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes super.setBackgroundDrawable(background); 82091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 83091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.onSetBackgroundDrawable(background); 84091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 85684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 86684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 87a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 88a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 89091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, ColorStateList)} 90a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 91a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 92a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 93a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 94a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { 95091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 96091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.setSupportBackgroundTintList(tint); 97a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 98a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 99a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 100a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 101a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 102a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} 103a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 104a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 105a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 106a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 107a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 108a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public ColorStateList getSupportBackgroundTintList() { 109091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mBackgroundTintHelper != null 110091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mBackgroundTintHelper.getSupportBackgroundTintList() : null; 111a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 112a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 113a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 114a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 115091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, PorterDuff.Mode)} 116a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 117a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 118a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 119a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 120a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { 121091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 122091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode); 123a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 124a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 125a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 126a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 127a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 128a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} 129a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 130a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 131a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 132a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 133a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 134a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public PorterDuff.Mode getSupportBackgroundTintMode() { 135091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mBackgroundTintHelper != null 136091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null; 137a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 138a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 139a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 140a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes protected void drawableStateChanged() { 141a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes super.drawableStateChanged(); 142091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 143091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.applySupportBackgroundTint(); 144684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 145f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes if (mTextHelper != null) { 146f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper.applyCompoundDrawablesTints(); 147f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes } 148684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 149684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 150091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Override 151091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setTextAppearance(Context context, int resId) { 152091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes super.setTextAppearance(context, resId); 153091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mTextHelper != null) { 154091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mTextHelper.onSetTextAppearance(context, resId); 155a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 156a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 157469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes} 158