1012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes/* 2012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * Copyright (C) 2014 The Android Open Source Project 3012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * 4012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * you may not use this file except in compliance with the License. 6012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * You may obtain a copy of the License at 7012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * 8012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 9012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * 10012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * Unless required by applicable law or agreed to in writing, software 11012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * See the License for the specific language governing permissions and 14012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * limitations under the License. 15012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes */ 16012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 172cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespackage android.support.v7.widget; 18012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP; 208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas 21012047c60d03e61498955b7fa3e9cb9b409fbad8Chris 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; 304c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banesimport android.support.v7.content.res.AppCompatResources; 31012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banesimport android.util.AttributeSet; 32012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banesimport android.widget.AutoCompleteTextView; 33012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 34012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes/** 35de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * A {@link AutoCompleteTextView} which supports compatible features on older versions of the 36091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * platform, including: 37091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <ul> 3829def828b59307ae6bfec1e5da8c44b7e651ddcfKirill Grouchnikov * <li>Allows dynamic tint of its background via the background tint methods in 39091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat}.</li> 40091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and 41091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link R.attr#backgroundTintMode}.</li> 42091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * </ul> 43091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * 44de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * <p>This will automatically be used when you use {@link AutoCompleteTextView} in your layouts 45de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * and the top-level activity / dialog is provided by 46de8d2ecb44867a66d749dd49cea36eb2a425924cKirill Grouchnikov * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>. 47091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * You should only need to manually use this class when writing custom views.</p> 48012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes */ 492cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespublic class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements 50a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TintableBackgroundView { 51012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 52012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes private static final int[] TINT_ATTRS = { 53012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes android.R.attr.popupBackground 54012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes }; 55012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 5629def828b59307ae6bfec1e5da8c44b7e651ddcfKirill Grouchnikov private final AppCompatBackgroundHelper mBackgroundTintHelper; 5729def828b59307ae6bfec1e5da8c44b7e651ddcfKirill Grouchnikov private final AppCompatTextHelper mTextHelper; 58f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes 592cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatAutoCompleteTextView(Context context) { 60012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes this(context, null); 61012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 62012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 632cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatAutoCompleteTextView(Context context, AttributeSet attrs) { 642cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes this(context, attrs, R.attr.autoCompleteTextViewStyle); 65012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 66012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 672cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 68911642499da7d796aa1e7c19178c3552a590f48bChris Banes super(TintContextWrapper.wrap(context), attrs, defStyleAttr); 69012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 70091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, 71091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes TINT_ATTRS, defStyleAttr, 0); 72091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (a.hasValue(0)) { 73091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes setDropDownBackgroundDrawable(a.getDrawable(0)); 74a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 75091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes a.recycle(); 76091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes 774c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes mBackgroundTintHelper = new AppCompatBackgroundHelper(this); 78091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr); 79091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes 80f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper = AppCompatTextHelper.create(this); 81091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mTextHelper.loadFromAttributes(attrs, defStyleAttr); 82f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper.applyCompoundDrawablesTints(); 83f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes } 84f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes 85f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes @Override 86091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setDropDownBackgroundResource(@DrawableRes int resId) { 874c99f0e29b0926d8e5de44b7e3980d47f052f04cChris Banes setDropDownBackgroundDrawable(AppCompatResources.getDrawable(getContext(), resId)); 88684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 89684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 90684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes @Override 91091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setBackgroundResource(@DrawableRes int resId) { 92091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes super.setBackgroundResource(resId); 93091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 94091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.onSetBackgroundResource(resId); 95091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 96684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 97684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 98684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes @Override 99091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setBackgroundDrawable(Drawable background) { 100091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes super.setBackgroundDrawable(background); 101091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 102091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.onSetBackgroundDrawable(background); 103091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 104012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 105a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 106a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 107a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 108091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, ColorStateList)} 109a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 110a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 111a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 1128e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas @RestrictTo(LIBRARY_GROUP) 113a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 114a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { 115091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 116091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.setSupportBackgroundTintList(tint); 117a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 118a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 119a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 120a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 121a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 122a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} 123a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 124a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 125a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 1268e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas @RestrictTo(LIBRARY_GROUP) 127a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 128a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 129a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public ColorStateList getSupportBackgroundTintList() { 130091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mBackgroundTintHelper != null 131091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mBackgroundTintHelper.getSupportBackgroundTintList() : null; 132a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 133a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 134a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 135a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 136091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, PorterDuff.Mode)} 137a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 138a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 139a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 1408e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas @RestrictTo(LIBRARY_GROUP) 141a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 142a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { 143091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 144091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode); 145a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 146a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 147a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 148a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 149a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 150a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} 151a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 152a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 153a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 1548e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas @RestrictTo(LIBRARY_GROUP) 155a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 156a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 157a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public PorterDuff.Mode getSupportBackgroundTintMode() { 158091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mBackgroundTintHelper != null 159091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null; 160a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 161a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 162a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 163a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes protected void drawableStateChanged() { 164a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes super.drawableStateChanged(); 165091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mBackgroundTintHelper != null) { 166091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mBackgroundTintHelper.applySupportBackgroundTint(); 167a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 168f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes if (mTextHelper != null) { 169f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes mTextHelper.applyCompoundDrawablesTints(); 170f7b73431b366b76bcf58536b7b1086489e4683b2Chris Banes } 171a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 172684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes 173091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Override 174091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setTextAppearance(Context context, int resId) { 175091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes super.setTextAppearance(context, resId); 176091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mTextHelper != null) { 177091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mTextHelper.onSetTextAppearance(context, resId); 178684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 179684dbfaf7105761b5a19a82e8273ed79d3b0641eChris Banes } 180012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes} 181