package com.v7lin.android.env.widget; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import com.v7lin.android.env.EnvCallback; import com.v7lin.android.env.EnvResourcesManager; import java.util.concurrent.atomic.AtomicBoolean; /** * * * @author v7lin E-mail:v7lin@qq.com */ public abstract class EnvUIChanger<UI, UIC> { private Context mContext; private String mSkinPath; private String mFontPath; private final AtomicBoolean mInitSkinFlag = new AtomicBoolean(false); private final AtomicBoolean mInitFontFlag = new AtomicBoolean(false); public EnvUIChanger(Context context) { super(); mContext = context; mSkinPath = EnvResourcesManager.getGlobal().getSkinPath(context); mFontPath = EnvResourcesManager.getGlobal().getFontPath(context); } public final boolean isSkinChanged() { return EnvResourcesManager.getGlobal().isSkinChanged(mContext, mSkinPath); } public final boolean isFontChanged() { return EnvResourcesManager.getGlobal().isFontChanged(mContext, mFontPath); } public final void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, boolean allowSysRes, boolean isInEditMode) { if (!isInEditMode) { onApplyStyle(context, attrs, defStyleAttr, defStyleRes, allowSysRes); } } protected abstract void onApplyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, boolean allowSysRes); public final void applyAttr(Context context, int attr, int resid, boolean allowSysRes, boolean isInEditMode) { if (!isInEditMode) { onApplyAttr(context, attr, resid, allowSysRes); } } protected abstract void onApplyAttr(Context context, int attr, int resid, boolean allowSysRes); public final void scheduleSkin(UI ui, UIC call, boolean isInEditMode) { if (!isInEditMode && (isSkinChanged() || mInitSkinFlag.compareAndSet(false, true))) { mSkinPath = EnvResourcesManager.getGlobal().getSkinPath(mContext); onScheduleSkin(ui, call); } } protected abstract void onScheduleSkin(UI ui, UIC call); public final void scheduleFont(UI ui, UIC call, boolean isInEditMode) { if (!isInEditMode && (isFontChanged() || mInitFontFlag.compareAndSet(false, true))) { mFontPath = EnvResourcesManager.getGlobal().getFontPath(mContext); onScheduleFont(ui, call); } } protected abstract void onScheduleFont(UI ui, UIC call); protected final void scheduleViewSkin(View view) { if (view != null) { if (view instanceof EnvCallback) { ((EnvCallback) view).scheduleSkin(); } else if (view instanceof ViewGroup) { scheduleViewGroupSkin((ViewGroup) view); } } } protected final void scheduleViewGroupSkin(ViewGroup group) { if (group != null) { final int childCount = group.getChildCount(); for (int i = 0; i < childCount; i++) { View child = group.getChildAt(i); scheduleViewSkin(child); } } } protected final void scheduleViewFont(View view) { if (view != null) { if (view instanceof EnvCallback) { ((EnvCallback) view).scheduleFont(); } else if (view instanceof ViewGroup) { scheduleViewGroupFont((ViewGroup) view); } } } protected final void scheduleViewGroupFont(ViewGroup group) { if (group != null) { final int childCount = group.getChildCount(); for (int i = 0; i < childCount; i++) { View child = group.getChildAt(i); scheduleViewFont(child); } } } }