Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.

Commit 75dc71e

Browse files
committed
Adding an IntentBuilder for EService. #266
1 parent 85227d4 commit 75dc71e

4 files changed

Lines changed: 96 additions & 66 deletions

File tree

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/APTCodeModelHelper.java‎

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
*/
1616
package com.googlecode.androidannotations.helper;
1717

18+
import static com.sun.codemodel.JExpr._new;
19+
import static com.sun.codemodel.JExpr._this;
1820
import static com.sun.codemodel.JExpr.cast;
21+
import static com.sun.codemodel.JMod.FINAL;
22+
import static com.sun.codemodel.JMod.PRIVATE;
1923
import static com.sun.codemodel.JMod.PUBLIC;
2024
import static com.sun.codemodel.JMod.STATIC;
2125
import static javax.lang.model.element.ElementKind.CONSTRUCTOR;
@@ -36,11 +40,14 @@
3640
import com.sun.codemodel.JBlock;
3741
import com.sun.codemodel.JCatchBlock;
3842
import com.sun.codemodel.JClass;
43+
import com.sun.codemodel.JClassAlreadyExistsException;
3944
import com.sun.codemodel.JCodeModel;
45+
import com.sun.codemodel.JConditional;
4046
import com.sun.codemodel.JDefinedClass;
4147
import com.sun.codemodel.JExpr;
4248
import com.sun.codemodel.JExpression;
4349
import com.sun.codemodel.JFieldRef;
50+
import com.sun.codemodel.JFieldVar;
4451
import com.sun.codemodel.JInvocation;
4552
import com.sun.codemodel.JMethod;
4653
import com.sun.codemodel.JMod;
@@ -288,4 +295,76 @@ public JVar findParameterByName(JMethod method, String name) {
288295
return null;
289296
}
290297

298+
public void addActivityIntentBuilder(JCodeModel codeModel, EBeanHolder holder) throws Exception {
299+
addIntentBuilder(codeModel, holder, true);
300+
}
301+
302+
public void addServiceIntentBuilder(JCodeModel codeModel, EBeanHolder holder) throws Exception {
303+
addIntentBuilder(codeModel, holder, false);
304+
}
305+
306+
private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, boolean isActivity) throws JClassAlreadyExistsException {
307+
JClass contextClass = holder.classes().CONTEXT;
308+
JClass intentClass = holder.classes().INTENT;
309+
310+
{
311+
holder.intentBuilderClass = holder.eBean._class(PUBLIC | STATIC, "IntentBuilder_");
312+
313+
JFieldVar contextField = holder.intentBuilderClass.field(PRIVATE, contextClass, "context_");
314+
315+
holder.intentField = holder.intentBuilderClass.field(PRIVATE | FINAL, intentClass, "intent_");
316+
{
317+
// Constructor
318+
JMethod constructor = holder.intentBuilderClass.constructor(JMod.PUBLIC);
319+
JVar constructorContextParam = constructor.param(contextClass, "context");
320+
JBlock constructorBody = constructor.body();
321+
constructorBody.assign(contextField, constructorContextParam);
322+
constructorBody.assign(holder.intentField, _new(intentClass).arg(constructorContextParam).arg(holder.eBean.dotclass()));
323+
}
324+
325+
{
326+
// get()
327+
JMethod method = holder.intentBuilderClass.method(PUBLIC, intentClass, "get");
328+
method.body()._return(holder.intentField);
329+
}
330+
331+
{
332+
// flags()
333+
JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.intentBuilderClass, "flags");
334+
JVar flagsParam = method.param(codeModel.INT, "flags");
335+
JBlock body = method.body();
336+
body.invoke(holder.intentField, "setFlags").arg(flagsParam);
337+
body._return(_this());
338+
}
339+
340+
{
341+
// start()
342+
JMethod method = holder.intentBuilderClass.method(PUBLIC, codeModel.VOID, "start");
343+
String startComponentName = isActivity ? "startActivity" : "startService";
344+
method.body().invoke(contextField, startComponentName).arg(holder.intentField);
345+
}
346+
347+
if (isActivity) {
348+
// startForResult()
349+
JMethod method = holder.intentBuilderClass.method(PUBLIC, codeModel.VOID, "startForResult");
350+
JVar requestCode = method.param(codeModel.INT, "requestCode");
351+
352+
JBlock body = method.body();
353+
JClass activityClass = holder.classes().ACTIVITY;
354+
JConditional condition = body._if(contextField._instanceof(activityClass));
355+
condition._then() //
356+
.invoke(JExpr.cast(activityClass, contextField), "startActivityForResult").arg(holder.intentField).arg(requestCode);
357+
condition._else() //
358+
.invoke(contextField, "startActivity").arg(holder.intentField);
359+
}
360+
361+
{
362+
// intent()
363+
JMethod method = holder.eBean.method(STATIC | PUBLIC, holder.intentBuilderClass, "intent");
364+
JVar contextParam = method.param(contextClass, "context");
365+
method.body()._return(_new(holder.intentBuilderClass).arg(contextParam));
366+
}
367+
}
368+
}
369+
291370
}

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EActivityProcessor.java‎

