|  | /* | 
|  | * Copyright (C) 2015 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | package android.support.v7.widget; | 
|  |  | 
|  | import android.content.Context; | 
|  | import android.content.res.ColorStateList; | 
|  | import android.graphics.PorterDuff; | 
|  | import android.graphics.drawable.Drawable; | 
|  | import android.support.annotation.DrawableRes; | 
|  | import android.support.annotation.Nullable; | 
|  | import android.support.annotation.RestrictTo; | 
|  | import android.support.v4.view.TintableBackgroundView; | 
|  | import android.support.v7.appcompat.R; | 
|  | import android.util.AttributeSet; | 
|  | import android.widget.TextView; | 
|  |  | 
|  | import static android.support.annotation.RestrictTo.Scope.GROUP_ID; | 
|  |  | 
|  | /** | 
|  | * A {@link TextView} which supports compatible features on older version of the platform, | 
|  | * including: | 
|  | * <ul> | 
|  | *     <li>Supports {@link R.attr#textAllCaps} style attribute which works back to | 
|  | *     {@link android.os.Build.VERSION_CODES#GINGERBREAD Gingerbread}.</li> | 
|  | *     <li>Allows dynamic tint of it background via the background tint methods in | 
|  | *     {@link android.support.v4.view.ViewCompat}.</li> | 
|  | *     <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and | 
|  | *     {@link R.attr#backgroundTintMode}.</li> | 
|  | * </ul> | 
|  | * | 
|  | * <p>This will automatically be used when you use {@link TextView} in your layouts. | 
|  | * You should only need to manually use this class when writing custom views.</p> | 
|  | */ | 
|  | public class AppCompatTextView extends TextView implements TintableBackgroundView { | 
|  |  | 
|  | private AppCompatBackgroundHelper mBackgroundTintHelper; | 
|  | private AppCompatTextHelper mTextHelper; | 
|  |  | 
|  | public AppCompatTextView(Context context) { | 
|  | this(context, null); | 
|  | } | 
|  |  | 
|  | public AppCompatTextView(Context context, AttributeSet attrs) { | 
|  | this(context, attrs, android.R.attr.textViewStyle); | 
|  | } | 
|  |  | 
|  | public AppCompatTextView(Context context, AttributeSet attrs, int defStyleAttr) { | 
|  | super(TintContextWrapper.wrap(context), attrs, defStyleAttr); | 
|  |  | 
|  | mBackgroundTintHelper = new AppCompatBackgroundHelper(this); | 
|  | mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr); | 
|  |  | 
|  | mTextHelper = AppCompatTextHelper.create(this); | 
|  | mTextHelper.loadFromAttributes(attrs, defStyleAttr); | 
|  | mTextHelper.applyCompoundDrawablesTints(); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void setBackgroundResource(@DrawableRes int resId) { | 
|  | super.setBackgroundResource(resId); | 
|  | if (mBackgroundTintHelper != null) { | 
|  | mBackgroundTintHelper.onSetBackgroundResource(resId); | 
|  | } | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void setBackgroundDrawable(Drawable background) { | 
|  | super.setBackgroundDrawable(background); | 
|  | if (mBackgroundTintHelper != null) { | 
|  | mBackgroundTintHelper.onSetBackgroundDrawable(background); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * This should be accessed via | 
|  | * {@link android.support.v4.view.ViewCompat#setBackgroundTintList(android.view.View, ColorStateList)} | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @RestrictTo(GROUP_ID) | 
|  | @Override | 
|  | public void setSupportBackgroundTintList(@Nullable ColorStateList tint) { | 
|  | if (mBackgroundTintHelper != null) { | 
|  | mBackgroundTintHelper.setSupportBackgroundTintList(tint); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * This should be accessed via | 
|  | * {@link android.support.v4.view.ViewCompat#getBackgroundTintList(android.view.View)} | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @RestrictTo(GROUP_ID) | 
|  | @Override | 
|  | @Nullable | 
|  | public ColorStateList getSupportBackgroundTintList() { | 
|  | return mBackgroundTintHelper != null | 
|  | ? mBackgroundTintHelper.getSupportBackgroundTintList() : null; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * This should be accessed via | 
|  | * {@link android.support.v4.view.ViewCompat#setBackgroundTintMode(android.view.View, PorterDuff.Mode)} | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @RestrictTo(GROUP_ID) | 
|  | @Override | 
|  | public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) { | 
|  | if (mBackgroundTintHelper != null) { | 
|  | mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * This should be accessed via | 
|  | * {@link android.support.v4.view.ViewCompat#getBackgroundTintMode(android.view.View)} | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @RestrictTo(GROUP_ID) | 
|  | @Override | 
|  | @Nullable | 
|  | public PorterDuff.Mode getSupportBackgroundTintMode() { | 
|  | return mBackgroundTintHelper != null | 
|  | ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void setTextAppearance(Context context, int resId) { | 
|  | super.setTextAppearance(context, resId); | 
|  | if (mTextHelper != null) { | 
|  | mTextHelper.onSetTextAppearance(context, resId); | 
|  | } | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected void drawableStateChanged() { | 
|  | super.drawableStateChanged(); | 
|  | if (mBackgroundTintHelper != null) { | 
|  | mBackgroundTintHelper.applySupportBackgroundTint(); | 
|  | } | 
|  | if (mTextHelper != null) { | 
|  | mTextHelper.applyCompoundDrawablesTints(); | 
|  | } | 
|  | } | 
|  | } |