package com.v7lin.android.env;
import java.util.Arrays;
import java.util.List;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import com.v7lin.skin.BuildConfig;
/**
*
*
* @author v7lin E-mail:v7lin@qq.com
*/
public class EnvLayoutInflaterWrapper extends LayoutInflater {
private static final String[] sClassPrefixArray = {
// widget
"android.widget.",
// webkit
"android.webkit.",
// view
"android.view.",
// app
"android.app." };
private static final List<String> sClassPrefixList = Arrays.asList(sClassPrefixArray);
private EnvViewMap mViewMap;
public EnvLayoutInflaterWrapper(LayoutInflater original, Context newContext, EnvViewMap viewMap) {
super(original, newContext);
mViewMap = viewMap != null ? viewMap : NullViewMap.getInstance();
setup();
}
private void setup() {
Factory factory = getFactory();
if (!(factory instanceof EnvFactory)) {
setFactory(new EnvFactory(factory));
}
}
@Override
public LayoutInflater cloneInContext(Context newContext) {
return new EnvLayoutInflaterWrapper(this, newContext, mViewMap);
}
/**
* 替换掉某些 SDK 中有 BUG 的 View 或 Widget 或者 替换为某些特殊定制的 View 或
* Widget(兼容高版本的一些特性或时下流行元素等)
*/
protected String transfer(String name) {
String transferName = InternalViewMap.getInstance().transfer(name);
if (TextUtils.isEmpty(transferName)) {
transferName = mViewMap.transfer(name);
if (TextUtils.isEmpty(transferName)) {
transferName = name;
}
}
return transferName;
}
class EnvFactory implements Factory {
private final LayoutInflater.Factory wrapped;
public EnvFactory(Factory wrapped) {
super();
this.wrapped = wrapped;
}
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
View view = null;
name = transfer(name);
if (context instanceof LayoutInflater.Factory) {
view = ((LayoutInflater.Factory) context).onCreateView(name, context, attrs);
}
if (view == null && wrapped != null) {
view = wrapped.onCreateView(name, context, attrs);
}
if (view == null) {
view = createViewOrFailQuietly(name, context, attrs);
}
return view;
}
private View createViewOrFailQuietly(String name, Context context, AttributeSet attrs) {
if (name.contains(".")) {
return createViewOrFailQuietly(name, null, context, attrs);
}
for (final String prefix : sClassPrefixList) {
final View view = createViewOrFailQuietly(name, prefix, context, attrs);
if (view != null) {
return view;
}
}
return null;
}
private View createViewOrFailQuietly(String name, String prefix, Context context, AttributeSet attrs) {
try {
return LayoutInflater.from(context).createView(name, prefix, attrs);
} catch (Exception ignore) {
if (BuildConfig.DEBUG) {
ignore.printStackTrace();
}
return null;
}
}
}
}