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

Commit 11e8d24

Browse files
committed
Implement PreferenceHeadersHandler
1 parent bf485aa commit 11e8d24

7 files changed

Lines changed: 146 additions & 6 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ public AnnotationHandlers(ProcessingEnvironment processingEnvironment) {
122122
add(new PreferenceByKeyHandler(processingEnvironment));
123123
add(new PreferenceChangeHandler(processingEnvironment));
124124
add(new PreferenceClickHandler(processingEnvironment));
125+
add(new PreferenceScreenHandler(processingEnvironment));
126+
add(new PreferenceHeadersHandler(processingEnvironment));
125127

126128
add(new IgnoredWhenDetachedHandler(processingEnvironment));
127129
/* After injection methods must be after injections */
@@ -147,8 +149,6 @@ public AnnotationHandlers(ProcessingEnvironment processingEnvironment) {
147149
add(new UiThreadHandler(processingEnvironment));
148150
add(new BackgroundHandler(processingEnvironment));
149151

150-
add(new PreferenceScreenHandler(processingEnvironment));
151-
152152
/*
153153
* SupposeUiThreadHandler and SupposeBackgroundHandler must be after all
154154
* handlers that modifies generated method body
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Copyright (C) 2010-2014 eBusiness Information, Excilys Group
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
5+
* use this file except in compliance with the License. You may obtain a copy of
6+
* the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed To in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations under
14+
* the License.
15+
*/
16+
package org.androidannotations.handler;
17+
18+
import javax.annotation.processing.ProcessingEnvironment;
19+
import javax.lang.model.element.Element;
20+
21+
import org.androidannotations.annotations.PreferenceHeaders;
22+
import org.androidannotations.helper.AnnotationHelper;
23+
import org.androidannotations.helper.IdValidatorHelper;
24+
import org.androidannotations.holder.EActivityHolder;
25+
import org.androidannotations.model.AnnotationElements;
26+
import org.androidannotations.process.IsValid;
27+
import org.androidannotations.rclass.IRClass;
28+
29+
import com.sun.codemodel.JBlock;
30+
import com.sun.codemodel.JExpr;
31+
import com.sun.codemodel.JFieldRef;
32+
import com.sun.codemodel.JVar;
33+
34+
public class PreferenceHeadersHandler extends BaseAnnotationHandler<EActivityHolder> {
35+
36+
private final AnnotationHelper annotationHelper;
37+
38+
public PreferenceHeadersHandler(ProcessingEnvironment processingEnvironment) {
39+
super(PreferenceHeaders.class, processingEnvironment);
40+
annotationHelper = new AnnotationHelper(processingEnvironment);
41+
}
42+
43+
@Override
44+
protected void validate(Element element, AnnotationElements validatedElements, IsValid valid) {
45+
validatorHelper.isPreferenceFragmentClassPresent(element, valid);
46+
validatorHelper.extendsPreferenceActivity(element, valid);
47+
validatorHelper.hasEActivity(element, validatedElements, valid);
48+
validatorHelper.resIdsExist(element, IRClass.Res.XML, IdValidatorHelper.FallbackStrategy.NEED_RES_ID, valid);
49+
}
50+
51+
@Override
52+
public void process(Element element, EActivityHolder holder) throws Exception {
53+
JFieldRef headerId = annotationHelper.extractAnnotationFieldRefs(processHolder, element, getTarget(), rClass.get(IRClass.Res.XML), false).get(0);
54+
55+
JBlock block = holder.getPreferenceSupportHolder().getOnBuildHeadersBlock();
56+
JVar targetParam = holder.getPreferenceSupportHolder().getOnBuildHeadersTargetParam();
57+
block.invoke("loadHeadersFromResource").arg(headerId).arg(targetParam);
58+
block.invoke(JExpr._super(), "onBuildHeaders").arg(targetParam);
59+
}
60+
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,8 +1469,19 @@ public void extendsPreferenceActivityOrPreferenceFragment(Element element, IsVal
14691469
extendsOneOfTypes(element, VALID_PREFERENCE_CLASSES, valid);
14701470
}
14711471

1472+
public void extendsPreferenceActivity(Element element, IsValid valid) {
1473+
extendsType(element, CanonicalNameConstants.PREFERENCE_ACTIVITY, valid);
1474+
}
1475+
14721476
public void enclosingElementExtendsPreferenceActivityOrPreferenceFragment(Element element, IsValid valid) {
14731477
extendsOneOfTypes(element.getEnclosingElement(), VALID_PREFERENCE_CLASSES, valid);
14741478
}
14751479

1480+
public void isPreferenceFragmentClassPresent(Element element, IsValid valid) {
1481+
TypeElement preferenceFragmentElement = annotationHelper.getElementUtils().getTypeElement(CanonicalNameConstants.PREFERENCE_FRAGMENT);
1482+
1483+
if (preferenceFragmentElement == null) {
1484+
annotationHelper.printAnnotationError(element, "The class " + CanonicalNameConstants.PREFERENCE_FRAGMENT + " cannot be found. You have to use at least API 11");
1485+
}
1486+
}
14761487
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
import org.androidannotations.helper.IntentBuilder;
4747
import org.androidannotations.process.ProcessHolder;
4848

49+
import android.preference.PreferenceActivity.Header;
50+
4951
import com.sun.codemodel.JBlock;
5052
import com.sun.codemodel.JClass;
5153
import com.sun.codemodel.JClassAlreadyExistsException;
@@ -737,4 +739,19 @@ public JFieldVar getIntentFilterField(String[] actions, String[] dataSchemes) {
737739
return receiverRegistrationHolder.getIntentFilterField(actions, dataSchemes);
738740
}
739741

742+
@Override
743+
public EActivityWithPreferenceSupportHolder getPreferenceSupportHolder() {
744+
if (preferenceSupportHolder == null) {
745+
preferenceSupportHolder = new EActivityWithPreferenceSupportHolder(this);
746+
}
747+
return (EActivityWithPreferenceSupportHolder) preferenceSupportHolder;
748+
}
749+
750+
public void setOnBuildHeadersBlock() {
751+
JMethod method = generatedClass.method(PUBLIC, codeModel().VOID, "onBuildHeaders");
752+
method.annotate(Override.class);
753+
getPreferenceSupportHolder().onBuildHeadersBlock = method.body();
754+
getPreferenceSupportHolder().onBuildHeadersTargetParam = method.param(classes().LIST.narrow(Header.class), "target");
755+
}
756+
740757
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* Copyright (C) 2010-2014 eBusiness Information, Excilys Group
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
5+
* use this file except in compliance with the License. You may obtain a copy of
6+
* the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed To in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations under
14+
* the License.
15+
*/
16+
package org.androidannotations.holder;
17+
18+
import com.sun.codemodel.JBlock;
19+
import com.sun.codemodel.JVar;
20+
21+
public class EActivityWithPreferenceSupportHolder extends EComponentWithPreferenceSupportHolder {
22+
23+
public EActivityWithPreferenceSupportHolder(EActivityHolder holder) {
24+
super(holder);
25+
}
26+
27+
protected JBlock onBuildHeadersBlock;
28+
protected JVar onBuildHeadersTargetParam;
29+
30+
public JBlock getOnBuildHeadersBlock() {
31+
if (onBuildHeadersBlock == null) {
32+
getDecoratedHolder().setOnBuildHeadersBlock();
33+
}
34+
return onBuildHeadersBlock;
35+
}
36+
37+
public JVar getOnBuildHeadersTargetParam() {
38+
if (onBuildHeadersTargetParam == null) {
39+
getDecoratedHolder().setOnBuildHeadersBlock();
40+
}
41+
return onBuildHeadersTargetParam;
42+
}
43+
44+
@Override
45+
protected EActivityHolder getDecoratedHolder() {
46+
return (EActivityHolder) super.getDecoratedHolder();
47+
}
48+
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,12 @@ public EComponentWithPreferenceSupportHolder(EComponentWithViewSupportHolder hol
2929

3030
public JBlock getAddPreferencesFromResourceBlock() {
3131
if (addPreferencesFromResourceBlock == null) {
32-
holder.setAddPreferencesFromResource();
32+
getDecoratedHolder().setAddPreferencesFromResource();
3333
}
3434
return addPreferencesFromResourceBlock;
3535
}
36+
37+
protected EComponentWithViewSupportHolder getDecoratedHolder() {
38+
return holder;
39+
}
3640
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public abstract class EComponentWithViewSupportHolder extends EComponentHolder {
5959
protected JMethod findSupportFragmentByTag;
6060
private HashMap<String, TextWatcherHolder> textWatcherHolders = new HashMap<String, TextWatcherHolder>();
6161
private HashMap<String, OnSeekBarChangeListenerHolder> onSeekBarChangeListenerHolders = new HashMap<String, OnSeekBarChangeListenerHolder>();
62-
private EComponentWithPreferenceSupportHolder preferenceSupportHolder;
62+
protected EComponentWithPreferenceSupportHolder preferenceSupportHolder;
6363

6464
public EComponentWithViewSupportHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception {
6565
super(processHolder, annotatedElement);
@@ -298,7 +298,7 @@ private TextWatcherHolder createTextWatcherHolder(JFieldRef idRef, TypeMirror vi
298298
JBlock onViewChangedBody = getOnViewChangedBody().block();
299299
JVar viewVariable = onViewChangedBody.decl(FINAL, viewClass, "view", cast(viewClass, findViewById(idRef)));
300300
onViewChangedBody._if(viewVariable.ne(JExpr._null()))._then() //
301-
.invoke(viewVariable, "addTextChangedListener").arg(_new(onTextChangeListenerClass));
301+
.invoke(viewVariable, "addTextChangedListener").arg(_new(onTextChangeListenerClass));
302302

303303
return new TextWatcherHolder(this, viewVariable, onTextChangeListenerClass);
304304
}
@@ -320,7 +320,7 @@ private OnSeekBarChangeListenerHolder createOnSeekBarChangeListenerHolder(JField
320320
JBlock onViewChangedBody = getOnViewChangedBody().block();
321321
JVar viewVariable = onViewChangedBody.decl(FINAL, viewClass, "view", cast(viewClass, findViewById(idRef)));
322322
onViewChangedBody._if(viewVariable.ne(JExpr._null()))._then() //
323-
.invoke(viewVariable, "setOnSeekBarChangeListener").arg(_new(onSeekbarChangeListenerClass));
323+
.invoke(viewVariable, "setOnSeekBarChangeListener").arg(_new(onSeekbarChangeListenerClass));
324324

325325
return new OnSeekBarChangeListenerHolder(this, onSeekbarChangeListenerClass);
326326
}

0 commit comments

Comments
 (0)