AppCompatAutoCompleteTextView.java revision 911642499da7d796aa1e7c19178c3552a590f48b
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 17012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banespackage android.support.v7.internal.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; 24012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banesimport android.util.AttributeSet; 25012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banesimport android.widget.AutoCompleteTextView; 26012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 27012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes/** 28012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes * An tint aware {@link android.widget.AutoCompleteTextView}. 29fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * <p> 30fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * This will automatically be used when you use {@link AutoCompleteTextView} in your layouts. You 31fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * should only need to manually use this class writing custom views. 32012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes */ 33a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banespublic class TintAutoCompleteTextView extends AutoCompleteTextView implements 34a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TintableBackgroundView { 35012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 36012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes private static final int[] TINT_ATTRS = { 37012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes android.R.attr.background, 38012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes android.R.attr.popupBackground 39012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes }; 40012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 41a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes private TintManager mTintManager; 42a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes private TintInfo mBackgroundTint; 43f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes 44012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes public TintAutoCompleteTextView(Context context) { 45012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes this(context, null); 46012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 47012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 48012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes public TintAutoCompleteTextView(Context context, AttributeSet attrs) { 49012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes this(context, attrs, android.R.attr.autoCompleteTextViewStyle); 50012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 51012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 52012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes public TintAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 53911642499da7d796aa1e7c19178c3552a590f48bChris Banes super(TintContextWrapper.wrap(context), attrs, defStyleAttr); 54012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes 55a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (TintManager.SHOULD_BE_USED) { 56a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs, 57a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TINT_ATTRS, defStyleAttr, 0); 58a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mTintManager = a.getTintManager(); 59f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes 60a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (a.hasValue(0)) { 61a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes setSupportBackgroundTintList( 62a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mTintManager.getColorStateList(a.getResourceId(0, -1))); 63a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 64a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (a.hasValue(1)) { 65a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes setDropDownBackgroundDrawable(a.getDrawable(1)); 66a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 67a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes a.recycle(); 68a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 69f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes } 70f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes 71f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes @Override 72f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes public void setDropDownBackgroundResource(int id) { 73f0befbfd05c33c4dc6667a051f9b69a47dfe4aa7Chris Banes setDropDownBackgroundDrawable(mTintManager.getDrawable(id)); 74012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes } 75a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 76a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 77a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 78a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, 79a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * android.content.res.ColorStateList)} 80a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 81a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 82a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 83a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 84a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { 85a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (mBackgroundTint == null) { 86a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint = new TintInfo(); 87a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 88a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint.mTintList = tint; 89a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 90a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 91a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 92a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 93a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 94a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} 95a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 96a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 97a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 98a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 99a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 100a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public ColorStateList getSupportBackgroundTintList() { 101a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes return mBackgroundTint != null ? mBackgroundTint.mTintList : null; 102a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 103a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 104a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 105a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 106a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)} 107a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 108a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 109a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 110a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 111a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { 112a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (mBackgroundTint == null) { 113a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint = new TintInfo(); 114a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 115a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes mBackgroundTint.mTintMode = tintMode; 116a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 117a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 118a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 119a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes /** 120a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * This should be accessed via 121a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} 122a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * 123a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes * @hide 124a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes */ 125a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 126a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Nullable 127a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes public PorterDuff.Mode getSupportBackgroundTintMode() { 128a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes return mBackgroundTint != null ? mBackgroundTint.mTintMode : null; 129a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 130a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 131a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes @Override 132a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes protected void drawableStateChanged() { 133a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes super.drawableStateChanged(); 134a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes applySupportBackgroundTint(); 135a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 136a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes 137a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes private void applySupportBackgroundTint() { 138a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes if (getBackground() != null && mBackgroundTint != null) { 139a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes TintManager.tintViewBackground(this, mBackgroundTint); 140a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 141a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes } 142012047c60d03e61498955b7fa3e9cb9b409fbad8Chris Banes} 143