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