From 1b7183ceb4a4f9003b429cbfaae295af31931757 Mon Sep 17 00:00:00 2001
From: shiraji
Date: Sat, 19 Dec 2015 01:27:12 +0900
Subject: [PATCH 1/4] Rename IgnoredWhenDetached to IgnoreWhen
---
.../{IgnoredWhenDetached.java => IgnoreWhen.java} | 6 +++---
.../androidannotations/test/efragment/MyListFragment.java | 8 ++++----
.../org/androidannotations/internal/core/CorePlugin.java | 6 +++---
...redWhenDetachedHandler.java => IgnoreWhenHandler.java} | 8 ++++----
4 files changed, 14 insertions(+), 14 deletions(-)
rename AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/{IgnoredWhenDetached.java => IgnoreWhen.java} (95%)
rename AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/{IgnoredWhenDetachedHandler.java => IgnoreWhenHandler.java} (87%)
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoredWhenDetached.java b/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoreWhen.java
similarity index 95%
rename from AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoredWhenDetached.java
rename to AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoreWhen.java
index 19d7a48774..069e22d4ac 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoredWhenDetached.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoreWhen.java
@@ -47,13 +47,13 @@
* ...
*
* @UiThread
- * @IgnoredWhenDetached
+ * @IgnoreWhen
* void killActivity() {
* getActivity().finish();
* }
*
*
- * @IgnoredWhenDetached
+ * @IgnoreWhen
* void updateTitle(String title) {
* getActivity().setTitle(title);
* }
@@ -69,6 +69,6 @@
*/
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
-public @interface IgnoredWhenDetached {
+public @interface IgnoreWhen {
}
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/efragment/MyListFragment.java b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/efragment/MyListFragment.java
index 4b9ba2d544..3f2c7c46e4 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/efragment/MyListFragment.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/efragment/MyListFragment.java
@@ -17,7 +17,7 @@
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.EFragment;
-import org.androidannotations.annotations.IgnoredWhenDetached;
+import org.androidannotations.annotations.IgnoreWhen;
import org.androidannotations.annotations.ItemClick;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
@@ -58,7 +58,7 @@ void uiThread() {
}
@UiThread(propagation = UiThread.Propagation.REUSE)
- @IgnoredWhenDetached
+ @IgnoreWhen
void uiThreadIgnored() {
didExecute = true;
}
@@ -74,12 +74,12 @@ void backgroundThread() {
}
@Background
- @IgnoredWhenDetached
+ @IgnoreWhen
void backgroundThreadIgnored() {
didExecute = true;
}
- @IgnoredWhenDetached
+ @IgnoreWhen
void ignored() {
didExecute = true;
}
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/CorePlugin.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/CorePlugin.java
index 1c0e9862ca..a2f868f1cd 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/CorePlugin.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/CorePlugin.java
@@ -60,7 +60,7 @@
import org.androidannotations.internal.core.handler.HierarchyViewerSupportHandler;
import org.androidannotations.internal.core.handler.HtmlResHandler;
import org.androidannotations.internal.core.handler.HttpsClientHandler;
-import org.androidannotations.internal.core.handler.IgnoredWhenDetachedHandler;
+import org.androidannotations.internal.core.handler.IgnoreWhenHandler;
import org.androidannotations.internal.core.handler.InjectMenuHandler;
import org.androidannotations.internal.core.handler.InstanceStateHandler;
import org.androidannotations.internal.core.handler.ItemClickHandler;
@@ -206,7 +206,7 @@ public List> getHandlers(AndroidAnnotationsEnvironment andr
annotationHandlers.add(new PageScrollStateChangedHandler(androidAnnotationEnv));
annotationHandlers.add(new PageSelectedHandler(androidAnnotationEnv));
- annotationHandlers.add(new IgnoredWhenDetachedHandler(androidAnnotationEnv));
+ annotationHandlers.add(new IgnoreWhenHandler(androidAnnotationEnv));
annotationHandlers.add(new AfterInjectHandler(androidAnnotationEnv));
annotationHandlers.add(new AfterExtrasHandler(androidAnnotationEnv));
@@ -231,7 +231,7 @@ public List> getHandlers(AndroidAnnotationsEnvironment andr
/*
* UIThreadHandler and BackgroundHandler must be after TraceHandler and
- * IgnoredWhenDetached
+ * IgnoreWhen
*/
annotationHandlers.add(new UiThreadHandler(androidAnnotationEnv));
annotationHandlers.add(new BackgroundHandler(androidAnnotationEnv));
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoredWhenDetachedHandler.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoreWhenHandler.java
similarity index 87%
rename from AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoredWhenDetachedHandler.java
rename to AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoreWhenHandler.java
index 708f89e7c4..03586e6e27 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoredWhenDetachedHandler.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoreWhenHandler.java
@@ -23,17 +23,17 @@
import org.androidannotations.AndroidAnnotationsEnvironment;
import org.androidannotations.ElementValidation;
-import org.androidannotations.annotations.IgnoredWhenDetached;
+import org.androidannotations.annotations.IgnoreWhen;
import org.androidannotations.handler.BaseAnnotationHandler;
import org.androidannotations.holder.EFragmentHolder;
import com.helger.jcodemodel.JBlock;
import com.helger.jcodemodel.JMethod;
-public class IgnoredWhenDetachedHandler extends BaseAnnotationHandler {
+public class IgnoreWhenHandler extends BaseAnnotationHandler {
- public IgnoredWhenDetachedHandler(AndroidAnnotationsEnvironment environment) {
- super(IgnoredWhenDetached.class, environment);
+ public IgnoreWhenHandler(AndroidAnnotationsEnvironment environment) {
+ super(IgnoreWhen.class, environment);
}
@Override
From 2ea4a38d93bac9358dee745560a12d1a2010ecd1 Mon Sep 17 00:00:00 2001
From: shiraji
Date: Sat, 19 Dec 2015 09:32:44 +0900
Subject: [PATCH 2/4] Add State option to `@IgnoreWhen`
---
.../annotations/IgnoreWhen.java | 31 +++++++++++++++++--
.../test/efragment/MyListFragment.java | 11 +++++--
2 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoreWhen.java b/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoreWhen.java
index 069e22d4ac..4519ee5169 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoreWhen.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/IgnoreWhen.java
@@ -25,7 +25,9 @@
* When used standalone in an {@link EFragment} or in conjunction with the
* {@link UiThread} or {@link Background} annotations, the annotated method will
* be wrapped in an 'if attached' block such that no code will be executed if
- * the {@link EFragment} is no longer bound to its parent activity.
+ * the {@link EFragment} is no longer bound to its parent activity or
+ * DETACHEDthe {@link EFragment} views are destroyed
+ * VIEW_DESTROYED.
*
*
* Should be used on method that must meet the following criteria
@@ -47,13 +49,13 @@
* ...
*
* @UiThread
- * @IgnoreWhen
+ * @IgnoreWhen(IgnoreWhen.State.DETACHED)
* void killActivity() {
* getActivity().finish();
* }
*
*
- * @IgnoreWhen
+ * @IgnoreWhen(IgnoreWhen.State.VIEW_DESTROYED)
* void updateTitle(String title) {
* getActivity().setTitle(title);
* }
@@ -71,4 +73,27 @@
@Target(ElementType.METHOD)
public @interface IgnoreWhen {
+ /**
+ * The lifecycle state after the method should not be executed.
+ *
+ * @return the state that skips method execution
+ */
+ State value();
+
+ /**
+ * The lifecycle state after the method should not be executed.
+ */
+ enum State {
+
+ /**
+ * Skip execution if the {@link EFragment} is no longer bound to its
+ * parent activity.
+ */
+ DETACHED,
+
+ /**
+ * Skip execution if the {@link EFragment} views are destroyed.
+ */
+ VIEW_DESTROYED
+ }
}
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/efragment/MyListFragment.java b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/efragment/MyListFragment.java
index 3f2c7c46e4..fec7653b1c 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/efragment/MyListFragment.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/main/java/org/androidannotations/test/efragment/MyListFragment.java
@@ -58,7 +58,7 @@ void uiThread() {
}
@UiThread(propagation = UiThread.Propagation.REUSE)
- @IgnoreWhen
+ @IgnoreWhen(IgnoreWhen.State.DETACHED)
void uiThreadIgnored() {
didExecute = true;
}
@@ -74,16 +74,21 @@ void backgroundThread() {
}
@Background
- @IgnoreWhen
+ @IgnoreWhen(IgnoreWhen.State.DETACHED)
void backgroundThreadIgnored() {
didExecute = true;
}
- @IgnoreWhen
+ @IgnoreWhen(IgnoreWhen.State.DETACHED)
void ignored() {
didExecute = true;
}
+ @IgnoreWhen(IgnoreWhen.State.VIEW_DESTROYED)
+ void ignoreWhenViewDestroyed() {
+ didExecute = true;
+ }
+
void notIgnored() {
didExecute = true;
}
From 090fc288569cfb8c59fc47c4d14c9533af317fae Mon Sep 17 00:00:00 2001
From: shiraji
Date: Sat, 19 Dec 2015 09:33:14 +0900
Subject: [PATCH 3/4] Generate code based on IgnoreWhen.State
---
.../holder/EFragmentHolder.java | 17 +++++++++++++++++
.../core/handler/IgnoreWhenHandler.java | 14 +++++++++++++-
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java
index f5637e9b03..5e2dfa0cd2 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java
@@ -15,6 +15,8 @@
*/
package org.androidannotations.holder;
+import static com.helger.jcodemodel.JExpr.FALSE;
+import static com.helger.jcodemodel.JExpr.TRUE;
import static com.helger.jcodemodel.JExpr._new;
import static com.helger.jcodemodel.JExpr._null;
import static com.helger.jcodemodel.JExpr._super;
@@ -23,6 +25,7 @@
import static com.helger.jcodemodel.JMod.PRIVATE;
import static com.helger.jcodemodel.JMod.PUBLIC;
import static com.helger.jcodemodel.JMod.STATIC;
+import static com.helger.jcodemodel.JMod.VOLATILE;
import static org.androidannotations.helper.ModelConstants.generationSuffix;
import javax.lang.model.element.TypeElement;
@@ -46,6 +49,7 @@
public class EFragmentHolder extends EComponentWithViewSupportHolder implements HasInstanceState, HasOptionsMenu, HasOnActivityResult, HasReceiverRegistration, HasPreferences {
private JFieldVar contentView;
+ private JFieldVar viewDestroyedField;
private JBlock setContentViewBlock;
private JVar inflater;
private JVar container;
@@ -208,6 +212,19 @@ private void setContentView() {
contentView = generatedClass.field(PRIVATE, getClasses().VIEW, "contentView" + generationSuffix());
}
+ public JFieldVar getViewDestroyedField() {
+ if (viewDestroyedField == null) {
+ setViewDestroyedField();
+ }
+ return viewDestroyedField;
+ }
+
+ private void setViewDestroyedField() {
+ viewDestroyedField = generatedClass.field(PRIVATE | VOLATILE, getCodeModel().BOOLEAN, "viewDestroyed" + generationSuffix());
+ getSetContentViewBlock().assign(viewDestroyedField, FALSE);
+ getOnDestroyViewAfterSuperBlock().assign(viewDestroyedField, TRUE);
+ }
+
private void setOnCreateView() {
JMethod onCreateView = generatedClass.method(PUBLIC, getClasses().VIEW, "onCreateView");
onCreateView.annotate(Override.class);
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoreWhenHandler.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoreWhenHandler.java
index 03586e6e27..3705298cd6 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoreWhenHandler.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/IgnoreWhenHandler.java
@@ -28,6 +28,7 @@
import org.androidannotations.holder.EFragmentHolder;
import com.helger.jcodemodel.JBlock;
+import com.helger.jcodemodel.JConditional;
import com.helger.jcodemodel.JMethod;
public class IgnoreWhenHandler extends BaseAnnotationHandler {
@@ -53,6 +54,17 @@ public void process(Element element, EFragmentHolder holder) throws Exception {
JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder);
JBlock previousMethodBody = codeModelHelper.removeBody(delegatingMethod);
- delegatingMethod.body()._if(invoke(holder.getGeneratedClass().staticRef("this"), "getActivity").ne(_null()))._then().add(previousMethodBody);
+ IgnoreWhen ignoreWhen = element.getAnnotation(IgnoreWhen.class);
+ JBlock methodBody = delegatingMethod.body();
+ JConditional conditional = null;
+ switch (ignoreWhen.value()) {
+ case VIEW_DESTROYED:
+ conditional = methodBody._if(holder.getViewDestroyedField().not());
+ break;
+ case DETACHED:
+ conditional = methodBody._if(invoke(holder.getGeneratedClass().staticRef("this"), "getActivity").ne(_null()));
+ break;
+ }
+ conditional._then().add(previousMethodBody);
}
}
From f22dfbd24e4e24766e957c01ff00c6dc941ade67 Mon Sep 17 00:00:00 2001
From: shiraji
Date: Sat, 19 Dec 2015 09:43:17 +0900
Subject: [PATCH 4/4] Add test cases for `@IgnoreWhen`
---
.../test/efragment/MyListFragmentTest.java | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/efragment/MyListFragmentTest.java b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/efragment/MyListFragmentTest.java
index f2a4b512ed..b48ea48ffb 100644
--- a/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/efragment/MyListFragmentTest.java
+++ b/AndroidAnnotations/androidannotations-core/androidannotations-test/src/test/java/org/androidannotations/test/efragment/MyListFragmentTest.java
@@ -122,6 +122,46 @@ public void ignoredWhenDetachedWorksForIgnoredMethod() {
assertFalse(myListFragment.didExecute);
}
+ @Test
+ public void notIgnoredAfterOnCreateView() {
+ assertFalse(myListFragment.didExecute);
+ myListFragment.onCreateView(null, null, null);
+ assertFalse(myListFragment.didExecute);
+ myListFragment.ignoreWhenViewDestroyed();
+ assertTrue(myListFragment.didExecute);
+ }
+
+ @Test
+ public void ignoredWhenViewDestroyedForIgnoredMethod() {
+ assertFalse(myListFragment.didExecute);
+ myListFragment.onDestroyView();
+ myListFragment.ignoreWhenViewDestroyed();
+ assertFalse(myListFragment.didExecute);
+ }
+
+ @Test
+ public void notIgnoredAfterFragmentRecreate() {
+ assertFalse(myListFragment.didExecute);
+ myListFragment.onDestroyView();
+ myListFragment.onCreateView(null, null, null);
+ myListFragment.ignoreWhenViewDestroyed();
+ assertTrue(myListFragment.didExecute);
+ }
+
+ @Test
+ public void notIgnoredBeforeDetached() {
+ assertFalse(myListFragment.didExecute);
+ myListFragment.ignored();
+ assertTrue(myListFragment.didExecute);
+ }
+
+ @Test
+ public void notIgnoredBeforeViewDestroyed() {
+ assertFalse(myListFragment.didExecute);
+ myListFragment.ignoreWhenViewDestroyed();
+ assertTrue(myListFragment.didExecute);
+ }
+
@Test
public void layoutNotInjectedWithoutForce() {
View buttonInInjectedLayout = myListFragment.getView().findViewById(R.id.conventionButton);