package org.openlmis.core.view.holder;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import org.apache.commons.lang3.reflect.FieldUtils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import roboguice.inject.InjectView;
public class BaseViewHolder extends RecyclerView.ViewHolder {
private ArrayList<ViewMembersInjector> viewsForInjection;
protected Context context;
public BaseViewHolder(View itemView) {
super(itemView);
this.context = itemView.getContext();
prepareFields();
injectViews(itemView);
}
private void prepareFields() {
viewsForInjection = new ArrayList<>();
for (Field field : FieldUtils.getAllFields(this.getClass())) {
if (field.isAnnotationPresent(InjectView.class)) {
viewsForInjection.add(new ViewMembersInjector(field, field.getAnnotation(InjectView.class)));
}
}
}
private void injectViews(View v) {
for (ViewMembersInjector viewMembersInjector : viewsForInjection) {
viewMembersInjector.reallyInjectMembers(this, v);
}
}
class ViewMembersInjector {
private Field field;
private InjectView annotation;
public ViewMembersInjector(Field field, InjectView annotation) {
this.field = field;
this.annotation = annotation;
}
public void reallyInjectMembers(BaseViewHolder holder, View view) {
Object value = null;
try {
value = view.findViewById(annotation.value());
if (value != null) {
field.setAccessible(true);
field.set(holder, value);
}
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (IllegalArgumentException f) {
throw new IllegalArgumentException(String.format("Can't assign %s value %s to %s field %s", value != null ? value.getClass() : "(null)", value, field.getType(), field.getName()));
}
}
}
}