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 198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP; 208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas 21469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.content.Context; 22a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.content.res.ColorStateList; 23a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.graphics.PorterDuff; 24684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banesimport android.graphics.drawable.Drawable; 25091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.annotation.DrawableRes; 26a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.support.annotation.Nullable; 27c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo; 28a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banesimport android.support.v4.view.TintableBackgroundView; 292cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.v7.appcompat.R; 30469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.util.AttributeSet; 31469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.widget.EditText; 32469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 33469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/** 34de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * A {@link EditText} which supports compatible features on older versions of the platform, 35091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * including: 36091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <ul> 3729def828b59307ae6bfec1e5da8c44b7e651ddcfKirill Grouchnikov * <li>Allows dynamic tint of its background via the background tint methods in 38091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat}.</li> 39091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and 40091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link R.attr#backgroundTintMode}.</li> 41091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * </ul> 42091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * 43de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * <p>This will automatically be used when you use {@link EditText} in your layouts 44de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * and the top-level activity / dialog is provided by 45de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>. 46de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * You should only need to manually use this class when writing custom views.</p> 47469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 482cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespublic class AppCompatEditText extends EditText implements TintableBackgroundView { 49469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 5029def828b59307ae6bfec1e5da8c44b7e651ddcfKirill Grouchnikov private final AppCompatBackgroundHelper mBackgroundTintHelper; 5129def828b59307ae6bfec1e5da8c44b7e651ddcfKirill Grouchnikov private final AppCompatTextHelper mTextHelper; 52a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 532cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context) { 54469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes this(context, null); 55469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 56469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 572cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context, AttributeSet attrs) { 58dd5571652e2ea0eea4af8dbbf10304675d640e1aChris Banes this(context, attrs, R.attr.editTextStyle); 59469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 60469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 612cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatEditText(Context context, AttributeSet attrs, int defStyleAttr) { 62dd5571652e2ea0eea4af8dbbf10304675d640e1aChris Banes super(TintContextWrapper.wrap(context), attrs, defStyleAttr); 63469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 644c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes mBackgroundTintHelper = new AppCompatBackgroundHelper(this); 65091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr); 66091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes 67f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper = AppCompatTextHelper.create(this); 68091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mTextHelper.loadFromAttributes(attrs, defStyleAttr); 69f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper.applyCompoundDrawablesTints(); 70469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 71a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 72684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes @Override 73091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setBackgroundResource(@DrawableRes int resId) { 74684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes super.setBackgroundResource(resId); 75091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 76091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.onSetBackgroundResource(resId); 77091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 78684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 79684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 80684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes @Override 81684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes public void setBackgroundDrawable(Drawable background) { 82684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes super.setBackgroundDrawable(background); 83091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 84091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.onSetBackgroundDrawable(background); 85091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 86684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 87684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 88a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 89a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 90091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, ColorStateList)} 91a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 92a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 93a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 948e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas @RestrictTo(LIBRARY_GROUP) 95a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 96a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { 97091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 98091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.setSupportBackgroundTintList(tint); 99a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 100a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 101a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 102a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 103a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 104a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} 105a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 106a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 107a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 1088e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas @RestrictTo(LIBRARY_GROUP) 109a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 110a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 111a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public ColorStateList getSupportBackgroundTintList() { 112091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mBackgroundTintHelper != null 113091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mBackgroundTintHelper.getSupportBackgroundTintList() : null; 114a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 115a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 116a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 117a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 118091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, PorterDuff.Mode)} 119a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 120a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 121a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 1228e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas @RestrictTo(LIBRARY_GROUP) 123a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 124a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { 125091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 126091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode); 127a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 128a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 129a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 130a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 131a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 132a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} 133a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 134a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 135a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 1368e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas @RestrictTo(LIBRARY_GROUP) 137a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 138a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 139a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public PorterDuff.Mode getSupportBackgroundTintMode() { 140091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mBackgroundTintHelper != null 141091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null; 142a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 143a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 144a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 145a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes protected void drawableStateChanged() { 146a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes super.drawableStateChanged(); 147091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 148091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.applySupportBackgroundTint(); 149684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 150f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes if (mTextHelper != null) { 151f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper.applyCompoundDrawablesTints(); 152f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes } 153684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 154684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 155091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Override 156091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setTextAppearance(Context context, int resId) { 157091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes super.setTextAppearance(context, resId); 158091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mTextHelper != null) { 159091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mTextHelper.onSetTextAppearance(context, resId); 160a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 161a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 162469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes} 163