Lines changed: 4 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,10 @@
1616
package com.googlecode.androidannotations.processing;
1717

1818
import static com.googlecode.androidannotations.helper.GreenDroidConstants.GREENDROID_ACTIVITIES_LIST_CLASS;
19-
import static com.sun.codemodel.JExpr._new;
2019
import static com.sun.codemodel.JExpr._super;
2120
import static com.sun.codemodel.JExpr._this;
22-
import static com.sun.codemodel.JMod.FINAL;
2321
import static com.sun.codemodel.JMod.PRIVATE;
2422
import static com.sun.codemodel.JMod.PUBLIC;
25-
import static com.sun.codemodel.JMod.STATIC;
2623

2724
import java.lang.annotation.Annotation;
2825
import java.util.ArrayList;
@@ -40,6 +37,7 @@
4037

4138
import com.googlecode.androidannotations.annotations.EActivity;
4239
import com.googlecode.androidannotations.api.SdkVersionHelper;
40+
import com.googlecode.androidannotations.helper.APTCodeModelHelper;
4341
import com.googlecode.androidannotations.helper.AnnotationHelper;
4442
import com.googlecode.androidannotations.helper.CanonicalNameConstants;
4543
import com.googlecode.androidannotations.helper.ModelConstants;
@@ -49,10 +47,8 @@
4947
import com.sun.codemodel.JBlock;
5048
import com.sun.codemodel.JClass;
5149
import com.sun.codemodel.JCodeModel;
52-
import com.sun.codemodel.JConditional;
5350
import com.sun.codemodel.JExpr;
5451
import com.sun.codemodel.JFieldRef;
55-
import com.sun.codemodel.JFieldVar;
5652
import com.sun.codemodel.JInvocation;
5753
import com.sun.codemodel.JMethod;
5854
import com.sun.codemodel.JMod;
@@ -67,10 +63,12 @@ public class EActivityProcessor implements ElementProcessor {
6763
private final AnnotationHelper annotationHelper;
6864

6965
private final ProcessingEnvironment processingEnv;
66+
private final APTCodeModelHelper aptCodeModelHelper;
7067

7168
public EActivityProcessor(ProcessingEnvironment processingEnv, IRClass rClass) {
7269
this.processingEnv = processingEnv;
7370
annotationHelper = new AnnotationHelper(processingEnv);
71+
aptCodeModelHelper = new APTCodeModelHelper();
7472
this.rClass = rClass;
7573

7674
greendroidActivityElements = new ArrayList<TypeElement>();
@@ -210,67 +208,7 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder activiti
210208
}
211209

212210
if (!isAbstract) {
213-
JClass contextClass = holder.classes().CONTEXT;
214-
JClass intentClass = holder.classes().INTENT;
215-
216-
{
217-
holder.intentBuilderClass = holder.eBean._class(PUBLIC | STATIC, "IntentBuilder_");
218-
219-
JFieldVar contextField = holder.intentBuilderClass.field(PRIVATE, contextClass, "context_");
220-
221-
holder.intentField = holder.intentBuilderClass.field(PRIVATE | FINAL, intentClass, "intent_");
222-
{
223-
// Constructor
224-
JMethod constructor = holder.intentBuilderClass.constructor(JMod.PUBLIC);
225-
JVar constructorContextParam = constructor.param(contextClass, "context");
226-
JBlock constructorBody = constructor.body();
227-
constructorBody.assign(contextField, constructorContextParam);
228-
constructorBody.assign(holder.intentField, _new(intentClass).arg(constructorContextParam).arg(holder.eBean.dotclass()));
229-
}
230-
231-
{
232-
// get()
233-
JMethod method = holder.intentBuilderClass.method(PUBLIC, intentClass, "get");
234-
method.body()._return(holder.intentField);
235-
}
236-
237-
{
238-
// flags()
239-
JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.intentBuilderClass, "flags");
240-
JVar flagsParam = method.param(codeModel.INT, "flags");
241-
JBlock body = method.body();
242-
body.invoke(holder.intentField, "setFlags").arg(flagsParam);
243-
body._return(_this());
244-
}
245-
246-
{
247-
// start()
248-
JMethod method = holder.intentBuilderClass.method(PUBLIC, codeModel.VOID, "start");
249-
method.body().invoke(contextField, "startActivity").arg(holder.intentField);
250-
}
251-
252-
{
253-
// startForResult()
254-
JMethod method = holder.intentBuilderClass.method(PUBLIC, codeModel.VOID, "startForResult");
255-
JVar requestCode = method.param(codeModel.INT, "requestCode");
256-
257-
JBlock body = method.body();
258-
JClass activityClass = holder.classes().ACTIVITY;
259-
JConditional condition = body._if(contextField._instanceof(activityClass));
260-
condition._then() //
261-
.invoke(JExpr.cast(activityClass, contextField), "startActivityForResult").arg(holder.intentField).arg(requestCode);
262-
condition._else() //
263-
.invoke(contextField, "startActivity").arg(holder.intentField);
264-
}
265-
266-
{
267-
// intent()
268-
JMethod method = holder.eBean.method(STATIC | PUBLIC, holder.intentBuilderClass, "intent");
269-
JVar contextParam = method.param(contextClass, "context");
270-
method.body()._return(_new(holder.intentBuilderClass).arg(contextParam));
271-
}
272-
}
273-
211+
aptCodeModelHelper.addActivityIntentBuilder(codeModel, holder);
274212
}
275213

