/*
* Copyright (C) 2016 Bilibili
*
* 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 com.bilibili.magicasakura.widgets;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.support.annotation.ColorRes;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import com.bilibili.magicasakura.utils.TintInfo;
import com.bilibili.magicasakura.utils.TintManager;
import com.wm.remusic.R;
/**
* @author xyczero617@gmail.com
* @time 15/9/26
*/
public class AppCompatTextHelper extends AppCompatBaseHelper {
//If writing like this:
//int[] ATTRS = { R.attr.tintText, android.R.attr.textColor, android.R.attr.textColorLink, ...};
//we can't get textColor value when api is below 20;
private static final int[] ATTRS = {
android.R.attr.textColor,
android.R.attr.textColorLink,
android.R.attr.textAppearance,
};
private int mTextColorId;
private int mTextLinkColorId;
private TintInfo mTextColorTintInfo;
private TintInfo mTextLinkColorTintInfo;
public AppCompatTextHelper(View view, TintManager tintManager) {
super(view, tintManager);
}
@SuppressWarnings("ResourceType")
@Override
void loadFromAttribute(AttributeSet attrs, int defStyleAttr) {
TypedArray array = mView.getContext().obtainStyledAttributes(attrs, ATTRS, defStyleAttr, 0);
int textColorId = array.getResourceId(0, 0);
if (textColorId == 0) {
setTextAppearanceForTextColor(array.getResourceId(2, 0), false);
} else {
setTextColor(textColorId);
}
if (array.hasValue(1)) {
setLinkTextColor(array.getResourceId(1, 0));
}
array.recycle();
}
/**
* External use
*/
public void setTextColor() {
if (skipNextApply()) return;
resetTextColorTintResource(0);
setSkipNextApply(false);
}
/**
* useless for setLinkTextColor is final
*/
@Deprecated
public void setTextLinkColor() {
if (skipNextApply()) return;
resetTextLinkColorTintResource(0);
setSkipNextApply(false);
}
public void setTextAppearanceForTextColor(int resId) {
resetTextColorTintResource(0);
setTextAppearanceForTextColor(resId, true);
}
public void setTextAppearanceForTextColor(int resId, boolean isForced) {
boolean isTextColorForced = isForced || mTextColorId == 0;
TypedArray appearance = mView.getContext().obtainStyledAttributes(resId, R.styleable.TextAppearance);
if (appearance.hasValue(R.styleable.TextAppearance_android_textColor) && isTextColorForced) {
setTextColor(appearance.getResourceId(R.styleable.TextAppearance_android_textColor, 0));
}
appearance.recycle();
}
public void setTextColorById(@ColorRes int colorId) {
setTextColor(colorId);
}
/**
* Internal use
*/
private void setTextColor(ColorStateList tint) {
if (skipNextApply()) return;
((TextView) mView).setTextColor(tint);
}
private void setTextColor(@ColorRes int resId) {
if (mTextColorId != resId) {
resetTextColorTintResource(resId);
if (resId != 0) {
setSupportTextColorTint(resId);
}
}
}
private void setLinkTextColor(@ColorRes int resId) {
if (mTextLinkColorId != resId) {
resetTextLinkColorTintResource(resId);
if (resId != 0) {
setSupportTextLinkColorTint(resId);
}
}
}
private void setSupportTextColorTint(int resId) {
if (resId != 0) {
if (mTextColorTintInfo == null) {
mTextColorTintInfo = new TintInfo();
}
mTextColorTintInfo.mHasTintList = true;
mTextColorTintInfo.mTintList = mTintManager.getColorStateList(resId);
}
applySupportTextColorTint();
}
private void setSupportTextLinkColorTint(int resId) {
if (resId != 0) {
if (mTextLinkColorTintInfo == null) {
mTextLinkColorTintInfo = new TintInfo();
}
mTextLinkColorTintInfo.mHasTintList = true;
mTextLinkColorTintInfo.mTintList = mTintManager.getColorStateList(resId);
}
applySupportTextLinkColorTint();
}
private void applySupportTextColorTint() {
if (mTextColorTintInfo != null && mTextColorTintInfo.mHasTintList) {
setTextColor(mTextColorTintInfo.mTintList);
}
}
private void applySupportTextLinkColorTint() {
if (mTextLinkColorTintInfo != null && mTextLinkColorTintInfo.mHasTintList) {
((TextView) mView).setLinkTextColor(mTextLinkColorTintInfo.mTintList);
}
}
private void resetTextColorTintResource(@ColorRes int resId/*text resource id*/) {
mTextColorId = resId;
if (mTextColorTintInfo != null) {
mTextColorTintInfo.mHasTintList = false;
mTextColorTintInfo.mTintList = null;
}
}
private void resetTextLinkColorTintResource(@ColorRes int resId/*text resource id*/) {
mTextLinkColorId = resId;
if (mTextLinkColorTintInfo != null) {
mTextLinkColorTintInfo.mHasTintList = false;
mTextLinkColorTintInfo.mTintList = null;
}
}
@Override
public void tint() {
if (mTextColorId != 0) {
setSupportTextColorTint(mTextColorId);
}
if (mTextLinkColorId != 0) {
setSupportTextLinkColorTint(mTextLinkColorId);
}
}
public interface TextExtensible {
void setTextColorById(@ColorRes int colorId);
}
}