Skip to content

Commit 9908423

Browse files
committed
Merge pull request androidannotations#1441 from dodgex/1285_allow_sublcasses_as_parameters
Allow subclasses as parameters
2 parents 0c2b18e + 8f95477 commit 9908423

36 files changed

Lines changed: 250 additions & 41 deletions

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/CheckedChange.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
* The method MAY have multiple parameter:
3838
* </p>
3939
* <ul>
40-
* <li>A {@link android.widget.CompoundButton} parameter to know which view has
41-
* targeted this event</li>
40+
* <li>A {@link android.widget.CompoundButton} (or a subclass) parameter to know
41+
* which view has targeted this event</li>
4242
* <li>An {@link boolean} to know the new state of the view.</li>
4343
* </ul>
4444
* <blockquote>
@@ -56,6 +56,11 @@
5656
* // Something Here
5757
* }
5858
*
59+
* &#064;CheckedChange
60+
* void <b>myButton</b>CheckedChanged(CheckBox button) {
61+
* // Something Here
62+
* }
63+
*
5964
* &#064;CheckedChange(<b>{R.id.myButton, R.id.myButton1}</b>)
6065
* void checkedChangedOnSomeButtons(CompoundButton button, boolean isChecked) {
6166
* // Something Here

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Click.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
* The method MAY have one parameter:
3535
* </p>
3636
* <ul>
37-
* <li>A {@link android.view.View} parameter to know which view has been clicked
38-
* </li>
37+
* <li>A {@link android.view.View} (or a subclass) parameter to know which view
38+
* has been clicked</li>
3939
* </ul>
4040
* <blockquote>
4141
*
@@ -51,6 +51,11 @@
5151
* void <b>myButton</b>Clicked(View view) {
5252
* // Something Here
5353
* }
54+
*
55+
* &#064;Click
56+
* void <b>myButton</b>Clicked(Button view) {
57+
* // Something Here
58+
* }
5459
* </pre>
5560
*
5661
* </blockquote>

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EditorAction.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
* The method MAY have multiple parameter :
3737
* </p>
3838
* <ul>
39-
* <li>A {@link android.widget.TextView} parameter to know which view has
40-
* targeted this event</li>
39+
* <li>A {@link android.widget.TextView} (or a subclass) parameter to know which
40+
* view has targeted this event</li>
4141
* <li>An int parameter to get the actionId</li>
4242
* <li>A {@link android.view.KeyEvent} parameter</li>
4343
* </ul>
@@ -63,6 +63,11 @@
6363
* // Something Here
6464
* }
6565
*
66+
* &#064;EditorAction
67+
* void <b>helloEditText</b>EditorAction(EditText hello) {
68+
* // Something Here
69+
* }
70+
*
6671
* &#064;EditorAction(<b>{R.id.editText, R.id.helloTextView}</b>)
6772
* void onEditorActionsOnSomeTextViews(TextView tv, int actionId) {
6873
* // Something Here

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/FocusChange.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
* The method MAY have multiple parameter:
3737
* </p>
3838
* <ul>
39-
* <li>A {@link android.view.View} parameter to know which view has targeted
40-
* this event</li>
39+
* <li>A {@link android.view.View} (or a subclass) parameter to know which view
40+
* has targeted this event</li>
4141
* <li>An {@link boolean} to know the view has focus.</li>
4242
* </ul>
4343
*
@@ -56,6 +56,11 @@
5656
* // Something Here
5757
* }
5858
*
59+
* &#064;FocusChange
60+
* void <b>myText</b>FocusChanged(EditText button) {
61+
* // Something Here
62+
* }
63+
*
5964
* &#064;FocusChange(<b>{R.id.myButton, R.id.myButton1}</b>)
6065
* void focusChangedOnSomeButtons(View button, boolean isChecked) {
6166
* // Something Here

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/LongClick.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
* The method MAY have one parameter:
4141
* </p>
4242
* <ul>
43-
* <li>A {@link android.view.View} parameter to know which view has been long
44-
* clicked</li>
43+
* <li>A {@link android.view.View} (or a subclass) parameter to know which view
44+
* has been long clicked</li>
4545
* </ul>
4646
*
4747
* <blockquote>
@@ -59,6 +59,11 @@
5959
* // Something Here
6060
* }
6161
*
62+
* &#064;LongClick
63+
* void <b>myButton</b>LongClicked(Button view) {
64+
* // Something Here
65+
* }
66+
*
6267
* &#064;LongClick(<b>R.id.myButton</b>)
6368
* boolean longClick<b>Consumed</b>OnMyButton(View view) {
6469
* return true;

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceChange.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
* The method MAY have multiple parameter:
4040
* </p>
4141
* <ul>
42-
* <li>A {@link android.preference.Preference Preference} parameter to know
43-
* which preference was targeted by this event</li>
42+
* <li>A {@link android.preference.Preference Preference} (or a sublcass)
43+
* parameter to know which preference was targeted by this event</li>
4444
* <li>An {@link Object}, {@link String}, {@link java.util.Set Set of strings}
4545
* and also a {@link Boolean}, {@link Float}, {@link Integer}, {@link Long} or
4646
* their corresponding primitive types to obtain the new value of the
@@ -65,6 +65,11 @@
6565
* // Something Here
6666
* }
6767
*
68+
* &#064;PreferenceChange
69+
* void <b>myPref</b>PreferenceChanged(ListPreference preference) {
70+
* // Something Here
71+
* }
72+
*
6873
* &#064;PreferenceChange(<b>{R.string.myPref1, R.string.myPref2}</b>)
6974
* void preferenceChangeOnMultiplePrefs(Preference preference, String newValue) {
7075
* // Something Here

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceClick.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
* The method MAY have one parameter:
3838
* </p>
3939
* <ul>
40-
* <li>A {@link android.preference.Preference Preference} parameter to know
41-
* which preference has been clicked</li>
40+
* <li>A {@link android.preference.Preference Preference} (or a subclass)
41+
* parameter to know which preference has been clicked</li>
4242
* </ul>
4343
* <blockquote>
4444
*
@@ -54,6 +54,11 @@
5454
* void <b>myPref</b>PreferenceClicked(Preference preference) {
5555
* // Something Here
5656
* }
57+
*
58+
* &#064;PreferenceClick
59+
* void <b>myPref</b>PreferenceClicked(ListPreference preference) {
60+
* // Something Here
61+
* }
5762
* </pre>
5863
*
5964
* </blockquote>

‎AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Touch.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
* The method MAY have one or two parameters:
4242
* </p>
4343
* <ul>
44-
* <li>A {@link android.view.View} parameter to know which view has been clicked
45-
* </li>
44+
* <li>A {@link android.view.View} (or a subclass) parameter to know which view
45+
* has been clicked</li>
4646
* <li>A {@link android.view.MotionEvent} parameter</li>
4747
* </ul>
4848
* <blockquote>
@@ -61,6 +61,11 @@
6161
* }
6262
*
6363
* &#064;Touch
64+
* void <b>myText</b>Touched(TextView view) {
65+
* // Something Here
66+
* }
67+
*
68+
* &#064;Touch
6469
* void <b>myButton</b>Touched(View view, MotionEvent motionEvent) {
6570
* // Something Here
6671
* }

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
import javax.annotation.processing.ProcessingEnvironment;
2323
import javax.lang.model.element.Element;
2424
import javax.lang.model.element.ExecutableElement;
25+
import javax.lang.model.element.TypeElement;
2526
import javax.lang.model.element.VariableElement;
2627
import javax.lang.model.type.TypeMirror;
2728

