AppCompatAutoCompleteTextView.java revision 2cccf609662389d6a23dbc0711d5fb2e826e8c63
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 19012047c60d03e61498955b7fa3e9cb9b409fbad8Chris 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; 29012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banesimport android.util.AttributeSet; 30012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banesimport android.widget.AutoCompleteTextView; 31012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 32012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes/** 332cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes * A tint aware {@link android.widget.AutoCompleteTextView}. 34fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * <p> 35fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * This will automatically be used when you use {@link AutoCompleteTextView} in your layouts. You 36fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * should only need to manually use this class writing custom views. 37012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes */ 382cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespublic class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements 39a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TintableBackgroundView { 40012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 41012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes private static final int[] TINT_ATTRS = { 42012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes android.R.attr.background, 43012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes android.R.attr.popupBackground 44012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes }; 45012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 46a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes private TintManager mTintManager; 47a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes private TintInfo mBackgroundTint; 48f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes 492cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatAutoCompleteTextView(Context context) { 50012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes this(context, null); 51012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 52012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 532cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatAutoCompleteTextView(Context context, AttributeSet attrs) { 542cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes this(context, attrs, R.attr.autoCompleteTextViewStyle); 55012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 56012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 572cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 58911642499da7d796aa1e7c19178c3552a590f48bChris Banes super(TintContextWrapper.wrap(context), attrs, defStyleAttr); 59012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 60a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (TintManager.SHOULD_BE_USED) { 61a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, 62a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TINT_ATTRS, defStyleAttr, 0); 63a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mTintManager = a.getTintManager(); 64f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes 65a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (a.hasValue(0)) { 66a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes setSupportBackgroundTintList( 67cd6e77607caba0b3b26163791a361938afb8b9c5Chris Banes mTintManager.getTintList(a.getResourceId(0, -1))); 68a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 69a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (a.hasValue(1)) { 70a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes setDropDownBackgroundDrawable(a.getDrawable(1)); 71a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 72a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes a.recycle(); 73a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 74f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes } 75f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes 76f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes @Override 77f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes public void setDropDownBackgroundResource(int id) { 78f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes setDropDownBackgroundDrawable(mTintManager.getDrawable(id)); 79012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 80a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 81a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 82a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 83a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, 84a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * android.content.res.ColorStateList)} 85a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 86a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 87a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 88a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 89a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { 90a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (mBackgroundTint == null) { 91a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint = new TintInfo(); 92a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 93a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint.mTintList = tint; 942cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes mBackgroundTint.mHasTintList = true; 952cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes 96a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 97a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 98a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 99a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 100a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 101a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} 102a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 103a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 104a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 105a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 106a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 107a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public ColorStateList getSupportBackgroundTintList() { 108a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes return mBackgroundTint != null ? mBackgroundTint.mTintList : null; 109a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 110a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 111a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 112a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 113a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} 114a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 115a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 116a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 117a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 118a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { 119a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (mBackgroundTint == null) { 120a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint = new TintInfo(); 121a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 122a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint.mTintMode = tintMode; 1232cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes mBackgroundTint.mHasTintMode = true; 1242cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes 125a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 126a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 127a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 128a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 129a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 130a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} 131a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 132a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 133a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 134a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 135a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 136a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public PorterDuff.Mode getSupportBackgroundTintMode() { 137a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; 138a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 139a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 140a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 141a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes protected void drawableStateChanged() { 142a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes super.drawableStateChanged(); 143a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 144a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 145a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 146a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes private void applySupportBackgroundTint() { 147a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (getBackground() != null && mBackgroundTint != null) { 148a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TintManager.tintViewBackground(this, mBackgroundTint); 149a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 150a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 151012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes} 152