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