package com.tale.prettybundleprocessor; import com.tale.prettybundle.ExtraBinder; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.ArrayType; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; /** * Created by tale on 2/1/15. */ public class ExtraAnnotatedClass { private final VariableElement annotatedVariableElement; private final String key; private final String qualifiedClassName; private String dataTypeQualifiedClassName; private final TypeMirror dataType; private ExtraBinder extraBinder; private SupportedType supportedType; public ExtraAnnotatedClass(VariableElement annotatedVariableElement, Elements elements, Types types) { this.annotatedVariableElement = annotatedVariableElement; key = annotatedVariableElement.getSimpleName().toString(); // Get the full QualifiedTypeName final TypeElement parent = (TypeElement) annotatedVariableElement.getEnclosingElement(); if (types.isSubtype(parent.asType(), elements.getTypeElement("android.app.Activity").asType())) { supportedType = SupportedType.ACTIVITY; } else if (types.isSubtype(parent.asType(), elements.getTypeElement("android.app.Service").asType())) { supportedType = SupportedType.SERVICE; } else if (types.isSubtype(parent.asType(), elements.getTypeElement("android.app.Fragment").asType()) || types.isSubtype(parent.asType(), elements.getTypeElement("android.support.v4.app.Fragment").asType())) { supportedType = SupportedType.FRAGMENT; } else { supportedType = SupportedType.NOP; } qualifiedClassName = parent.getQualifiedName().toString(); // Get the full Qualified of DataType. dataType = annotatedVariableElement.asType(); dataTypeQualifiedClassName = dataType.toString(); extraBinder = ExtraBinderProvider.get(dataTypeQualifiedClassName); if (extraBinder != ExtraBinder.NOP) { return; } // Check if data type is kind of Parcelable. if (types.isSubtype(dataType, elements.getTypeElement("android.os.Parcelable").asType())) { extraBinder = ExtraBinderProvider.get("android.os.Parcelable"); if (extraBinder != ExtraBinder.NOP) { return; } } try { // Check if data type is kind of Array. dataTypeQualifiedClassName = ((ArrayType) dataType).getComponentType().toString(); final TypeMirror componentTypeMirror = elements.getTypeElement(dataTypeQualifiedClassName).asType(); if (types.isSubtype(componentTypeMirror, elements.getTypeElement("android.os.Parcelable").asType())) { extraBinder = ExtraBinderProvider.get("android.os.Parcelable[]"); if (extraBinder != ExtraBinder.NOP) { return; } } } catch (Exception e) { e.printStackTrace(); } } public SupportedType getSupportedType() { return supportedType; } public VariableElement getAnnotatedVariableElement() { return annotatedVariableElement; } public String getKey() { return key; } public ExtraBinder getExtraBinder() { return extraBinder; } public String getDataTypeQualifiedClassName() { return dataTypeQualifiedClassName; } public String getQualifiedClassName() { return qualifiedClassName; } public TypeMirror getDataType() { return dataType; } }