package com.asha.nightowllib.inflater;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import java.lang.reflect.Field;
/**
* Created by hzqiujiadi on 15/11/7.
* hzqiujiadi ashqalcn@gmail.com
*/
public class InjectedInflaterV7 extends InjectedInflaterBase {
private static Field sFactoryField;
private static boolean sCheckFactoryField;
protected InjectedInflaterV7(LayoutInflater original, Context newContext) {
super(original, newContext);
installFactory();
}
private void installFactory(){
Factory factory = getFactory();
if ( factory == null ) return;
if ( factory instanceof FactoryWrapperImpl ) return;
Factory newFactory = FactoryWrapperImpl.wrap(this,factory);
ensureMethod();
try {
sFactoryField.set(this,newFactory);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public void setFactory(Factory factory) {
if ( factory == null ) return;
if ( getFactory() == null ){
super.setFactory(FactoryWrapperImpl.wrap(this,factory));
}
}
private static void ensureMethod(){
if ( sCheckFactoryField ) return;
try {
sFactoryField = LayoutInflater.class.getDeclaredField("mFactory");
sFactoryField.setAccessible(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
sCheckFactoryField = true;
}
/********************************************************************************
*
* FactoryWrapperImpl
*
* ******************************************************************************/
public static class FactoryWrapperImpl extends LastChance2Inflater implements LayoutInflater.Factory {
private LayoutInflater.Factory mFactory;
private FactoryWrapperImpl(InjectedInflaterBase inflater, LayoutInflater.Factory factory) {
super(inflater);
mFactory = factory;
}
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
View v = mFactory.onCreateView(name,context,attrs);
if ( v == null ) v = lastChance2CreateView(null, name, context, attrs);
InjectedInflaterBase.handleOnCreateView(v, name, attrs);
return v;
}
public static LayoutInflater.Factory wrap(InjectedInflaterBase inflater, LayoutInflater.Factory factory){
return new FactoryWrapperImpl(inflater,factory);
}
}
}