package com.v7lin.android.env;
import java.io.File;
import android.content.Context;
import android.content.res.Resources;
import android.text.TextUtils;
import com.v7lin.android.env.font.FontFactory;
import com.v7lin.android.env.font.FontFamily;
import com.v7lin.android.env.skin.SkinFactory;
import com.v7lin.android.env.skin.SkinFamily;
/**
*
*
* @author v7lin E-mail:v7lin@qq.com
*/
public class EnvResourcesManager {
private boolean mScheduleSkin = true;
private boolean mScheduleFont = true;
private EnvSetup mEnvSetup = NullEnvSetup.getInstance();
private SkinChecker mSkinChecker = NullSkinChecker.getInstance();
public EnvResourcesManager() {
super();
}
public void setEnvSetup(EnvSetup setup) {
mEnvSetup = new EnvSetupWrapper(setup != null ? setup : NullEnvSetup.getInstance());
}
class EnvSetupWrapper implements EnvSetup {
private EnvSetup mWrapped;
public EnvSetupWrapper(EnvSetup wrapped) {
super();
mWrapped = wrapped;
}
@Override
public String getSkinPath(Context context) {
return mScheduleSkin ? mWrapped.getSkinPath(context) : context.getPackageResourcePath();
}
@Override
public String getFontPath(Context context) {
return mScheduleFont ? mWrapped.getFontPath(context) : "";
}
}
public void setSkinChecker(SkinChecker checker) {
mSkinChecker = checker != null ? checker : NullSkinChecker.getInstance();
}
void setScheduleSkin(boolean scheduleSkin) {
mScheduleSkin = scheduleSkin;
}
void setScheduleFont(boolean scheduleFont) {
mScheduleFont = scheduleFont;
}
public String getSkinPath(Context context) {
String skinPath = getRealSkinPath(context);
if (!isSkinPathValid(context, skinPath)) {
skinPath = "";
}
return skinPath;
}
public String getSkinPkg(Context context) {
SkinFamily skinFamily = getSkinFamily(context);
return skinFamily != null ? skinFamily.getSkinPkg() : context.getPackageName();
}
public Resources getSkinRes(Context context) {
SkinFamily skinFamily = getSkinFamily(context);
return skinFamily != null ? skinFamily.getResources() : null;
}
public SkinFamily getSkinFamily(Context context) {
return getTopLevelSkinFamily(context, getRealSkinPath(context));
}
private String getRealSkinPath(Context context) {
return mEnvSetup.getSkinPath(context);
}
private boolean isSkinPathValid(Context context, String skinPath) {
return mSkinChecker.isSkinValid(context, skinPath);
}
public boolean isSkinChanged(Context context, String compareSkinPath) {
String skinPath = getRealSkinPath(context);
return !TextUtils.equals(compareSkinPath, skinPath);
}
public synchronized SkinFamily getTopLevelSkinFamily(Context context, String skinPath) {
SkinFamily skinFamily = null;
if (!TextUtils.isEmpty(skinPath)) {
if (isSkinPathValid(context, skinPath)) {
skinFamily = EnvResourcesCache.getInstance().getActiveSkinFamily(skinPath);
if (!SkinFactory.isValid(skinFamily)) {
skinFamily = SkinFactory.makeSkin(context, skinPath);
EnvResourcesCache.getInstance().putActiveSkinFamily(skinPath, skinFamily);
}
} else {
EnvResourcesCache.getInstance().removeActiveSkinFamily(skinPath);
}
}
return skinFamily;
}
public String getFontPath(Context context) {
String fontPath = getRealFontPath(context);
if (!isFontPathValid(context, fontPath)) {
fontPath = "";
}
return fontPath;
}
public FontFamily getFontFamily(Context context) {
return getTopLevelFontFamily(context, getRealFontPath(context));
}
private String getRealFontPath(Context context) {
return mEnvSetup.getFontPath(context);
}
private boolean isFontPathValid(Context context, String fontPath) {
boolean exist = false;
if (!TextUtils.isEmpty(fontPath)) {
File fontFile = new File(fontPath);
exist = fontFile.exists() && fontFile.isFile();
}
return exist;
}
public boolean isFontChanged(Context context, String compareFontPath) {
String fontPath = getRealFontPath(context);
return !TextUtils.equals(compareFontPath, fontPath);
}
public synchronized FontFamily getTopLevelFontFamily(Context context, String fontPath) {
FontFamily fontFamily = null;
if (!TextUtils.isEmpty(fontPath)) {
if (isFontPathValid(context, fontPath)) {
fontFamily = EnvResourcesCache.getInstance().getActiveFontFamily(fontPath);
if (!FontFactory.isValid(fontFamily)) {
fontFamily = FontFactory.makeFont(context, fontPath);
EnvResourcesCache.getInstance().putActiveFontFamily(fontPath, fontFamily);
}
} else {
EnvResourcesCache.getInstance().removeActiveFontFamily(fontPath);// 删除失效字体
}
}
return fontFamily;
}
private static class EnvResourcesManagerHolder {
private static final EnvResourcesManager INSTANCE = new EnvResourcesManager();
}
public static EnvResourcesManager getGlobal() {
return EnvResourcesManagerHolder.INSTANCE;
}
}