package org.robobinding;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.LayoutInflater.Factory;
import android.view.View;
/**
* @since 1.0
* @author Cheng Wei
*
*/
public class LayoutInflaterPreHoneyComb {
LayoutInflaterPreHoneyComb() {}
public static LayoutInflater create(LayoutInflater original, ViewCreationListener listener,
ViewNameResolver viewNameResolver) {
LayoutInflater newLayoutInflater = clone(original);
newLayoutInflater.setFactory(wrapFactory(original, newLayoutInflater, viewNameResolver, listener));
return newLayoutInflater;
}
protected static LayoutInflater clone(LayoutInflater original) {
LayoutInflater newLayoutInflater = original.cloneInContext(original.getContext());
newLayoutInflater.setFilter(original.getFilter());
return newLayoutInflater;
}
private static Factory wrapFactory(LayoutInflater original, LayoutInflater layoutInflater,
ViewNameResolver viewNameResolver, ViewCreationListener listener) {
Factory safeFactory = (original.getFactory() != null) ? original.getFactory() : EMPTY_FACTORY;
return new WithViewCreatedNotification(
new WithViewCreationIfNull(safeFactory, viewNameResolver, layoutInflater),
listener);
}
protected static class WithViewCreatedNotification implements Factory {
private final Factory delegate;
private final ViewCreationListener listener;
public WithViewCreatedNotification(Factory delegate, ViewCreationListener listener) {
this.delegate = delegate;
this.listener = listener;
}
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
View view = delegate.onCreateView(name, context, attrs);
notifyViewCreatedIfNotNull(view, attrs);
return view;
}
protected void notifyViewCreatedIfNotNull(View view, AttributeSet attrs) {
if(view != null) {
listener.onViewCreated(view, attrs);
}
}
}
protected static class WithViewCreationIfNull implements Factory {
private final Factory delegate;
private final ViewNameResolver viewNameResolver;
private final LayoutInflater layoutInflater;
public WithViewCreationIfNull(Factory delegate, ViewNameResolver viewNameResolver,
LayoutInflater layoutInflater) {
this.delegate = delegate;
this.viewNameResolver = viewNameResolver;
this.layoutInflater = layoutInflater;
}
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
View view = delegate.onCreateView(name, context, attrs);
return createViewIfNull(view, name, attrs);
}
private View createViewIfNull(View viewOrNull, String name, AttributeSet attrs) {
if(viewOrNull != null) return viewOrNull;
String viewFullName = viewNameResolver.getViewNameFromLayoutTag(name);
try {
return layoutInflater.createView(viewFullName, null, attrs);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}
private static Factory EMPTY_FACTORY = new Factory() {
public View onCreateView(String name, Context context, AttributeSet attrs) {
return null;
}
};
}