AppCompatEditText.java revision 2cccf609662389d6a23dbc0711d5fb2e826e8c63
1469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/*
2469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Copyright (C) 2014 The Android Open Source Project
3469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes *
4469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * you may not use this file except in compliance with the License.
6469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * You may obtain a copy of the License at
7469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes *
8469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes *
10469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Unless required by applicable law or agreed to in writing, software
11469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * See the License for the specific language governing permissions and
14469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * limitations under the License.
15469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */
16469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
172cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespackage android.support.v7.widget;
18469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
19469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris 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;
29469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.util.AttributeSet;
30469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.widget.EditText;
31469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
32469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/**
332cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes * A tint aware {@link android.widget.EditText}.
34fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * <p>
35fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * This will automatically be used when you use {@link android.widget.EditText} in your
36fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * layouts. You should only need to manually use this class when writing custom views.
37469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */
382cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespublic class AppCompatEditText extends EditText implements TintableBackgroundView {
39469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
40469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    private static final int[] TINT_ATTRS = {
41469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes            android.R.attr.background
42469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    };
43469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
44a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    private TintInfo mBackgroundTint;
45a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
462cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes    public AppCompatEditText(Context context) {
47469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        this(context, null);
48469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
49469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
502cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes    public AppCompatEditText(Context context, AttributeSet attrs) {
512cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes        this(TintContextWrapper.wrap(context), attrs, R.attr.editTextStyle);
52469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
53469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
542cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes    public AppCompatEditText(Context context, AttributeSet attrs, int defStyleAttr) {
55469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        super(context, attrs, defStyleAttr);
56469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
57fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes        if (TintManager.SHOULD_BE_USED) {
58fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes            TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,
59fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes                    TINT_ATTRS, defStyleAttr, 0);
60fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes            if (a.hasValue(0)) {
61a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes                setSupportBackgroundTintList(
62cd6e77607caba0b3b26163791a361938afb8b9c5Chris Banes                        a.getTintManager().getTintList(a.getResourceId(0, -1)));
63fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes            }
64fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes            a.recycle();
65fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes        }
66469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
67a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
68a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    /**
69a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * This should be accessed via
70a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View,
71a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * android.content.res.ColorStateList)}
72a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     *
73a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * @hide
74a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     */
75a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
76a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
77a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        if (mBackgroundTint == null) {
78a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes            mBackgroundTint = new TintInfo();
79a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        }
80a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        mBackgroundTint.mTintList = tint;
812cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes        mBackgroundTint.mHasTintList = true;
822cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes
83a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        applySupportBackgroundTint();
84a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
85a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
86a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    /**
87a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * This should be accessed via
88a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)}
89a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     *
90a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * @hide
91a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     */
92a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
93a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Nullable
94a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    public ColorStateList getSupportBackgroundTintList() {
95a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        return mBackgroundTint != null ? mBackgroundTint.mTintList : null;
96a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
97a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
98a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    /**
99a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * This should be accessed via
100a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)}
101a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     *
102a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * @hide
103a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     */
104a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
105a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
106a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        if (mBackgroundTint == null) {
107a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes            mBackgroundTint = new TintInfo();
108a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        }
109a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        mBackgroundTint.mTintMode = tintMode;
1102cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes        mBackgroundTint.mHasTintMode = true;
1112cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes
112a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        applySupportBackgroundTint();
113a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
114a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
115a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    /**
116a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * This should be accessed via
117a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)}
118a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     *
119a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * @hide
120a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     */
121a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
122a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Nullable
123a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    public PorterDuff.Mode getSupportBackgroundTintMode() {
124a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        return mBackgroundTint != null ? mBackgroundTint.mTintMode : null;
125a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
126a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
127a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
128a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    protected void drawableStateChanged() {
129a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        super.drawableStateChanged();
130a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        applySupportBackgroundTint();
131a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
132a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
133a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    private void applySupportBackgroundTint() {
134a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        if (getBackground() != null && mBackgroundTint != null) {
135a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes            TintManager.tintViewBackground(this, mBackgroundTint);
136a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        }
137a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
138469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes}
139