Skip to content

Commit

Permalink
Merge pull request #26 from vanniktech/master_extra_annotation
Browse files Browse the repository at this point in the history
Add @extra annotation
  • Loading branch information
vanniktech committed Feb 16, 2016
2 parents b7ac695 + e23f563 commit 01564ef
Show file tree
Hide file tree
Showing 19 changed files with 437 additions and 36 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ In addition to that other parameter annotations are supported like:

##### Since 0.3.0

* [@Extra](onactivityresult-annotations/src/main/java/onactivityresult/Extra.java) `type var`.
* [@ExtraBoolean](onactivityresult-annotations/src/main/java/onactivityresult/ExtraBoolean.java) `boolean booleanVar`.
* [@ExtraByte](onactivityresult-annotations/src/main/java/onactivityresult/ExtraByte.java) `byte byteVar`.
* [@ExtraChar](onactivityresult-annotations/src/main/java/onactivityresult/ExtraChar.java) `char charVar`.
Expand All @@ -108,7 +109,7 @@ Some examples can be found [here](./onactivityresult-sample/src/main/java/com/va
* Inheritance support
* [@IntentData](onactivityresult-annotations/src/main/java/onactivityresult/IntentData.java) annotation with @NonNull & @Nullable support. Since 0.2.0
* Specify resultCodes with e.g. `resultCodes = { Activity.RESULT_OK }`. Since 0.2.0
* [@ExtraBoolean](onactivityresult-annotations/src/main/java/onactivityresult/ExtraBoolean.java), [@ExtraByte](onactivityresult-annotations/src/main/java/onactivityresult/ExtraByte.java), [@ExtraChar](onactivityresult-annotations/src/main/java/onactivityresult/ExtraChar.java), [@ExtraDouble](onactivityresult-annotations/src/main/java/onactivityresult/ExtraDouble.java), [@ExtraFloat](onactivityresult-annotations/src/main/java/onactivityresult/ExtraFloat.java), [@ExtraInt](onactivityresult-annotations/src/main/java/onactivityresult/ExtraInt.java), [@ExtraLong](onactivityresult-annotations/src/main/java/onactivityresult/ExtraLong.java), [@ExtraShort](onactivityresult-annotations/src/main/java/onactivityresult/ExtraShort.java), [@ExtraString](onactivityresult-annotations/src/main/java/onactivityresult/ExtraString.java) annotations. Since 0.3.0
* [@Extra](onactivityresult-annotations/src/main/java/onactivityresult/Extra.java), [@ExtraBoolean](onactivityresult-annotations/src/main/java/onactivityresult/ExtraBoolean.java), [@ExtraByte](onactivityresult-annotations/src/main/java/onactivityresult/ExtraByte.java), [@ExtraChar](onactivityresult-annotations/src/main/java/onactivityresult/ExtraChar.java), [@ExtraDouble](onactivityresult-annotations/src/main/java/onactivityresult/ExtraDouble.java), [@ExtraFloat](onactivityresult-annotations/src/main/java/onactivityresult/ExtraFloat.java), [@ExtraInt](onactivityresult-annotations/src/main/java/onactivityresult/ExtraInt.java), [@ExtraLong](onactivityresult-annotations/src/main/java/onactivityresult/ExtraLong.java), [@ExtraShort](onactivityresult-annotations/src/main/java/onactivityresult/ExtraShort.java), [@ExtraString](onactivityresult-annotations/src/main/java/onactivityresult/ExtraString.java) annotations. Since 0.3.0

## Thanks

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package onactivityresult;

import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.CLASS;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
* parameters of a {@link OnActivityResult} annotated method can be annotated to get an extra of the Intent<br>
* The type of the variable will be automatically derived.<br>
* <br>
* Supported types are: <br>
* <ul>
* <li>boolean</li>
* <li>byte</li>
* <li>char</li>
* <li>double</li>
* <li>float</li>
* <li>int</li>
* <li>long</li>
* <li>short</li>
* <li>String</li>
* </ul>
* Example:<br>
* <p>
* <code>
* &#64;OnActivityResult(requestCode = 1)
* void onResult(&#64;Extra final String extra) {
* // Do something
* }
* </code>
* </p>
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extra<br>
* <br>
* Since the type will be derived it's not possible to set a default value via the annotation. In case the Intent does not contain the extra, type default values will be provided automatically.<br>
* If you want set a deafult value use one of those annotations: {@link ExtraBoolean}, {@link ExtraByte}, {@link ExtraChar}, {@link ExtraDouble}, {@link ExtraFloat}, {@link ExtraInt}, {@link ExtraLong} and {@link ExtraShort}
*
* @since 0.3.0
*/
@Retention(CLASS)
@Target(PARAMETER)
public @interface Extra {}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraBoolean<br>
* <br>
* NOTE: If you don't care about the {@link ExtraBoolean#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraByte<br>
* <br>
* NOTE: If you don't care about the {@link ExtraByte#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraChar<br>
* <br>
* NOTE: If you don't care about the {@link ExtraChar#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraDouble<br>
* <br>
* NOTE: If you don't care about the {@link ExtraDouble#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraFloat<br>
* <br>
* NOTE: If you don't care about the {@link ExtraFloat#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraInt<br>
* <br>
* NOTE: If you don't care about the {@link ExtraInt#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraLong<br>
* <br>
* NOTE: If you don't care about the {@link ExtraLong#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraShort<br>
* <br>
* NOTE: If you don't care about the {@link ExtraShort#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
* <br>
* extra name: same as parameter <br>
* NOTE: In this case it would be extraString<br>
* <br>
* NOTE: If you don't care about the {@link ExtraString#defaultValue()} you can also use the {@link Extra} annotation<br>
* <br>
*
* @since 0.3.0
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package onactivityresult;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

import org.junit.Test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class ExtraTest {
@Test
public void testAnnotationRetention() {
final Retention retention = Extra.class.getAnnotation(Retention.class);
assertEquals(RetentionPolicy.CLASS, retention.value());
}

@Test
public void testAnnotationTarget() {
final Target retention = Extra.class.getAnnotation(Target.class);
final ElementType[] elementTypes = retention.value();
assertArrayEquals(new ElementType[] { ElementType.PARAMETER }, elementTypes);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private void addRequestCodeControlFlows(final MethodSpec.Builder result) {
}

final Map<ResultCodes, List<MethodCall>> methodCallsForRequestCode = this.getSortedMethodCallsGroupedByResultCodesFor(requestCode);
this.addMethodCalls(result, methodCallsForRequestCode);
this.addMethodCallsForResultCodes(result, methodCallsForRequestCode);
}

result.endControlFlow();
Expand Down Expand Up @@ -139,7 +139,7 @@ private Map<ResultCodes, List<MethodCall>> getSortedMethodCallsGroupedByResultCo
return sortedMethodCallsGroupedByResultCodes;
}

private void addMethodCalls(final MethodSpec.Builder result, final Map<ResultCodes, List<MethodCall>> sortedMethodCallsGroupedByResultCodes) {
private void addMethodCallsForResultCodes(final MethodSpec.Builder result, final Map<ResultCodes, List<MethodCall>> sortedMethodCallsGroupedByResultCodes) {
final Set<Parameter> existingParameters = new HashSet<>();
boolean isFirstResultCodeIfStatement = true;

Expand Down Expand Up @@ -173,13 +173,7 @@ private void addMethodCalls(final MethodSpec.Builder result, final Map<ResultCod
existingParameters.clear();
}

for (final MethodCall methodCall : methodCalls) {
final ParameterList parameterList = methodCall.getParameterList();

this.addNecessaryParameters(result, existingParameters, parameterList);

result.addStatement("$L.$L($L)", TARGET_VARIABLE_NAME, methodCall.getMethodName(), parameterList.toString());
}
this.addMethodCalls(result, existingParameters, methodCalls);

final boolean isLast = !it.hasNext();

Expand All @@ -189,11 +183,21 @@ private void addMethodCalls(final MethodSpec.Builder result, final Map<ResultCod
}
}

private void addNecessaryParameters(final MethodSpec.Builder result, final Set<Parameter> existingParameters, final ParameterList parameterList) {
private void addMethodCalls(final MethodSpec.Builder result, final Set<Parameter> existingParameters, final List<MethodCall> methodCalls) {
for (final MethodCall methodCall : methodCalls) {
final ParameterList parameterList = methodCall.getParameterList();

this.addNecessaryParameterVariables(result, existingParameters, parameterList);

result.addStatement("$L.$L($L)", TARGET_VARIABLE_NAME, methodCall.getMethodName(), parameterList.toString());
}
}

private void addNecessaryParameterVariables(final MethodSpec.Builder result, final Set<Parameter> existingParameters, final ParameterList parameterList) {
for (final Parameter parameter : parameterList) {
final boolean notPresent = !existingParameters.contains(parameter);
final boolean isNotPresent = !existingParameters.contains(parameter);

if (notPresent) {
if (isNotPresent) {
if (AnnotatedParameter.INTENT_DATA == parameter.annotatedParameter) {
result.addStatement("final $T $L = $T.getIntentData$L($L)", URI, parameter.getName(), INTENT_HELPER, parameter.preCondition.getSuffix(), Parameter.INTENT);
existingParameters.add(parameter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public enum AnnotatedParameter {
@Override
Parameter createParameter(final Element element) {
final ExtraBoolean annotation = element.getAnnotation(ExtraBoolean.class);
final boolean defaultValue = annotation.defaultValue();
final boolean defaultValue = annotation != null && annotation.defaultValue();
return Parameter.create(this, element.getSimpleName().toString(), String.valueOf(defaultValue));
}

Expand All @@ -43,7 +43,7 @@ Class<? extends Annotation> getAnnotation() {
@Override
Parameter createParameter(final Element element) {
final ExtraByte annotation = element.getAnnotation(ExtraByte.class);
final byte defaultValue = annotation.defaultValue();
final byte defaultValue = annotation != null ? annotation.defaultValue() : 0;
return Parameter.create(this, element.getSimpleName().toString(), String.valueOf(defaultValue));
}

Expand All @@ -61,7 +61,7 @@ Class<? extends Annotation> getAnnotation() {
@Override
Parameter createParameter(final Element element) {
final ExtraChar annotation = element.getAnnotation(ExtraChar.class);
final char defaultValue = annotation.defaultValue();
final char defaultValue = annotation != null ? annotation.defaultValue() : 0;
return Parameter.create(this, element.getSimpleName().toString(), String.valueOf((int) defaultValue));
}

Expand All @@ -79,7 +79,7 @@ Class<? extends Annotation> getAnnotation() {
@Override
Parameter createParameter(final Element element) {
final ExtraDouble annotation = element.getAnnotation(ExtraDouble.class);
final double defaultValue = annotation.defaultValue();
final double defaultValue = annotation != null ? annotation.defaultValue() : 0d;
return Parameter.create(this, element.getSimpleName().toString(), String.valueOf(defaultValue));
}

Expand All @@ -97,7 +97,7 @@ Class<? extends Annotation> getAnnotation() {
@Override
Parameter createParameter(final Element element) {
final ExtraFloat annotation = element.getAnnotation(ExtraFloat.class);
final float defaultValue = annotation.defaultValue();
final float defaultValue = annotation != null ? annotation.defaultValue() : 0.f;
return Parameter.create(this, element.getSimpleName().toString(), String.valueOf(defaultValue));
}

Expand All @@ -115,7 +115,7 @@ Class<? extends Annotation> getAnnotation() {
@Override
Parameter createParameter(final Element element) {
final ExtraInt annotation = element.getAnnotation(ExtraInt.class);
final int defaultValue = annotation.defaultValue();
final int defaultValue = annotation != null ? annotation.defaultValue() : 0;
return Parameter.create(this, element.getSimpleName().toString(), String.valueOf(defaultValue));
}

Expand All @@ -133,7 +133,7 @@ Class<? extends Annotation> getAnnotation() {
@Override
Parameter createParameter(final Element element) {
final ExtraLong annotation = element.getAnnotation(ExtraLong.class);
final long defaultValue = annotation.defaultValue();
final long defaultValue = annotation != null ? annotation.defaultValue() : 0L;
return Parameter.create(this, element.getSimpleName().toString(), String.valueOf(defaultValue));
}

Expand All @@ -151,7 +151,7 @@ Class<? extends Annotation> getAnnotation() {
@Override
Parameter createParameter(final Element element) {
final ExtraShort annotation = element.getAnnotation(ExtraShort.class);
final short defaultValue = annotation.defaultValue();
final short defaultValue = annotation != null ? annotation.defaultValue() : 0;
return Parameter.create(this, element.getSimpleName().toString(), String.valueOf(defaultValue));
}

Expand All @@ -169,7 +169,7 @@ Class<? extends Annotation> getAnnotation() {
@Override
Parameter createParameter(final Element element) {
final ExtraString annotation = element.getAnnotation(ExtraString.class);
final String defaultValue = annotation.defaultValue();
final String defaultValue = annotation != null ? annotation.defaultValue() : "";
return Parameter.create(this, element.getSimpleName().toString(), defaultValue);
}

Expand Down
Loading

0 comments on commit 01564ef

Please sign in to comment.