package co.infinum.ava.annotations.processor.tools; import java.util.ArrayList; /** * This class is used to create ViewHolder implementations (from template) that will be "injected". * <p> * ViewHolder can display two types of data: strings and images. Any other object or primitive type * will be cast to string by using String.valueOf() and treated as String type. */ public class ViewHolderCreator { protected static final String VIEW_HOLDER_TEMPLATE_PATH = "/co/infinum/ava/templates/ViewHolderTemplate.tpl"; protected static final String TEXT_FIELD_TEMPLATE = "\tTextView ${fieldName};\n"; protected static final String IMAGE_FIELD_TEMPLATE = "\tImageView ${fieldName};\n"; protected static final String TEXT_FIELD_INIT_TEMPLATE = "\t\t${fieldName} = (TextView) viewLayout.findViewById(${viewResId});\n"; protected static final String IMAGE_FIELD_INIT_TEMPLATE = "\t\t${fieldName} = (ImageView) viewLayout.findViewById(${viewResId});\n"; protected static final String TEXT_FIELD_UPDATE_TEMPLATE = "\t\t${fieldName}.setText(String.valueOf(item.${objectMethodName}()));\n"; protected static final String IMAGE_FIELD_UPDATE_TEMPLATE = "\t\t${fieldName}.setImageBitmap(item.${objectMethodName}());\n"; protected static final String PACKAGE_NAME = "${packageName}"; protected static final String CLASS_NAME = "${className}"; protected static final String OBJECT_TYPE = "${objectType}"; protected static final String FIELDS = "${fields}"; protected static final String LAYOUT_ID = "${layoutId}"; protected static final String INITIALIZE_VIEW = "${initializeView}"; protected static final String UPDATE_VIEW = "${updateView}"; protected static final String FIELD_NAME = "${fieldName}"; protected static final String VIEW_RES_ID = "${viewResId}"; protected static final String OBJ_METHOD_NAME = "${objectMethodName}"; protected String packageName; protected String className; protected String objectType; protected ArrayList<ViewHolderField> fields = new ArrayList<ViewHolderField>(); protected int layoutId; public ViewHolderCreator() { } public String getPackageName() { return packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getObjectType() { return objectType; } public void setObjectType(String objectType) { this.objectType = objectType; } public void addField(ViewHolderFieldType type, int viewResourceId, String objectMethodName) { fields.add(new ViewHolderField(type, viewResourceId, objectMethodName)); } public int getLayoutId() { return layoutId; } public void setLayoutId(int layoutId) { this.layoutId = layoutId; } /** * Generates fields part of the template. * * @return */ protected String generateFields() { StringBuilder builder = new StringBuilder(); for(ViewHolderField field : fields) { switch(field.getType()) { case TEXT: builder.append(TEXT_FIELD_TEMPLATE.replace(FIELD_NAME, field.getObjectMethodName())); break; case IMAGE: builder.append(IMAGE_FIELD_TEMPLATE.replace(FIELD_NAME, field.getObjectMethodName())); break; } } return builder.toString(); } /** * Generates views init part of the template. * * @return */ protected String generateFieldsInit() { StringBuilder builder = new StringBuilder(); for(ViewHolderField field : fields) { switch(field.getType()) { case TEXT: String fieldInit = TEXT_FIELD_INIT_TEMPLATE .replace(FIELD_NAME, field.getObjectMethodName()) .replace(VIEW_RES_ID, String.valueOf(field.getViewResourceId())); builder.append(fieldInit); break; case IMAGE: String imageFieldInit = IMAGE_FIELD_INIT_TEMPLATE .replace(FIELD_NAME, field.getObjectMethodName()) .replace(VIEW_RES_ID, String.valueOf(field.getViewResourceId())); builder.append(imageFieldInit); break; } } return builder.toString(); } protected String generateViewUpdate() { StringBuilder builder = new StringBuilder(); for(ViewHolderField field : fields) { switch(field.getType()) { case TEXT: String fieldInit = TEXT_FIELD_UPDATE_TEMPLATE .replace(FIELD_NAME, field.getObjectMethodName()) .replace(OBJ_METHOD_NAME, field.getObjectMethodName()); builder.append(fieldInit); break; case IMAGE: String imageFieldInit = IMAGE_FIELD_UPDATE_TEMPLATE .replace(FIELD_NAME, field.getObjectMethodName()) .replace(OBJ_METHOD_NAME, field.getObjectMethodName()); builder.append(imageFieldInit); break; } } return builder.toString(); } public String createViewHolderImplementation() { String template = Templates.getInstance().read(VIEW_HOLDER_TEMPLATE_PATH); template = template.replace(PACKAGE_NAME, packageName); template = template.replace(CLASS_NAME, className); template = template.replace(OBJECT_TYPE, objectType); template = template.replace(LAYOUT_ID, String.valueOf(layoutId)); template = template.replace(FIELDS, generateFields()); template = template.replace(INITIALIZE_VIEW, generateFieldsInit()); template = template.replace(UPDATE_VIEW, generateViewUpdate()); return template; } }