From 1ae49561a1397716e09c95e15bfc6cda10dafad2 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 09:45:40 +0200
Subject: [PATCH 01/15] add isTypeOrSubclass() and castArgumentIfNecessary()
helper to AbstractListenerHandler
---
.../handler/AbstractListenerHandler.java | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java
index 58a814efbf..95a8ef3da3 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java
@@ -22,9 +22,11 @@
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
+import org.androidannotations.helper.APTCodeModelHelper;
import org.androidannotations.helper.AndroidManifest;
import org.androidannotations.helper.IdAnnotationHelper;
import org.androidannotations.helper.IdValidatorHelper;
@@ -37,13 +39,16 @@
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JDefinedClass;
+import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JFieldRef;
import com.sun.codemodel.JInvocation;
import com.sun.codemodel.JMethod;
+import com.sun.codemodel.JVar;
public abstract class AbstractListenerHandler extends BaseAnnotationHandler {
+ private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper();
private IdAnnotationHelper helper;
private T holder;
private String methodName;
@@ -100,6 +105,22 @@ public void process(Element element, T holder) {
assignListeners(holder, idsRefs, listenerAnonymousClass);
}
+ protected final JExpression castArgumentIfNecessary(T holder, String baseType, JVar param, Element element) {
+ JExpression argument = param;
+ TypeMirror typeMirror = element.asType();
+ if (!baseType.equals(typeMirror.toString())) {
+ JClass typeMirrorToJClass = codeModelHelper.typeMirrorToJClass(typeMirror, holder);
+ argument = JExpr.cast(typeMirrorToJClass, param);
+ }
+ return argument;
+ }
+
+ protected final boolean isTypeOrSubclass(String baseType, Element element) {
+ TypeMirror typeMirror = element.asType();
+ TypeElement typeElement = helper.typeElementFromQualifiedName(baseType);
+ return helper.isSubtype(typeMirror, typeElement.asType());
+ }
+
protected abstract void assignListeners(T holder, List idsRefs, JDefinedClass listenerAnonymousClass);
protected abstract void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror returnType);
From 9f6a66552318e384a846d7212c56f931d083883c Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 09:45:57 +0200
Subject: [PATCH 02/15] allow Preference subclasses as parameter for
@PreferenceChange and @PreferenceClick
---
.../androidannotations/annotations/PreferenceChange.java | 9 +++++++--
.../androidannotations/annotations/PreferenceClick.java | 9 +++++++--
.../handler/PreferenceChangeHandler.java | 7 +++----
.../handler/PreferenceClickHandler.java | 4 ++--
4 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceChange.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceChange.java
index 4a6c41679e..435fce96aa 100644
--- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceChange.java
+++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceChange.java
@@ -39,8 +39,8 @@
* The method MAY have multiple parameter:
*
*
- * A {@link android.preference.Preference Preference} parameter to know
- * which preference was targeted by this event
+ * A {@link android.preference.Preference Preference} (or a sublcass)
+ * parameter to know which preference was targeted by this event
* An {@link Object}, {@link String}, {@link java.util.Set Set of strings}
* and also a {@link Boolean}, {@link Float}, {@link Integer}, {@link Long} or
* their corresponding primitive types to obtain the new value of the
@@ -65,6 +65,11 @@
* // Something Here
* }
*
+ * @PreferenceChange
+ * void myPref PreferenceChanged(ListPreference preference) {
+ * // Something Here
+ * }
+ *
* @PreferenceChange({R.string.myPref1, R.string.myPref2} )
* void preferenceChangeOnMultiplePrefs(Preference preference, String newValue) {
* // Something Here
diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceClick.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceClick.java
index e81e79a2d7..5c74e50e7a 100644
--- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceClick.java
+++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/PreferenceClick.java
@@ -37,8 +37,8 @@
* The method MAY have one parameter:
*
*
- * A {@link android.preference.Preference Preference} parameter to know
- * which preference has been clicked
+ * A {@link android.preference.Preference Preference} (or a subclass)
+ * parameter to know which preference has been clicked
*
*
*
@@ -54,6 +54,11 @@
* void myPref PreferenceClicked(Preference preference) {
* // Something Here
* }
+ *
+ * @PreferenceClick
+ * void myPref PreferenceClicked(ListPreference preference) {
+ * // Something Here
+ * }
*
*
*
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceChangeHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceChangeHandler.java
index b37afab6eb..79ba096c78 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceChangeHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceChangeHandler.java
@@ -59,7 +59,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid);
validatorHelper.param.anyOrder() //
- .type(CanonicalNameConstants.PREFERENCE).optional() //
+ .extendsType(CanonicalNameConstants.PREFERENCE).optional() //
.anyOfTypes(CanonicalNameConstants.OBJECT, CanonicalNameConstants.STRING_SET, CanonicalNameConstants.STRING, //
CanonicalNameConstants.BOOLEAN, boolean.class.getName(), //
CanonicalNameConstants.INTEGER, int.class.getName(), //
@@ -86,9 +86,8 @@ protected void processParameters(HasPreferences holder, JMethod listenerMethod,
for (VariableElement variableElement : userParameters) {
String type = variableElement.asType().toString();
-
- if (type.equals(CanonicalNameConstants.PREFERENCE)) {
- call.arg(preferenceParam);
+ if (isTypeOrSubclass(CanonicalNameConstants.PREFERENCE, variableElement)) {
+ call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.PREFERENCE, preferenceParam, variableElement));
} else if (type.equals(CanonicalNameConstants.OBJECT)) {
call.arg(newValueParam);
} else if (type.equals(CanonicalNameConstants.INTEGER) || type.equals(int.class.getName()) || //
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceClickHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceClickHandler.java
index 61e0ec464e..4b2a0d3cc8 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceClickHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PreferenceClickHandler.java
@@ -55,7 +55,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid);
validatorHelper.param //
- .type(CanonicalNameConstants.PREFERENCE).optional() //
+ .extendsType(CanonicalNameConstants.PREFERENCE).optional() //
.validate(executableElement, valid);
}
@@ -75,7 +75,7 @@ protected void processParameters(HasPreferences holder, JMethod listenerMethod,
JVar preferenceParam = listenerMethod.param(classes().PREFERENCE, "preference");
if (userParameters.size() == 1) {
- call.arg(preferenceParam);
+ call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.PREFERENCE, preferenceParam, userParameters.get(0)));
}
}
From 26649abfb5dfa71e23d6a8709eb2c59b93cd4eb8 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 09:46:22 +0200
Subject: [PATCH 03/15] add test for subclass parameters on @PreferenceClick
and @PreferenceChange
---
.../functional-test-1-5/res/values/values.xml | 3 ++-
.../functional-test-1-5/res/xml/settings.xml | 2 ++
.../PreferenceEventsHandledActivity.java | 11 +++++++++++
.../PreferenceEventsHandledActivityTest.java | 16 ++++++++++++++++
4 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/AndroidAnnotations/functional-test-1-5/res/values/values.xml b/AndroidAnnotations/functional-test-1-5/res/values/values.xml
index cc332c0475..5cbc0a19d1 100644
--- a/AndroidAnnotations/functional-test-1-5/res/values/values.xml
+++ b/AndroidAnnotations/functional-test-1-5/res/values/values.xml
@@ -29,6 +29,7 @@
editTextPrefKey
listPreferenceKey
checkBoxPrefKey
+ checkBoxWithCastPrefKey
switchPrefKey
-
\ No newline at end of file
+
diff --git a/AndroidAnnotations/functional-test-1-5/res/xml/settings.xml b/AndroidAnnotations/functional-test-1-5/res/xml/settings.xml
index 0c52a89690..250a0e8322 100644
--- a/AndroidAnnotations/functional-test-1-5/res/xml/settings.xml
+++ b/AndroidAnnotations/functional-test-1-5/res/xml/settings.xml
@@ -30,6 +30,8 @@
+
+
diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/preference/PreferenceEventsHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/preference/PreferenceEventsHandledActivity.java
index 8b4ec7505f..831a829a48 100644
--- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/preference/PreferenceEventsHandledActivity.java
+++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/preference/PreferenceEventsHandledActivity.java
@@ -21,6 +21,7 @@
import org.androidannotations.test15.R;
import android.os.Bundle;
+import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
@@ -66,6 +67,11 @@ void checkBoxPreferenceChanged(Preference preference, Boolean newValue) {
this.newValue = newValue;
}
+ @PreferenceChange(R.string.checkBoxWithCastPrefKey)
+ void checkBoxWithCastPreferenceChanged(CheckBoxPreference preference) {
+ this.preference = preference;
+ }
+
@PreferenceChange(R.string.switchPrefKey)
boolean switchPreferenceChanged() {
return false;
@@ -86,6 +92,11 @@ void checkBoxPreferenceClicked(Preference preference) {
this.preference = preference;
}
+ @PreferenceClick(R.string.checkBoxWithCastPrefKey)
+ void checkBoxWithCastPreferenceClicked(CheckBoxPreference preference) {
+ this.preference = preference;
+ }
+
@PreferenceClick(R.string.switchPrefKey)
boolean switchPreferenceClicked() {
return false;
diff --git a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/preference/PreferenceEventsHandledActivityTest.java b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/preference/PreferenceEventsHandledActivityTest.java
index f48f5b91a7..ef2d1e7d62 100644
--- a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/preference/PreferenceEventsHandledActivityTest.java
+++ b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/preference/PreferenceEventsHandledActivityTest.java
@@ -69,6 +69,14 @@ public void testPreferenceChangeParameterPassed() {
assertThat(activity.newValue).isSameAs(newValue);
}
+ @Test
+ public void testPreferenceChangeCastedParameterPassed() {
+ Preference preference = activity.findPreference(activity.getString(R.string.checkBoxWithCastPrefKey));
+ preference.getOnPreferenceChangeListener().onPreferenceChange(preference, true);
+
+ assertThat(activity.preference).isSameAs(preference);
+ }
+
@Test
public void testPreferenceChangeParsedParameterPassed() {
Preference preference = activity.findPreference(activity.getString(R.string.editTextPrefKey));
@@ -122,6 +130,14 @@ public void testPreferenceClickParameterPassed() {
assertThat(activity.preference).isSameAs(preference);
}
+ @Test
+ public void testPreferenceClickCastedParameterPassed() {
+ Preference preference = activity.findPreference(activity.getString(R.string.checkBoxWithCastPrefKey));
+ preference.getOnPreferenceClickListener().onPreferenceClick(preference);
+
+ assertThat(activity.preference).isSameAs(preference);
+ }
+
@Test
public void testPreferenceClickDefaultReturnValue() {
Preference preference = activity.findPreference(activity.getString(R.string.listPreferenceKey));
From e3047014e82bdbb3b6ac117cb1db47024797a658 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 09:47:06 +0200
Subject: [PATCH 04/15] allow subclasses for @CheckedChange
---
.../androidannotations/annotations/CheckedChange.java | 9 +++++++--
.../androidannotations/handler/CheckedChangeHandler.java | 6 +++---
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/CheckedChange.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/CheckedChange.java
index 7aa88dd79d..00c4716ca7 100644
--- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/CheckedChange.java
+++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/CheckedChange.java
@@ -37,8 +37,8 @@
* The method MAY have multiple parameter:
*
*
- * A {@link android.widget.CompoundButton} parameter to know which view has
- * targeted this event
+ * A {@link android.widget.CompoundButton} (or a subclass) parameter to know
+ * which view has targeted this event
* An {@link boolean} to know the new state of the view.
*
*
@@ -56,6 +56,11 @@
* // Something Here
* }
*
+ * @CheckedChange
+ * void myButton CheckedChanged(CheckBox button) {
+ * // Something Here
+ * }
+ *
* @CheckedChange({R.id.myButton, R.id.myButton1} )
* void checkedChangedOnSomeButtons(CompoundButton button, boolean isChecked) {
* // Something Here
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java
index 45cfc652c6..66ea9dffe5 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java
@@ -52,7 +52,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
validatorHelper.returnTypeIsVoid(executableElement, valid);
validatorHelper.param.anyOrder() //
- .type(CanonicalNameConstants.COMPOUND_BUTTON).optional() //
+ .extendsType(CanonicalNameConstants.COMPOUND_BUTTON).optional() //
.primitiveOrWrapper(TypeKind.BOOLEAN).optional() //
.validate(executableElement, valid);
}
@@ -69,8 +69,8 @@ protected void processParameters(EComponentWithViewSupportHolder holder, JMethod
for (VariableElement parameter : parameters) {
String parameterType = parameter.asType().toString();
- if (parameterType.equals(CanonicalNameConstants.COMPOUND_BUTTON)) {
- call.arg(btnParam);
+ if (isTypeOrSubclass(CanonicalNameConstants.COMPOUND_BUTTON, parameter)) {
+ call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.COMPOUND_BUTTON, btnParam, parameter));
} else if (parameterType.equals(CanonicalNameConstants.BOOLEAN) || parameter.asType().getKind() == TypeKind.BOOLEAN) {
call.arg(isCheckedParam);
}
From 993fd409fa2ca768c88b90e58d465de9a34e78fa Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 09:47:38 +0200
Subject: [PATCH 05/15] add test for subclasses in @CheckedChange
---
.../res/layout/checkable_widgets.xml | 5 +++++
.../test15/CheckedChangeHandledActivity.java | 7 ++++++-
.../test15/CheckedChangeHandledActivityTest.java | 12 +++++++++++-
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/AndroidAnnotations/functional-test-1-5/res/layout/checkable_widgets.xml b/AndroidAnnotations/functional-test-1-5/res/layout/checkable_widgets.xml
index 95586df4c7..ca742f8fdf 100644
--- a/AndroidAnnotations/functional-test-1-5/res/layout/checkable_widgets.xml
+++ b/AndroidAnnotations/functional-test-1-5/res/layout/checkable_widgets.xml
@@ -26,6 +26,11 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
+
+
Date: Thu, 4 Jun 2015 09:48:02 +0200
Subject: [PATCH 06/15] allow subclasses for @Click
---
.../java/org/androidannotations/annotations/Click.java | 9 +++++++--
.../org/androidannotations/handler/ClickHandler.java | 2 +-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Click.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Click.java
index 4ab6c7e10a..bdf7efdfe5 100644
--- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Click.java
+++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Click.java
@@ -34,8 +34,8 @@
* The method MAY have one parameter:
*
*
- * A {@link android.view.View} parameter to know which view has been clicked
- *
+ * A {@link android.view.View} (or a subclass) parameter to know which view
+ * has been clicked
*
*
*
@@ -51,6 +51,11 @@
* void myButton Clicked(View view) {
* // Something Here
* }
+ *
+ * @Click
+ * void myButton Clicked(Button view) {
+ * // Something Here
+ * }
*
*
*
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ClickHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ClickHandler.java
index bd6f841455..1b5e9d0175 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ClickHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ClickHandler.java
@@ -66,7 +66,7 @@ protected void processParameters(EComponentWithViewSupportHolder holder, JMethod
JVar viewParam = listenerMethod.param(classes().VIEW, "view");
if (hasItemParameter) {
- call.arg(viewParam);
+ call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.VIEW, viewParam, parameters.get(0)));
}
}
From 8d475a7ffaf18dd000cf494d3217ab143a9d0f99 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 09:54:24 +0200
Subject: [PATCH 07/15] add test for subclasses in @Click
---
.../res/layout/clickable_widgets.xml | 5 +++++
.../test15/ClicksHandledActivity.java | 6 ++++++
.../test15/ClicksHandledActivityTest.java | 12 +++++++++++-
3 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/AndroidAnnotations/functional-test-1-5/res/layout/clickable_widgets.xml b/AndroidAnnotations/functional-test-1-5/res/layout/clickable_widgets.xml
index 8905815ad4..c8d49261f7 100644
--- a/AndroidAnnotations/functional-test-1-5/res/layout/clickable_widgets.xml
+++ b/AndroidAnnotations/functional-test-1-5/res/layout/clickable_widgets.xml
@@ -26,6 +26,11 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
+
+
Date: Thu, 4 Jun 2015 10:03:31 +0200
Subject: [PATCH 08/15] allow subclasses for @EditorAction
---
.../org/androidannotations/annotations/EditorAction.java | 9 +++++++--
.../androidannotations/handler/EditorActionHandler.java | 6 +++---
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EditorAction.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EditorAction.java
index bf1ddd65c6..32e26d09e7 100644
--- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EditorAction.java
+++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EditorAction.java
@@ -36,8 +36,8 @@
* The method MAY have multiple parameter :
*
*
- * A {@link android.widget.TextView} parameter to know which view has
- * targeted this event
+ * A {@link android.widget.TextView} (or a subclass) parameter to know which
+ * view has targeted this event
* An int parameter to get the actionId
* A {@link android.view.KeyEvent} parameter
*
@@ -63,6 +63,11 @@
* // Something Here
* }
*
+ * @EditorAction
+ * void helloEditText EditorAction(EditText hello) {
+ * // Something Here
+ * }
+ *
* @EditorAction({R.id.editText, R.id.helloTextView} )
* void onEditorActionsOnSomeTextViews(TextView tv, int actionId) {
* // Something Here
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EditorActionHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EditorActionHandler.java
index 06a6392931..02977a8836 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EditorActionHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EditorActionHandler.java
@@ -54,7 +54,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid);
validatorHelper.param.anyOrder() //
- .type(CanonicalNameConstants.TEXT_VIEW).optional() //
+ .extendsType(CanonicalNameConstants.TEXT_VIEW).optional() //
.primitiveOrWrapper(TypeKind.INT).optional() //
.type(CanonicalNameConstants.KEY_EVENT).optional() //
.validate(executableElement, valid);
@@ -80,8 +80,8 @@ protected void processParameters(EComponentWithViewSupportHolder holder, JMethod
for (VariableElement param : userParameters) {
String paramClassQualifiedName = param.asType().toString();
- if (paramClassQualifiedName.equals(CanonicalNameConstants.TEXT_VIEW)) {
- call.arg(textView);
+ if (isTypeOrSubclass(CanonicalNameConstants.TEXT_VIEW, param)) {
+ call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.TEXT_VIEW, textView, param));
} else if (paramClassQualifiedName.equals(CanonicalNameConstants.INTEGER) || paramClassQualifiedName.equals(codeModel().INT.fullName())) {
call.arg(actionId);
} else if (paramClassQualifiedName.equals(CanonicalNameConstants.KEY_EVENT)) {
From bce352bb66c7ab6f1fcf38dee0b728bb13e63591 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 10:03:43 +0200
Subject: [PATCH 09/15] add test for subclasses in @EditorAction
---
.../res/layout/textviews_injected.xml | 7 +++++++
.../test15/EditorActionsHandledActivity.java | 7 +++++++
.../test15/EditorActionsActivityTest.java | 12 ++++++++++++
3 files changed, 26 insertions(+)
diff --git a/AndroidAnnotations/functional-test-1-5/res/layout/textviews_injected.xml b/AndroidAnnotations/functional-test-1-5/res/layout/textviews_injected.xml
index 137eb2343c..8f6ee33483 100644
--- a/AndroidAnnotations/functional-test-1-5/res/layout/textviews_injected.xml
+++ b/AndroidAnnotations/functional-test-1-5/res/layout/textviews_injected.xml
@@ -66,4 +66,11 @@
android:inputType="text"
/>
+
+
diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EditorActionsHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EditorActionsHandledActivity.java
index 9c4cb08ccf..d2329f027a 100644
--- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EditorActionsHandledActivity.java
+++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EditorActionsHandledActivity.java
@@ -37,6 +37,8 @@ public class EditorActionsHandledActivity extends Activity {
@ViewById
EditText editText1;
+ EditText passedEditText;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -47,6 +49,11 @@ void editorActionWithFullParameters(TextView tv, int actionId, KeyEvent event) {
actionHandled = true;
}
+ @EditorAction(R.id.editText4)
+ void editorActionWithEditTextParameter(EditText et) {
+ passedEditText = et;
+ }
+
@EditorAction(R.id.editText2)
void editorActionInversedParameters(KeyEvent event, int actionId) {
this.actionId = actionId;
diff --git a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/EditorActionsActivityTest.java b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/EditorActionsActivityTest.java
index 457a4883e7..d25de27924 100644
--- a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/EditorActionsActivityTest.java
+++ b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/EditorActionsActivityTest.java
@@ -51,6 +51,18 @@ public void testActionHandled() {
assertThat(activity.actionHandled).isTrue();
}
+ @Test
+ public void testEditTextPassed() {
+ assertThat(activity.passedEditText).isNull();
+
+ EditText editText = (EditText) activity.findViewById(R.id.editText4);
+ OnEditorActionListener listener = getOnEditorActionListener(editText);
+
+ listener.onEditorAction(editText, 0, null);
+
+ assertThat(activity.passedEditText).isSameAs(editText);
+ }
+
@Test
public void testActionIdPassed() {
assertThat(activity.actionId).isZero();
From f35b7509ba716c4228499fce5a035417975e1ee7 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 10:09:03 +0200
Subject: [PATCH 10/15] allow subclasses for @FocusChange
---
.../org/androidannotations/annotations/FocusChange.java | 9 +++++++--
.../androidannotations/handler/FocusChangeHandler.java | 6 +++---
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/FocusChange.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/FocusChange.java
index a79ff89291..46f751269c 100644
--- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/FocusChange.java
+++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/FocusChange.java
@@ -36,8 +36,8 @@
* The method MAY have multiple parameter:
*
*
- * A {@link android.view.View} parameter to know which view has targeted
- * this event
+ * A {@link android.view.View} (or a subclass) parameter to know which view
+ * has targeted this event
* An {@link boolean} to know the view has focus.
*
*
@@ -56,6 +56,11 @@
* // Something Here
* }
*
+ * @FocusChange
+ * void myText FocusChanged(EditText button) {
+ * // Something Here
+ * }
+ *
* @FocusChange({R.id.myButton, R.id.myButton1} )
* void focusChangedOnSomeButtons(View button, boolean isChecked) {
* // Something Here
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java
index 3eb9b2f312..d75ff74605 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java
@@ -53,7 +53,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
validatorHelper.returnTypeIsVoid(executableElement, valid);
validatorHelper.param.anyOrder() //
- .type(CanonicalNameConstants.VIEW).optional() //
+ .extendsType(CanonicalNameConstants.VIEW).optional() //
.primitiveOrWrapper(TypeKind.BOOLEAN).optional() //
.validate(executableElement, valid);
}
@@ -70,8 +70,8 @@ protected void processParameters(EComponentWithViewSupportHolder holder, JMethod
for (VariableElement parameter : parameters) {
String parameterType = parameter.asType().toString();
- if (parameterType.equals(CanonicalNameConstants.VIEW)) {
- call.arg(viewParam);
+ if (isTypeOrSubclass(CanonicalNameConstants.VIEW, parameter)) {
+ call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.VIEW, viewParam, parameter));
} else if (parameterType.equals(CanonicalNameConstants.BOOLEAN) || parameter.asType().getKind() == TypeKind.BOOLEAN) {
call.arg(hasFocusParam);
}
From 00b0df59b128235d4fba0a826b96c3f1f1552e55 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 10:09:16 +0200
Subject: [PATCH 11/15] add test for subclasses in @FocusChange
---
.../test15/FocusChangeHandledActivity.java | 6 ++++++
.../test15/FocusChangeHandledActivityTest.java | 10 ++++++++++
2 files changed, 16 insertions(+)
diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FocusChangeHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FocusChangeHandledActivity.java
index d7ead7eeff..f4864c5fe6 100644
--- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FocusChangeHandledActivity.java
+++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FocusChangeHandledActivity.java
@@ -19,6 +19,7 @@
import org.androidannotations.annotations.FocusChange;
import android.view.View;
+import android.widget.Button;
@EActivity(R.layout.clickable_widgets)
public class FocusChangeHandledActivity extends EventsHandledAbstractActivity {
@@ -32,6 +33,11 @@ public void conventionButton(View evt, boolean hasFocus) {
}
+ @FocusChange
+ public void buttonWithButtonArgument(Button evt, boolean hasFocus) {
+ view = evt;
+ }
+
@FocusChange
public void snakeCaseButton(boolean hasFocus) {
snakeCaseButtonEventHandled = true;
diff --git a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/FocusChangeHandledActivityTest.java b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/FocusChangeHandledActivityTest.java
index 5220c1fb03..e36e78b6c7 100644
--- a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/FocusChangeHandledActivityTest.java
+++ b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/FocusChangeHandledActivityTest.java
@@ -54,6 +54,16 @@ public void testViewPassed() {
assertThat(activity.view).isEqualTo(view);
}
+ @Test
+ public void testButtonPassed() {
+ assertThat(activity.view).isNull();
+
+ View view = activity.findViewById(R.id.buttonWithButtonArgument);
+ view.getOnFocusChangeListener().onFocusChange(view, false);
+
+ assertThat(activity.view).isSameAs(view);
+ }
+
@Test
public void testHasFocusPassed() {
assertThat(activity.hasFocus).isFalse();
From e89b71067ce3e58f405420f66bfa02e8533b7156 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 10:31:32 +0200
Subject: [PATCH 12/15] allow subclasses for @LongClick
---
.../org/androidannotations/annotations/LongClick.java | 9 +++++++--
.../org/androidannotations/handler/LongClickHandler.java | 4 ++--
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/LongClick.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/LongClick.java
index 8275378b9e..101363e248 100644
--- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/LongClick.java
+++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/LongClick.java
@@ -40,8 +40,8 @@
* The method MAY have one parameter:
*
*
- * A {@link android.view.View} parameter to know which view has been long
- * clicked
+ * A {@link android.view.View} (or a subclass) parameter to know which view
+ * has been long clicked
*
*
*
@@ -59,6 +59,11 @@
* // Something Here
* }
*
+ * @LongClick
+ * void myButton LongClicked(Button view) {
+ * // Something Here
+ * }
+ *
* @LongClick(R.id.myButton )
* boolean longClickConsumed OnMyButton(View view) {
* return true;
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/LongClickHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/LongClickHandler.java
index 265b3566b2..3d280448e6 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/LongClickHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/LongClickHandler.java
@@ -53,7 +53,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid);
- validatorHelper.param.type(CanonicalNameConstants.VIEW).optional().validate(executableElement, valid);
+ validatorHelper.param.extendsType(CanonicalNameConstants.VIEW).optional().validate(executableElement, valid);
}
@Override
@@ -72,7 +72,7 @@ protected void processParameters(EComponentWithViewSupportHolder holder, JMethod
boolean hasViewParameter = parameters.size() == 1;
JVar viewParam = listenerMethod.param(classes().VIEW, "view");
if (hasViewParameter) {
- call.arg(viewParam);
+ call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.VIEW, viewParam, parameters.get(0)));
}
}
From c02c4b1b1a31e654bc2bb66bd39d8870ab8a95e7 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 10:31:45 +0200
Subject: [PATCH 13/15] add test for subclasses in @LongClick
---
.../test15/LongClicksHandledActivity.java | 6 ++++++
.../test15/LongClicksHandledActivityTest.java | 12 ++++++++++++
2 files changed, 18 insertions(+)
diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/LongClicksHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/LongClicksHandledActivity.java
index 5c48070733..c3516ab44d 100644
--- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/LongClicksHandledActivity.java
+++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/LongClicksHandledActivity.java
@@ -19,6 +19,7 @@
import org.androidannotations.annotations.LongClick;
import android.view.View;
+import android.widget.Button;
@EActivity(R.layout.clickable_widgets)
public class LongClicksHandledActivity extends EventsHandledAbstractActivity {
@@ -33,6 +34,11 @@ public void conventionButton() {
conventionButtonEventHandled = true;
}
+ @LongClick
+ public void buttonWithButtonArgument(Button button) {
+ viewArgument = button;
+ }
+
@LongClick
public void snakeCaseButton() {
snakeCaseButtonEventHandled = true;
diff --git a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/LongClicksHandledActivityTest.java b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/LongClicksHandledActivityTest.java
index 9e8ed58135..1ece447a52 100644
--- a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/LongClicksHandledActivityTest.java
+++ b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/LongClicksHandledActivityTest.java
@@ -24,6 +24,8 @@
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
+import android.widget.Button;
+
@RunWith(RobolectricTestRunner.class)
public class LongClicksHandledActivityTest {
@@ -96,6 +98,16 @@ public void viewArgumentIsGiven() {
assertThat(activity.viewArgument).hasId(R.id.buttonWithViewArgument);
}
+ @Test
+ public void buttonArgumentIsGiven() {
+ assertThat(activity.viewArgument).isNull();
+
+ Button button = (Button) activity.findViewById(R.id.buttonWithButtonArgument);
+ button.performLongClick();
+
+ assertThat(activity.viewArgument).isSameAs(button);
+ }
+
@Test
public void multipleButtonsClicked() {
assertThat(activity.multipleButtonsEventHandled).isFalse();
From 760a246d2927478dc305ee5072210af78e04976b Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 10:34:50 +0200
Subject: [PATCH 14/15] allow subclasses for @Touch
---
.../java/org/androidannotations/annotations/Touch.java | 9 +++++++--
.../org/androidannotations/handler/TouchHandler.java | 7 ++++---
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Touch.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Touch.java
index c9bc8f789f..004d2be592 100644
--- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Touch.java
+++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Touch.java
@@ -41,8 +41,8 @@
* The method MAY have one or two parameters:
*
*
- * A {@link android.view.View} parameter to know which view has been clicked
- *
+ * A {@link android.view.View} (or a subclass) parameter to know which view
+ * has been clicked
* A {@link android.view.MotionEvent} parameter
*
*
@@ -61,6 +61,11 @@
* }
*
* @Touch
+ * void myText Touched(TextView view) {
+ * // Something Here
+ * }
+ *
+ * @Touch
* void myButton Touched(View view, MotionEvent motionEvent) {
* // Something Here
* }
diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java
index ef11351a19..468532ed31 100644
--- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java
+++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java
@@ -55,7 +55,7 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa
validatorHelper.param.anyOrder() //
.type(CanonicalNameConstants.MOTION_EVENT).optional() //
- .type(CanonicalNameConstants.VIEW).optional() //
+ .extendsType(CanonicalNameConstants.VIEW).optional() //
.validate(executableElement, valid);
}
@@ -78,10 +78,11 @@ protected void processParameters(EComponentWithViewSupportHolder holder, JMethod
for (VariableElement parameter : parameters) {
String parameterType = parameter.asType().toString();
+
if (parameterType.equals(CanonicalNameConstants.MOTION_EVENT)) {
call.arg(eventParam);
- } else if (parameterType.equals(CanonicalNameConstants.VIEW)) {
- call.arg(viewParam);
+ } else if (isTypeOrSubclass(CanonicalNameConstants.VIEW, parameter)) {
+ call.arg(castArgumentIfNecessary(holder, CanonicalNameConstants.VIEW, viewParam, parameter));
}
}
}
From 8f95477bbdde3a65f268f79df6ff8779077adcc5 Mon Sep 17 00:00:00 2001
From: Kay-Uwe Janssen
Date: Thu, 4 Jun 2015 10:35:00 +0200
Subject: [PATCH 15/15] add test for subclasses in @Touch
---
.../test15/TouchesHandledActivity.java | 6 ++++++
.../test15/TouchesHandledActivityTest.java | 11 +++++++++++
2 files changed, 17 insertions(+)
diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TouchesHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TouchesHandledActivity.java
index 23efd2648b..77a643a047 100644
--- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TouchesHandledActivity.java
+++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TouchesHandledActivity.java
@@ -20,6 +20,7 @@
import android.view.MotionEvent;
import android.view.View;
+import android.widget.Button;
@EActivity(R.layout.clickable_widgets)
public class TouchesHandledActivity extends EventsHandledAbstractActivity {
@@ -53,6 +54,11 @@ public void buttonWithViewArgument(MotionEvent evt, View viewArgument) {
this.viewArgument = viewArgument;
}
+ @Touch
+ public void buttonWithButtonArgument(MotionEvent evt, Button button) {
+ viewArgument = button;
+ }
+
@Touch
public void buttonWithOnlyViewArgument(View viewArgument) {
}
diff --git a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/TouchesHandledActivityTest.java b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/TouchesHandledActivityTest.java
index 2a2e2a48c4..e7eef3ea7c 100644
--- a/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/TouchesHandledActivityTest.java
+++ b/AndroidAnnotations/functional-test-1-5/src/test/java/org/androidannotations/test15/TouchesHandledActivityTest.java
@@ -25,6 +25,7 @@
import org.robolectric.RobolectricTestRunner;
import android.view.MotionEvent;
+import android.widget.Button;
@RunWith(RobolectricTestRunner.class)
public class TouchesHandledActivityTest {
@@ -98,6 +99,16 @@ public void viewArgumentIsGiven() {
assertThat(activity.viewArgument).hasId(R.id.buttonWithViewArgument);
}
+ @Test
+ public void buttonArgumentIsGiven() {
+ assertThat(activity.viewArgument).isNull();
+
+ Button button = (Button) activity.findViewById(R.id.buttonWithButtonArgument);
+ button.dispatchTouchEvent(mockedEvent);
+
+ assertThat(activity.viewArgument).isSameAs(button);
+ }
+
@Test
public void multipleButtonsClicked() {
assertThat(activity.multipleButtonsEventHandled).isFalse();