Created
May 9, 2017 08:24
-
-
Save iammert/c9da4150a5b5faa4b7bd8fe7915d6e6b to your computer and use it in GitHub Desktop.
NewIntentProcessor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class NewIntentProcessor extends AbstractProcessor { | |
private static final String METHOD_PREFIX = "start"; | |
private static final ClassName classIntent = ClassName.get("android.content", "Intent"); | |
private static final ClassName classContext = ClassName.get("android.content", "Context"); | |
private Filer filer; | |
private Messager messager; | |
private Elements elements; | |
private Map<String, String> activitiesWithPackage; | |
@Override | |
public synchronized void init(ProcessingEnvironment processingEnvironment) { | |
super.init(processingEnvironment); | |
filer = processingEnvironment.getFiler(); | |
messager = processingEnvironment.getMessager(); | |
elements = processingEnvironment.getElementUtils(); | |
activitiesWithPackage = new HashMap<>(); | |
} | |
@Override | |
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { | |
try { | |
/** | |
* 1- Find all annotated element | |
*/ | |
for (Element element : roundEnvironment.getElementsAnnotatedWith(NewIntent.class)) { | |
if (element.getKind() != ElementKind.CLASS) { | |
messager.printMessage(Diagnostic.Kind.ERROR, "Can be applied to class."); | |
return true; | |
} | |
TypeElement typeElement = (TypeElement) element; | |
activitiesWithPackage.put( | |
typeElement.getSimpleName().toString(), | |
elements.getPackageOf(typeElement).getQualifiedName().toString()); | |
} | |
/** | |
* 2- Generate a class | |
*/ | |
TypeSpec.Builder navigatorClass = TypeSpec | |
.classBuilder("Navigator") | |
.addModifiers(Modifier.PUBLIC, Modifier.FINAL); | |
for (Map.Entry<String, String> element : activitiesWithPackage.entrySet()) { | |
String activityName = element.getKey(); | |
String packageName = element.getValue(); | |
ClassName activityClass = ClassName.get(packageName, activityName); | |
MethodSpec intentMethod = MethodSpec | |
.methodBuilder(METHOD_PREFIX + activityName) | |
.addModifiers(Modifier.PUBLIC, Modifier.STATIC) | |
.returns(classIntent) | |
.addParameter(classContext, "context") | |
.addStatement("return new $T($L, $L)", classIntent, "context", activityClass + ".class") | |
.build(); | |
navigatorClass.addMethod(intentMethod); | |
} | |
/** | |
* 3- Write generated class to a file | |
*/ | |
JavaFile.builder("com.annotationsample", navigatorClass.build()).build().writeTo(filer); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return true; | |
} | |
@Override | |
public Set<String> getSupportedAnnotationTypes() { | |
return ImmutableSet.of(NewIntent.class.getCanonicalName()); | |
} | |
@Override | |
public SourceVersion getSupportedSourceVersion() { | |
return SourceVersion.latestSupported(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment