Skip to content

Commit

Permalink
Merge pull request #5 from mattinger/master
Browse files Browse the repository at this point in the history
Add Drawable processor
  • Loading branch information
dapp committed Aug 14, 2017
2 parents c9394a5 + 23492e3 commit 4387692
Show file tree
Hide file tree
Showing 9 changed files with 69 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,32 @@
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;

import javax.lang.model.element.Modifier;
import java.util.List;

import javax.lang.model.element.Modifier;

import static com.squareup.javapoet.ClassName.get;
import static com.squareup.javapoet.TypeName.INT;
import static com.squareup.javapoet.TypeSpec.classBuilder;
import static javax.lang.model.element.Modifier.FINAL;
import static javax.lang.model.element.Modifier.PUBLIC;


final class RpCodeGenerator {
private List<String> rClassStringVars;
private List<String> rClassPluralVars;
private List<String> rDrawableVars;

RpCodeGenerator(List<String> rClassStringVars, List<String> rClassPluralVars) {
RpCodeGenerator(List<String> rClassStringVars, List<String> rClassPluralVars, List<String> rDrawableVars) {
this.rClassStringVars = rClassStringVars;
this.rClassPluralVars = rClassPluralVars;
this.rDrawableVars = rDrawableVars;
}

TypeSpec generateClass() {
ClassName contextClassName = get("android.content", "Context");
FieldSpec contextField = FieldSpec.builder(contextClassName, "context", Modifier.PRIVATE).build();
ClassName drawableClassName = get("android.graphics.drawable", "Drawable");
TypeName contextCompatClassName = get("android.support.v4.content", "ContextCompat");

AnnotationSpec supressLint = AnnotationSpec.builder(ClassName.get("android.annotation", "SuppressLint"))
.addMember("value", "$L", "{\"StringFormatInvalid\", \"StringFormatMatches\"}")
Expand Down Expand Up @@ -86,6 +90,21 @@ TypeSpec generateClass() {

}

for (String var : rDrawableVars) {
try {
classBuilder.addMethod(MethodSpec.methodBuilder("get" + getterSuffix(var))
.addModifiers(Modifier.PUBLIC)
.returns(drawableClassName)
.addStatement("return $T.getDrawable(context, R.drawable." + var + ")", contextCompatClassName)
.varargs(false)
.build());
} catch (IllegalArgumentException e) {
System.out.println("\n\nResourceProvider Compiler Error: " + e.getMessage() + ".\n\nUnable to generate API for R.drawable." + var + "\n\n") ;
}

}


return classBuilder.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,18 @@
import com.squareup.javapoet.TypeSpec;
import com.sun.tools.javac.code.Symbol;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import static com.squareup.javapoet.JavaFile.builder;
import static com.xfinity.resourceprovider.Utils.getPackageName;
Expand All @@ -29,6 +30,7 @@ public class RpProcessor extends AbstractProcessor {
private static final String R_CLASS_IDENTIFIER = ".R";
private static final String STRING = "string";
private static final String PLURALS = "plurals";
private static final String DRAWABLE = "drawable";
private static final String ANDROID_APP_CLASS_TYPE = "android.app.Application";

private final Messager messager = new Messager();
Expand Down Expand Up @@ -62,6 +64,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
try {
List<String> rStringVars = new ArrayList<>();
List<String> rPluralVars = new ArrayList<>();
List<String> rDrawablevars = new ArrayList<>();
//lame. this assumes that the application class is at the top level. find a better way.
String packageName = getPackageName(processingEnv.getElementUtils(), annotatedClass);
String rClassName = packageName + R_CLASS_IDENTIFIER;
Expand All @@ -84,11 +87,17 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
.filter(pluralsElement -> pluralsElement instanceof Symbol.VarSymbol)
.forEach(pluralsElement -> rPluralVars.add(pluralsElement.toString()));
}

if (enclosedElement.getSimpleName().toString().equals(DRAWABLE)) {
enclosedElements.stream()
.filter(drawableElement -> drawableElement instanceof Symbol.VarSymbol)
.forEach(drawableElement -> rDrawablevars.add(drawableElement.toString()));
}
});
}
});

