Skip to content

Commit ea91f41

Browse files
committed
Fix onStop and onDestroy called twice with RoboGuice
1 parent 1bed539 commit ea91f41

4 files changed

Lines changed: 47 additions & 34 deletions

File tree

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
import javax.lang.model.element.ExecutableElement;
3232

3333
import org.androidannotations.annotations.RoboGuice;
34+
import org.androidannotations.helper.APTCodeModelHelper;
3435
import org.androidannotations.holder.EActivityHolder;
3536
import org.androidannotations.holder.RoboGuiceHolder;
3637
import org.androidannotations.model.AnnotationElements;
3738
import org.androidannotations.process.IsValid;
38-
import org.androidannotations.process.ProcessHolder;
3939

4040
import com.sun.codemodel.JBlock;
4141
import com.sun.codemodel.JClass;
@@ -49,6 +49,8 @@
4949

5050
public class RoboGuiceHandler extends BaseAnnotationHandler<EActivityHolder> {
5151

52+
private APTCodeModelHelper codeModelHelper = new APTCodeModelHelper();
53+
5254
public RoboGuiceHandler(ProcessingEnvironment processingEnvironment) {
5355
super(RoboGuice.class, processingEnvironment);
5456
}
@@ -177,29 +179,35 @@ private void onNewIntentMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVa
177179
}
178180

179181
private void onStopMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) {
180-
JBlock onStopBeforeSuperBlock = holder.getOnStopBeforeSuperBlock();
181-
onStopBeforeSuperBlock.invoke(scope, "enter").arg(_this());
182+
JBlock onStopBlock = new JBlock(false, false);
183+
onStopBlock.invoke(scope, "enter").arg(_this());
182184

183-
JTryBlock tryBlock = onStopBeforeSuperBlock._try();
185+
JTryBlock tryBlock = onStopBlock._try();
184186
fireEvent(eventManager, tryBlock.body(), classes().ON_STOP_EVENT);
185187
JBlock finallyBody = tryBlock._finally();
186188

187189
finallyBody.invoke(scope, "exit").arg(_this());
188190
finallyBody.invoke(_super(), "onStop");
191+
192+
JMethod onStop = holder.getOnStop();
193+
codeModelHelper.replaceSuperCall(onStop, onStopBlock);
189194
}
190195

191196
private void onDestroyMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) {
192-
JBlock onDestroyBeforeSuperBlock = holder.getOnDestroyBeforeSuperBlock();
193-
onDestroyBeforeSuperBlock.invoke(scope, "enter").arg(_this());
197+
JBlock onDestroyBlock = new JBlock(false, false);
198+
onDestroyBlock.invoke(scope, "enter").arg(_this());
194199

195-
JTryBlock tryBlock = onDestroyBeforeSuperBlock._try();
200+
JTryBlock tryBlock = onDestroyBlock._try();
196201
fireEvent(eventManager, tryBlock.body(), classes().ON_DESTROY_EVENT);
197202
JBlock finallyBody = tryBlock._finally();
198203

199204
finallyBody.invoke(eventManager, "clear").arg(_this());
200205
finallyBody.invoke(scope, "exit").arg(_this());
201206
finallyBody.invoke(scope, "dispose").arg(_this());
202207
finallyBody.invoke(_super(), "onDestroy");
208+
209+
JMethod onDestroy = holder.getOnDestroy();
210+
codeModelHelper.replaceSuperCall(onDestroy, onDestroyBlock);
203211
}
204212

