package com.v7lin.android.env.widget; import java.util.Arrays; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.TextView; import com.v7lin.android.env.EnvRes; import com.v7lin.android.env.EnvResourcesHelper; import com.v7lin.android.env.EnvTypedArray; /** * * * @author v7lin E-mail:v7lin@qq.com */ class EnvTextViewChanger<TV extends TextView, TVC extends XTextViewCall> extends EnvViewChanger<TV, TVC> { private static final int[] ATTRS = { // android.R.attr.drawableLeft, // android.R.attr.drawableTop, // android.R.attr.drawableRight, // android.R.attr.drawableBottom, // android.R.attr.textAppearance, // android.R.attr.textColorHighlight, // android.R.attr.textColor, // android.R.attr.textColorHint, // android.R.attr.textColorLink }; private static final int[] ATTRS_TEXT = { // android.R.attr.textColorHighlight, // android.R.attr.textColor, // android.R.attr.textColorHint, // android.R.attr.textColorLink }; static { Arrays.sort(ATTRS); Arrays.sort(ATTRS_TEXT); } private EnvRes mDrawableLeftEnvRes; private EnvRes mDrawableTopEnvRes; private EnvRes mDrawableRightEnvRes; private EnvRes mDrawableBottomEnvRes; private EnvRes mTextColorHighlightEnvRes; private EnvRes mTextColorEnvRes; private EnvRes mTextColorHintEnvRes; private EnvRes mTextColorLinkEnvRes; public EnvTextViewChanger(Context context) { super(context); } @Override protected void onApplyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, boolean allowSysRes) { super.onApplyStyle(context, attrs, defStyleAttr, defStyleRes, allowSysRes); EnvTypedArray array = EnvTypedArray.obtainStyledAttributes(context, attrs, ATTRS, defStyleAttr, defStyleRes); mDrawableLeftEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.drawableLeft), allowSysRes); mDrawableTopEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.drawableTop), allowSysRes); mDrawableRightEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.drawableRight), allowSysRes); mDrawableBottomEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.drawableBottom), allowSysRes); EnvRes textAppearanceEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.textAppearance), allowSysRes); if (textAppearanceEnvRes != null) { EnvTypedArray textAppearanceArray = EnvTypedArray.obtainStyledAttributes(context, textAppearanceEnvRes.getResid(), ATTRS_TEXT); mTextColorHighlightEnvRes = textAppearanceArray.getEnvRes(Arrays.binarySearch(ATTRS_TEXT, android.R.attr.textColorHighlight), allowSysRes); mTextColorEnvRes = textAppearanceArray.getEnvRes(Arrays.binarySearch(ATTRS_TEXT, android.R.attr.textColor), allowSysRes); mTextColorHintEnvRes = textAppearanceArray.getEnvRes(Arrays.binarySearch(ATTRS_TEXT, android.R.attr.textColorHint), allowSysRes); mTextColorLinkEnvRes = textAppearanceArray.getEnvRes(Arrays.binarySearch(ATTRS_TEXT, android.R.attr.textColorLink), allowSysRes); textAppearanceArray.recycle(); } mTextColorHighlightEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.textColorHighlight), mTextColorHighlightEnvRes, allowSysRes); mTextColorEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.textColor), mTextColorEnvRes, allowSysRes); mTextColorHintEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.textColorHint), mTextColorHintEnvRes, allowSysRes); mTextColorLinkEnvRes = array.getEnvRes(Arrays.binarySearch(ATTRS, android.R.attr.textColorLink), mTextColorLinkEnvRes, allowSysRes); array.recycle(); } @Override protected void onApplyAttr(Context context, int attr, int resid, boolean allowSysRes) { super.onApplyAttr(context, attr, resid, allowSysRes); switch (attr) { case android.R.attr.textAppearance: { EnvTypedArray textAppearanceArray = EnvTypedArray.obtainStyledAttributes(context, resid, ATTRS_TEXT); mTextColorHighlightEnvRes = textAppearanceArray.getEnvRes(Arrays.binarySearch(ATTRS_TEXT, android.R.attr.textColorHighlight), mTextColorHighlightEnvRes, allowSysRes); mTextColorEnvRes = textAppearanceArray.getEnvRes(Arrays.binarySearch(ATTRS_TEXT, android.R.attr.textColor), mTextColorEnvRes, allowSysRes); mTextColorHintEnvRes = textAppearanceArray.getEnvRes(Arrays.binarySearch(ATTRS_TEXT, android.R.attr.textColorHint), mTextColorHintEnvRes, allowSysRes); mTextColorLinkEnvRes = textAppearanceArray.getEnvRes(Arrays.binarySearch(ATTRS_TEXT, android.R.attr.textColorLink), mTextColorLinkEnvRes, allowSysRes); textAppearanceArray.recycle(); break; } case android.R.attr.drawableLeft: { EnvRes res = new EnvRes(resid); mDrawableLeftEnvRes = res.isValid(context, allowSysRes) ? res : null; break; } case android.R.attr.drawableTop: { EnvRes res = new EnvRes(resid); mDrawableTopEnvRes = res.isValid(context, allowSysRes) ? res : null; break; } case android.R.attr.drawableRight: { EnvRes res = new EnvRes(resid); mDrawableRightEnvRes = res.isValid(context, allowSysRes) ? res : null; break; } case android.R.attr.drawableBottom: { EnvRes res = new EnvRes(resid); mDrawableBottomEnvRes = res.isValid(context, allowSysRes) ? res : null; break; } default: { break; } } } @Override protected void onScheduleSkin(TV view, TVC call) { super.onScheduleSkin(view, call); scheduleCompoundDrawable(view, call); scheduleTextColor(view, call); } @Override protected void onScheduleFont(TV view, TVC call) { super.onScheduleFont(view, call); Typeface tf = EnvResourcesHelper.getFontFamily(view.getContext()).getTypeface(); view.setTypeface(tf); } private void scheduleCompoundDrawable(TV view, TVC call) { Resources res = view.getResources(); if (mDrawableLeftEnvRes != null || mDrawableTopEnvRes != null || mDrawableRightEnvRes != null || mDrawableBottomEnvRes != null) { EnvRes[] compoundResCache = new EnvRes[4]; compoundResCache[0] = mDrawableLeftEnvRes; compoundResCache[1] = mDrawableTopEnvRes; compoundResCache[2] = mDrawableRightEnvRes; compoundResCache[3] = mDrawableBottomEnvRes; Drawable drawableLeft = mDrawableLeftEnvRes != null ? res.getDrawable(mDrawableLeftEnvRes.getResid()) : null; Drawable drawableTop = mDrawableTopEnvRes != null ? res.getDrawable(mDrawableTopEnvRes.getResid()) : null; Drawable drawableRight = mDrawableRightEnvRes != null ? res.getDrawable(mDrawableRightEnvRes.getResid()) : null; Drawable drawableBottom = mDrawableBottomEnvRes != null ? res.getDrawable(mDrawableBottomEnvRes.getResid()) : null; if (drawableLeft != null || drawableTop != null || drawableRight != null || drawableBottom != null) { final int drawablePadding = view.getCompoundDrawablePadding(); call.scheduleCompoundDrawablesWithIntrinsicBounds(drawableLeft, drawableTop, drawableRight, drawableBottom); view.setCompoundDrawablePadding(drawablePadding); mDrawableLeftEnvRes = compoundResCache[0]; mDrawableTopEnvRes = compoundResCache[1]; mDrawableRightEnvRes = compoundResCache[2]; mDrawableBottomEnvRes = compoundResCache[3]; } } } private void scheduleTextColor(TV view, TVC call) { Resources res = view.getResources(); if (mTextColorHighlightEnvRes != null) { int textColorHighlight = res.getColor(mTextColorHighlightEnvRes.getResid()); call.scheduleHighlightColor(textColorHighlight); } if (mTextColorEnvRes != null) { ColorStateList textColor = res.getColorStateList(mTextColorEnvRes.getResid()); call.scheduleTextColor(textColor); } if (mTextColorHintEnvRes != null) { ColorStateList textColorHint = res.getColorStateList(mTextColorHintEnvRes.getResid()); call.scheduleHintTextColor(textColorHint); } if (mTextColorLinkEnvRes != null) { ColorStateList textColorLink = res.getColorStateList(mTextColorLinkEnvRes.getResid()); call.scheduleLinkTextColor(textColorLink); } } }