AppCompatEditText.java revision a5f106fbd09335ae504c39b1ee1e0caa3f1238e3
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
17469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banespackage android.support.v7.internal.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;
24469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.util.AttributeSet;
25469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.widget.EditText;
26469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
27469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/**
28469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * An tint aware {@link android.widget.EditText}.
29fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * <p>
30fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * This will automatically be used when you use {@link android.widget.EditText} in your
31fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes * layouts. You should only need to manually use this class when writing custom views.
32469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */
33a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banespublic class TintEditText extends EditText implements TintableBackgroundView {
34469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
35469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    private static final int[] TINT_ATTRS = {
36469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes            android.R.attr.background
37469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    };
38469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
39a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    private TintInfo mBackgroundTint;
40a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
41469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public TintEditText(Context context) {
42469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        this(context, null);
43469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
44469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
45469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public TintEditText(Context context, AttributeSet attrs) {
46469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        this(context, attrs, android.R.attr.editTextStyle);
47469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
48469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
49469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    public TintEditText(Context context, AttributeSet attrs, int defStyleAttr) {
50469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes        super(context, attrs, defStyleAttr);
51469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes
52fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes        if (TintManager.SHOULD_BE_USED) {
53fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes            TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,
54fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes                    TINT_ATTRS, defStyleAttr, 0);
55fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes            if (a.hasValue(0)) {
56a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes                setSupportBackgroundTintList(
57a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes                        a.getTintManager().getColorStateList(a.getResourceId(0, -1)));
58fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes            }
59fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes            a.recycle();
60fd1eb27a3700de31507de34fd1bcc51830fe876cChris Banes        }
61469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes    }
62a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
63a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    /**
64a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * This should be accessed via
65a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View,
66a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * android.content.res.ColorStateList)}
67a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     *
68a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * @hide
69a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     */
70a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
71a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
72a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        if (mBackgroundTint == null) {
73a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes            mBackgroundTint = new TintInfo();
74a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        }
75a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        mBackgroundTint.mTintList = tint;
76a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        applySupportBackgroundTint();
77a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
78a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
79a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    /**
80a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * This should be accessed via
81a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)}
82a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     *
83a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * @hide
84a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     */
85a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
86a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Nullable
87a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    public ColorStateList getSupportBackgroundTintList() {
88a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        return mBackgroundTint != null ? mBackgroundTint.mTintList : null;
89a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
90a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
91a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    /**
92a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * This should be accessed via
93a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode)}
94a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     *
95a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * @hide
96a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     */
97a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
98a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
99a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        if (mBackgroundTint == null) {
100a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes            mBackgroundTint = new TintInfo();
101a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        }
102a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        mBackgroundTint.mTintMode = tintMode;
103a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        applySupportBackgroundTint();
104a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
105a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
106a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    /**
107a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * This should be accessed via
108a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)}
109a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     *
110a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     * @hide
111a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes     */
112a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
113a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Nullable
114a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    public PorterDuff.Mode getSupportBackgroundTintMode() {
115a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        return mBackgroundTint != null ? mBackgroundTint.mTintMode : null;
116a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
117a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
118a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    @Override
119a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    protected void drawableStateChanged() {
120a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        super.drawableStateChanged();
121a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        applySupportBackgroundTint();
122a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
123a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes
124a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    private void applySupportBackgroundTint() {
125a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        if (getBackground() != null && mBackgroundTint != null) {
126a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes            TintManager.tintViewBackground(this, mBackgroundTint);
127a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes        }
128a5f106fbd09335ae504c39b1ee1e0caa3f1238e3Chris Banes    }
129469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes}
130