generateCode(annotatedClass, rStringVars, rPluralVars);
generateCode(annotatedClass, rStringVars, rPluralVars, rDrawablevars);
} catch (UnnamedPackageException | IOException e) {
messager.error(annotatedElement, "Couldn't generate class for %s: %s", annotatedClass,
e.getMessage());
Expand All @@ -103,12 +112,11 @@ private boolean isValidClass(TypeElement annotatedClass) {
return processingEnv.getTypeUtils().isAssignable(annotatedClass.asType(), applicationTypeElement.asType());
}

private void generateCode(TypeElement annotatedClass, List<String> rStringVars, List<String> rPluralVars)
private void generateCode(TypeElement annotatedClass, List<String> rStringVars, List<String> rPluralVars, List<String> rDrawableVars)
throws UnnamedPackageException, IOException {
String packageName = getPackageName(processingEnv.getElementUtils(), annotatedClass);
RpCodeGenerator codeGenerator = new RpCodeGenerator(rStringVars, rPluralVars);
RpCodeGenerator codeGenerator = new RpCodeGenerator(rStringVars, rPluralVars, rDrawableVars);
TypeSpec generatedClass = codeGenerator.generateClass();

JavaFile javaFile = builder(packageName, generatedClass).build();
javaFile.writeTo(processingEnv.getFiler());
}
Expand Down
4 changes: 1 addition & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,5 @@
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/

sonatypeUsername=your_un
sonatypePassword=your_pw
sonatypePassword=your_pw
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package com.xfinity.resourceprovider.sample;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity implements MainView {
private TextView formatedTextView;
private TextView dateTextView;
private TextView pluralsView;
private ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -17,6 +20,7 @@ protected void onCreate(Bundle savedInstanceState) {
formatedTextView = (TextView) findViewById(R.id.formatted_text_view);
dateTextView = (TextView) findViewById(R.id.date_string);
pluralsView = (TextView) findViewById(R.id.plurals_string);
imageView = (ImageView) findViewById(R.id.image);

MainPresenter presenter = new MainPresenter(new ResourceProvider(getApplicationContext()));
presenter.setView(this);
Expand All @@ -37,4 +41,9 @@ public void setDateString(String dateString) {
public void setPluralsString(String pluralsString) {
pluralsView.setText(pluralsString);
}

@Override
public void setDrawable(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,7 @@ void present() {
} else {
mainView.setPluralsString(resourceProvider.getSaturday());
}

mainView.setDrawable(resourceProvider.getIcnNavDino());
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.xfinity.resourceprovider.sample;

import android.graphics.drawable.Drawable;

interface MainView {
void setFormattedText(String formattedText);
void setDateString(String dateString);
void setPluralsString(String pluralsString);
void setDrawable(Drawable drawable);
}
Binary file added sample/src/main/res/drawable/icn_nav_dino.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions sample/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,9 @@
android:id="@+id/plurals_string"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.xfinity.resourceprovider.sample;

import android.graphics.drawable.Drawable;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand All @@ -21,6 +23,7 @@ public class MainPresenterTest {

@Mock MainView mainView;
@Mock ResourceProvider resourceProvider;
@Mock Drawable drawable;

private MainPresenter presenter;

Expand All @@ -31,10 +34,18 @@ public void setup() {
when(resourceProvider.getOneArgFormattedString(anyInt())).thenReturn(FORMATTED_STRING);
when(resourceProvider.getFirstHalfOfMonth()).thenReturn(FIRST_HALF_OF_MONTH);
when(resourceProvider.getSecondHalfOfMonth()).thenReturn(SECOND_HALF_OF_MONTH);
when(resourceProvider.getIcnNavDino()).thenReturn(drawable);

presenter = new MainPresenter(resourceProvider);
}

@Test
public void drawable_presents_correctly() {
presenter.setView(mainView);
presenter.present();
verify(resourceProvider).getIcnNavDino();
verify(mainView).setDrawable(drawable);
}

@Test
public void formatted_text_presents_correctly() {
Expand Down

0 comments on commit 4387692

Please sign in to comment.