29+
import org.androidannotations.helper.APTCodeModelHelper;
2830
import org.androidannotations.helper.AndroidManifest;
2931
import org.androidannotations.helper.IdAnnotationHelper;
3032
import org.androidannotations.helper.IdValidatorHelper;
@@ -37,13 +39,16 @@
3739
import com.sun.codemodel.JBlock;
3840
import com.sun.codemodel.JClass;
3941
import com.sun.codemodel.JDefinedClass;
42+
import com.sun.codemodel.JExpr;
4043
import com.sun.codemodel.JExpression;
4144
import com.sun.codemodel.JFieldRef;
4245
import com.sun.codemodel.JInvocation;
4346
import com.sun.codemodel.JMethod;
47+
import com.sun.codemodel.JVar;
4448

4549
public abstract class AbstractListenerHandler<T extends GeneratedClassHolder> extends BaseAnnotationHandler<T> {
4650

51+
private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper();
4752
private IdAnnotationHelper helper;
4853
private T holder;
4954
private String methodName;
@@ -100,6 +105,22 @@ public void process(Element element, T holder) {
100105
assignListeners(holder, idsRefs, listenerAnonymousClass);
101106
}
102107

108+
protected final JExpression castArgumentIfNecessary(T holder, String baseType, JVar param, Element element) {
109+
JExpression argument = param;
110+
TypeMirror typeMirror = element.asType();
111+
if (!baseType.equals(typeMirror.toString())) {
112+
JClass typeMirrorToJClass = codeModelHelper.typeMirrorToJClass(typeMirror, holder);
113+
argument = JExpr.cast(typeMirrorToJClass, param);
114+
}
115+
return argument;
116+
}
117+
118+
protected final boolean isTypeOrSubclass(String baseType, Element element) {
119+
TypeMirror typeMirror = element.asType();
120+
TypeElement typeElement = helper.typeElementFromQualifiedName(baseType);
121+
return helper.isSubtype(typeMirror, typeElement.asType());
122+
}
123+
103124
protected abstract void assignListeners(T holder, List<JFieldRef> idsRefs, JDefinedClass listenerAnonymousClass);
104125

105126
protected abstract void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror returnType);

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
5252
validatorHelper.returnTypeIsVoid(executableElement, valid);
5353

5454
validatorHelper.param.anyOrder() //
55-
.type(CanonicalNameConstants.COMPOUND_BUTTON).optional() //
55+
.extendsType(CanonicalNameConstants.COMPOUND_BUTTON).optional() //
5656
.primitiveOrWrapper(TypeKind.BOOLEAN).optional() //
5757
.validate(executableElement, valid);
5858
}
@@ -69,8 +69,8 @@ protected void processParameters(EComponentWithViewSupportHolder holder, JMethod
6969

7070
for (VariableElement parameter : parameters) {
7171
String parameterType = parameter.asType().toString();
72-
if (parameterType.equals(CanonicalNameConstants.COMPOUND_BUTTON)) {
73-
call.arg(btnParam);
72+
if (isTypeOrSubclass(CanonicalNameConstants.COMPOUND_BUTTON, parameter)) {
73+
call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.COMPOUND_BUTTON, btnParam, parameter));
7474
} else if (parameterType.equals(CanonicalNameConstants.BOOLEAN) || parameter.asType().getKind() == TypeKind.BOOLEAN) {
7575
call.arg(isCheckedParam);
7676
}

0 commit comments

Comments
 (0)