package droidkit.view;
import android.support.annotation.NonNull;
import android.view.View;
import java.lang.reflect.Field;
import java.util.List;
import droidkit.annotation.InjectView;
import droidkit.util.DynamicException;
import droidkit.util.DynamicField;
import droidkit.util.DynamicMethod;
/**
* @author Daniel Serdyukov
*/
public final class ViewInjector {
private static final String VIEW_INJECTOR = "$ViewInjector";
private static final String METHOD_INJECT = "inject";
private ViewInjector() {
}
public static void inject(@NonNull View view, @NonNull Object target) {
try {
DynamicMethod.invokeStatic(target.getClass().getName() + VIEW_INJECTOR, METHOD_INJECT, view, target);
} catch (DynamicException e) {
tryInjectAtRuntime(view, target);
}
}
private static void tryInjectAtRuntime(@NonNull View view, @NonNull Object target) {
final List<Field> fields = DynamicField.annotatedWith(target.getClass(), InjectView.class);
for (final Field field : fields) {
final InjectView injectView = field.getAnnotation(InjectView.class);
try {
DynamicField.set(target, field, Views.findById(view, injectView.value()));
} catch (DynamicException e) {
throw new IllegalArgumentException(e);
}
}
}
}