276214
}

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EServiceProcessor.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import javax.lang.model.element.TypeElement;
2727

2828
import com.googlecode.androidannotations.annotations.EService;
29+
import com.googlecode.androidannotations.helper.APTCodeModelHelper;
2930
import com.googlecode.androidannotations.helper.ModelConstants;
3031
import com.sun.codemodel.ClassType;
3132
import com.sun.codemodel.JBlock;
@@ -36,6 +37,12 @@
3637

3738
public class EServiceProcessor implements ElementProcessor {
3839

40+
private final APTCodeModelHelper aptCodeModelHelper;
41+
42+
public EServiceProcessor() {
43+
aptCodeModelHelper = new APTCodeModelHelper();
44+
}
45+
3946
@Override
4047
public Class<? extends Annotation> getTarget() {
4148
return EService.class;
@@ -80,6 +87,8 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder activiti
8087
holder.initActivityRef = null;
8188
}
8289

90+
aptCodeModelHelper.addServiceIntentBuilder(codeModel, holder);
91+
8392
}
8493

8594
}

‎AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/ExtraProcessor.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder activiti
115115

116116
containsKeyCatch.body().add(logError);
117117

118+
/*
119+
* holder.intentBuilderClass may be null if the annotated component is
120+
* an abstract activity
121+
*/
118122
if (holder.intentBuilderClass != null) {
119123
{
120124
// flags()

0 commit comments

Comments
 (0)