205213
private void onConfigurationChangedMethod(RoboGuiceHolder holder, JFieldVar eventManager) {

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java‎

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.androidannotations.helper;
1717

1818

19+
import java.io.StringWriter;
1920
import java.lang.reflect.Field;
2021
import java.util.ArrayList;
2122
import java.util.List;
@@ -31,24 +32,10 @@
3132
import javax.lang.model.type.TypeMirror;
3233
import javax.lang.model.type.WildcardType;
3334

34-
import org.androidannotations.holder.EBeanHolder;
35+
import com.sun.codemodel.*;
3536
import org.androidannotations.holder.EComponentHolder;
3637
import org.androidannotations.holder.GeneratedClassHolder;
3738

38-
import com.sun.codemodel.JBlock;
39-
import com.sun.codemodel.JClass;
40-
import com.sun.codemodel.JCodeModel;
41-
import com.sun.codemodel.JDefinedClass;
42-
import com.sun.codemodel.JExpr;
43-
import com.sun.codemodel.JExpression;
44-
import com.sun.codemodel.JFieldRef;
45-
import com.sun.codemodel.JInvocation;
46-
import com.sun.codemodel.JMethod;
47-
import com.sun.codemodel.JMod;
48-
import com.sun.codemodel.JStatement;
49-
import com.sun.codemodel.JType;
50-
import com.sun.codemodel.JVar;
51-
5239
public class APTCodeModelHelper {
5340

5441
public JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder) {
@@ -192,6 +179,26 @@ public JBlock removeBody(JMethod method) {
192179
return clonedBody;
193180
}
194181

182+
public void replaceSuperCall(JMethod method, JBlock replacement) {
183+
String superCallStart = "super."+method.name()+"(";
184+
185+
JBlock oldBody = removeBody(method);
186+
JBlock newBody = method.body();
187+
188+
for (Object content : oldBody.getContents()) {
189+
StringWriter writer = new StringWriter();
190+
JFormatter formatter = new JFormatter(writer);
191+
JStatement statement = (JStatement) content;
192+
statement.state(formatter);
193+
String statementString = writer.getBuffer().toString();
194+
if (statementString.startsWith(superCallStart)) {
195+
newBody.add(replacement);
196+
} else {
197+
newBody.add(statement);
198+
}
199+
}
200+
}
201+
195202
public String getIdStringFromIdFieldRef(JFieldRef idRef) {
196203
try {
197204
Field nameField = JFieldRef.class.getDeclaredField("name");

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,15 +189,15 @@ protected void setOnStop() {
189189
JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onStop");
190190
method.annotate(Override.class);
191191
JBlock body = method.body();
192-
getRoboGuiceHolder().onStopBeforeSuperBlock = body.block();
193192
body.invoke(_super(), method);
193+
getRoboGuiceHolder().onStop = method;
194194
}
195195

196196
protected void setOnDestroy() {
197197
JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onDestroy");
198198
method.annotate(Override.class);
199199
JBlock body = method.body();
200-
getRoboGuiceHolder().onDestroyBeforeSuperBlock = body.block();
200+
getRoboGuiceHolder().onDestroy = method;
201201
body.invoke(_super(), method);
202202
onDestroyAfterSuperBlock = body.block();
203203
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RoboGuiceHolder.java‎

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616
package org.androidannotations.holder;
1717

18-
import org.androidannotations.process.ProcessHolder;
19-
2018
import com.sun.codemodel.JBlock;
2119
import com.sun.codemodel.JFieldVar;
2220
import com.sun.codemodel.JMethod;
@@ -35,8 +33,8 @@ public class RoboGuiceHolder {
3533
protected JBlock onResumeBeforeSuperBlock;
3634
protected JBlock onPauseAfterSuperBlock;
3735
protected JBlock onNewIntentAfterSuperBlock;
38-
protected JBlock onStopBeforeSuperBlock;
39-
protected JBlock onDestroyBeforeSuperBlock;
36+
protected JMethod onStop;
37+
protected JMethod onDestroy;
4038
protected JVar newConfig;
4139
protected JVar currentConfig;
4240
protected JBlock onConfigurationChangedAfterSuperBlock;
@@ -120,18 +118,18 @@ public JBlock getOnNewIntentAfterSuperBlock() {
120118
return onNewIntentAfterSuperBlock;
121119
}
122120

123-
public JBlock getOnStopBeforeSuperBlock() {
124-
if (onStopBeforeSuperBlock == null) {
121+
public JMethod getOnStop() {
122+
if (onStop == null) {
125123
holder.setOnStop();
126124
}
127-
return onStopBeforeSuperBlock;
125+
return onStop;
128126
}
129127

130-
public JBlock getOnDestroyBeforeSuperBlock() {
131-
if (onDestroyBeforeSuperBlock == null) {
128+
public JMethod getOnDestroy() {
129+
if (onDestroy == null) {
132130
holder.setOnDestroy();
133131
}
134-
return onDestroyBeforeSuperBlock;
132+
return onDestroy;
135133
}
136134

137135
public JVar getNewConfig() {

0 commit comments

Comments
 (0)