Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.sun.codemodel.*;

import org.androidannotations.annotations.CheckedChange;
import org.androidannotations.helper.CanonicalNameConstants;
import org.androidannotations.holder.EComponentWithViewSupportHolder;
import org.androidannotations.model.AnnotationElements;
import org.androidannotations.process.IsValid;
Expand All @@ -26,6 +27,7 @@
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;

import java.util.List;
Expand All @@ -43,7 +45,11 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
ExecutableElement executableElement = (ExecutableElement) element;
validatorHelper.returnTypeIsVoid(executableElement, valid);

validatorHelper.param.hasZeroOrOneCompoundButtonOrTwoCompoundButtonBooleanParameters(executableElement, valid);
validatorHelper.param.hasZeroOrOneCompoundButtonParameter(executableElement, valid);

validatorHelper.param.hasZeroOrOneBooleanParameter(executableElement, valid);

validatorHelper.param.hasNoOtherParameterThanCompoundButtonOrBoolean(executableElement, valid);
}

@Override
Expand All @@ -55,14 +61,14 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror
protected void processParameters(EComponentWithViewSupportHolder holder, JMethod listenerMethod, JInvocation call, List<? extends VariableElement> parameters) {
JVar btnParam = listenerMethod.param(classes().COMPOUND_BUTTON, "buttonView");
JVar isCheckedParam = listenerMethod.param(codeModel().BOOLEAN, "isChecked");
boolean isCheckedParamExists = parameters.size() == 2;
boolean btnParamExists = parameters.size() >= 1;

if (btnParamExists) {
call.arg(btnParam);
}
if (isCheckedParamExists) {
call.arg(isCheckedParam);
for (VariableElement parameter : parameters) {
String parameterType = parameter.asType().toString();
if (parameterType.equals(CanonicalNameConstants.COMPOUND_BUTTON)) {
call.arg(btnParam);
} else if (parameterType.equals(CanonicalNameConstants.BOOLEAN) || parameter.asType().getKind() == TypeKind.BOOLEAN) {
call.arg(isCheckedParam);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,20 @@
*/
package org.androidannotations.handler;

import java.util.List;
import org.androidannotations.annotations.FocusChange;
import org.androidannotations.helper.CanonicalNameConstants;
import org.androidannotations.model.AnnotationElements;
import org.androidannotations.process.IsValid;

import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import java.util.List;

import org.androidannotations.annotations.FocusChange;
import org.androidannotations.holder.EComponentWithViewSupportHolder;
import org.androidannotations.model.AnnotationElements;
import org.androidannotations.process.IsValid;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
Expand All @@ -50,7 +52,11 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa

validatorHelper.returnTypeIsVoid(executableElement, valid);

validatorHelper.param.hasZeroOrOneViewOrTwoViewBooleanParameters(executableElement, valid);
validatorHelper.param.hasZeroOrOneViewParameter(executableElement, valid);

validatorHelper.param.hasZeroOrOneBooleanParameter(executableElement, valid);

validatorHelper.param.hasNoOtherParameterThanViewOrBoolean(executableElement, valid);
}

@Override
Expand All @@ -62,14 +68,14 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror
protected void processParameters(EComponentWithViewSupportHolder holder, JMethod listenerMethod, JInvocation call, List<? extends VariableElement> parameters) {
JVar viewParam = listenerMethod.param(classes().VIEW, "view");
JVar hasFocusParam = listenerMethod.param(codeModel().BOOLEAN, "hasFocus");
boolean hasFocusParamExists = parameters.size() == 2;
boolean viewParamExists = parameters.size() >= 1;

if (viewParamExists) {
call.arg(viewParam);
}
if (hasFocusParamExists) {
call.arg(hasFocusParam);
for (VariableElement parameter : parameters) {
String parameterType = parameter.asType().toString();
if (parameterType.equals(CanonicalNameConstants.VIEW)) {
call.arg(viewParam);
} else if (parameterType.equals(CanonicalNameConstants.BOOLEAN) || parameter.asType().getKind() == TypeKind.BOOLEAN) {
call.arg(hasFocusParam);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,20 @@
*/
package org.androidannotations.handler;

import java.util.List;
import com.sun.codemodel.*;
import org.androidannotations.annotations.Touch;
import org.androidannotations.helper.CanonicalNameConstants;
import org.androidannotations.holder.EComponentWithViewSupportHolder;
import org.androidannotations.model.AnnotationElements;
import org.androidannotations.process.IsValid;

import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;

import org.androidannotations.annotations.Touch;
import org.androidannotations.helper.CanonicalNameConstants;
import org.androidannotations.holder.EComponentWithViewSupportHolder;
import org.androidannotations.model.AnnotationElements;
import org.androidannotations.process.IsValid;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JInvocation;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JVar;
import java.util.List;

public class TouchHandler extends AbstractListenerHandler {

Expand All @@ -53,7 +44,11 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa

validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid);

validatorHelper.param.hasOneMotionEventOrTwoMotionEventViewParameters(executableElement, valid);
validatorHelper.param.hasZeroOrOneMotionEventParameter(executableElement, valid);

validatorHelper.param.hasZeroOrOneViewParameter(executableElement, valid);

validatorHelper.param.hasNoOtherParameterThanMotionEventOrView(executableElement, valid);
}

@Override
Expand All @@ -72,21 +67,12 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror
protected void processParameters(EComponentWithViewSupportHolder holder, JMethod listenerMethod, JInvocation call, List<? extends VariableElement> parameters) {
JVar viewParam = listenerMethod.param(classes().VIEW, "view");
JVar eventParam = listenerMethod.param(classes().MOTION_EVENT, "event");
boolean hasItemParameter = parameters.size() == 2;

VariableElement first = parameters.get(0);
String firstType = first.asType().toString();
if (firstType.equals(CanonicalNameConstants.MOTION_EVENT)) {
call.arg(eventParam);
} else {
call.arg(viewParam);
}
if (hasItemParameter) {
VariableElement second = parameters.get(1);
String secondType = second.asType().toString();
if (secondType.equals(CanonicalNameConstants.MOTION_EVENT)) {
for (VariableElement parameter : parameters) {
String parameterType = parameter.asType().toString();
if (parameterType.equals(CanonicalNameConstants.MOTION_EVENT)) {
call.arg(eventParam);
} else {
} else if (parameterType.equals(CanonicalNameConstants.VIEW)) {
call.arg(viewParam);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import javax.lang.model.type.TypeMirror;
import java.util.Arrays;
import java.util.List;
import java.util.Collection;

import static java.util.Arrays.asList;

Expand Down Expand Up @@ -110,82 +111,71 @@ public void hasOneOrTwoParametersAndFirstIsBoolean(ExecutableElement executableE
}
}

public void hasZeroOrOneViewOrTwoViewBooleanParameters(ExecutableElement executableElement, IsValid valid) {
List<? extends VariableElement> parameters = executableElement.getParameters();
public void hasZeroOrOneCompoundButtonParameter(ExecutableElement executableElement, IsValid valid) {
hasZeroOrOneParameterOfType(CanonicalNameConstants.COMPOUND_BUTTON, executableElement, valid);
}

if (parameters.size() == 0) {
return;
} else if (parameters.size() > 2) {
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "%s can only be used on a method with 0 or 1(View) or 2(View, boolean) parameter, instead of " + parameters.size());
} else {
VariableElement firstParameter = parameters.get(0);
String firstParameterType = firstParameter.asType().toString();
if (!firstParameterType.equals(CanonicalNameConstants.VIEW)) {
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "the first parameter must be a " + CanonicalNameConstants.VIEW + ", not a " + firstParameterType);
}
if (parameters.size() == 2) {
VariableElement secondParameter = parameters.get(1);
String secondParameterType = secondParameter.asType().toString();
if (!secondParameterType.equals(CanonicalNameConstants.BOOLEAN) && !secondParameterType.equals("boolean")) {
public void hasZeroOrOneBooleanParameter(ExecutableElement executableElement, IsValid valid) {
hasZeroOrOneParameterOfPrimitiveType(CanonicalNameConstants.BOOLEAN, TypeKind.BOOLEAN, executableElement, valid);
}

public void hasZeroOrOneMotionEventParameter(ExecutableElement executableElement, IsValid valid) {
hasZeroOrOneParameterOfType(CanonicalNameConstants.MOTION_EVENT, executableElement, valid);
}

public void hasZeroOrOneViewParameter(ExecutableElement executableElement, IsValid valid) {
hasZeroOrOneParameterOfType(CanonicalNameConstants.VIEW, executableElement, valid);
}

private void hasZeroOrOneParameterOfType(String typeCanonicalName, ExecutableElement executableElement, IsValid valid) {
boolean parameterOfTypeFound = false;
for (VariableElement parameter : executableElement.getParameters()) {
String parameterType = parameter.asType().toString();
if (parameterType.equals(typeCanonicalName)) {
if (parameterOfTypeFound) {
annotationHelper.printAnnotationError(executableElement, "You can declare only one parameter of type "+typeCanonicalName);
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "the second parameter must be a " + CanonicalNameConstants.BOOLEAN + " or boolean, not a " + secondParameterType);
}
parameterOfTypeFound = true;
}
}
}

public void hasZeroOrOneCompoundButtonOrTwoCompoundButtonBooleanParameters(ExecutableElement executableElement, IsValid valid) {
List<? extends VariableElement> parameters = executableElement.getParameters();

if (parameters.size() == 0) {
return;
} else if (parameters.size() > 2) {
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "%s can only be used on a method with 0 or 1(CompoundButton) or 2(CompoundButton, boolean) parameter, instead of " + parameters.size());
} else {
VariableElement firstParameter = parameters.get(0);
String firstParameterType = firstParameter.asType().toString();
if (!firstParameterType.equals(CanonicalNameConstants.COMPOUND_BUTTON)) {
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "the first parameter must be a " + CanonicalNameConstants.COMPOUND_BUTTON + ", not a " + firstParameterType);
}
if (parameters.size() == 2) {
VariableElement secondParameter = parameters.get(1);
String secondParameterType = secondParameter.asType().toString();
if (!secondParameterType.equals(CanonicalNameConstants.BOOLEAN) && !secondParameterType.equals("boolean")) {
private void hasZeroOrOneParameterOfPrimitiveType(String typeCanonicalName, TypeKind typeKind, ExecutableElement executableElement, IsValid valid) {
boolean parameterOfTypeFound = false;
for (VariableElement parameter : executableElement.getParameters()) {
if (parameter.asType().getKind() == typeKind || parameter.asType().toString().equals(typeCanonicalName)) {
if (parameterOfTypeFound) {
annotationHelper.printAnnotationError(executableElement, "You can declare only one parameter of type "+typeKind.name()+" or "+typeCanonicalName);
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "the second parameter must be a " + CanonicalNameConstants.BOOLEAN + " or boolean, not a " + secondParameterType);
}
parameterOfTypeFound = true;
}
}
}

public void hasOneMotionEventOrTwoMotionEventViewParameters(ExecutableElement executableElement, IsValid valid) {
List<? extends VariableElement> parameters = executableElement.getParameters();
public void hasNoOtherParameterThanCompoundButtonOrBoolean(ExecutableElement executableElement, IsValid valid) {
String[] types = new String[]{CanonicalNameConstants.COMPOUND_BUTTON, CanonicalNameConstants.BOOLEAN, "boolean"};
hasNotOtherParameterThanTypes(types, executableElement, valid);
}

if (parameters.size() < 1 || parameters.size() > 2) {
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "%s can only be used on a method with 1 (MotionEvent) or 2 (MotionEvent, View) parameters, instead of " + parameters.size());
} else {
VariableElement firstParameter = parameters.get(0);
String firstParameterType = firstParameter.asType().toString();
if (parameters.size() == 1 && !firstParameterType.equals(CanonicalNameConstants.MOTION_EVENT)) {
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "the parameter must be a " + CanonicalNameConstants.MOTION_EVENT + ", not a " + firstParameterType);
}
if (parameters.size() == 2) {
VariableElement secondParameter = parameters.get(1);
String secondParameterType = secondParameter.asType().toString();
public void hasNoOtherParameterThanMotionEventOrView(ExecutableElement executableElement, IsValid valid) {
String[] types = new String[]{CanonicalNameConstants.MOTION_EVENT, CanonicalNameConstants.VIEW};
hasNotOtherParameterThanTypes(types, executableElement, valid);
}

boolean isViewAndMotion = firstParameterType.equals(CanonicalNameConstants.VIEW) && secondParameterType.equals(CanonicalNameConstants.MOTION_EVENT);
boolean isMotionAndView = firstParameterType.equals(CanonicalNameConstants.MOTION_EVENT) && secondParameterType.equals(CanonicalNameConstants.VIEW);
public void hasNoOtherParameterThanViewOrBoolean(ExecutableElement executableElement, IsValid valid) {
String[] types = new String[]{CanonicalNameConstants.VIEW, CanonicalNameConstants.BOOLEAN, "boolean"};
hasNotOtherParameterThanTypes(types, executableElement, valid);
}

if (!isViewAndMotion && !isMotionAndView) {
valid.invalidate();
annotationHelper.printAnnotationError(executableElement, "the parameters must be a " + CanonicalNameConstants.VIEW + " and a " + CanonicalNameConstants.MOTION_EVENT + ", not a " + firstParameterType + " and a " + secondParameterType);
}
private void hasNotOtherParameterThanTypes(String[] typesCanonicalNames, ExecutableElement executableElement, IsValid valid) {
Collection<String> types = Arrays.asList(typesCanonicalNames);
for (VariableElement parameter : executableElement.getParameters()) {
String parameterType = parameter.asType().toString();
if (!types.contains(parameterType)) {
annotationHelper.printAnnotationError(executableElement, "You can declare only parameters of type "+Arrays.toString(typesCanonicalNames));
valid.invalidate();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,13 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content" />

<Button
<Button
android:id="@+id/buttonWithOnlyViewArgument"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />


<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public void conventionButton(CompoundButton evt, boolean hasFocus) {
}

@CheckedChange
public void snakeCaseButton() {
public void snakeCaseButton(boolean hasFocus, CompoundButton evt) {

}

Expand All @@ -44,7 +44,7 @@ public void overridenConventionButton() {
}

@CheckedChange
public void buttonWithViewArgument() {
public void buttonWithViewArgument(boolean hasFocus) {

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public void conventionButton(View evt, boolean hasFocus) {
}

@FocusChange
public void snakeCaseButton() {
public void snakeCaseButton(boolean hasFocus) {

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ public void buttonWithViewArgument(MotionEvent evt, View viewArgument) {
this.viewArgument = viewArgument;
}

@Touch
public void buttonWithOnlyViewArgument(View viewArgument) {
}

@Touch({ R.id.button1, R.id.button2 })
public void multipleButtonWithViewArgument(MotionEvent evt,
View viewArgument) {
Expand Down