Skip to content

Commit 381fb5b

Browse files
committed
1 parent 9193f63 commit 381fb5b

4 files changed

Lines changed: 158 additions & 0 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.androidannotations.annotations;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
/**
9+
*
10+
* @author Rostislav Chekan
11+
*/
12+
@Retention(RetentionPolicy.CLASS)
13+
@Target(ElementType.METHOD)
14+
public @interface FocusChange {
15+
int[] value() default ResId.DEFAULT_VALUE;
16+
17+
String[] resName() default "";
18+
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.androidannotations.annotations.EView;
5151
import org.androidannotations.annotations.EViewGroup;
5252
import org.androidannotations.annotations.Extra;
53+
import org.androidannotations.annotations.FocusChange;
5354
import org.androidannotations.annotations.FragmentArg;
5455
import org.androidannotations.annotations.FragmentById;
5556
import org.androidannotations.annotations.FragmentByTag;
@@ -135,6 +136,7 @@
135136
import org.androidannotations.processing.EViewGroupProcessor;
136137
import org.androidannotations.processing.EViewProcessor;
137138
import org.androidannotations.processing.ExtraProcessor;
139+
import org.androidannotations.processing.FocusChangeProcessor;
138140
import org.androidannotations.processing.FragmentArgProcessor;
139141
import org.androidannotations.processing.FragmentByIdProcessor;
140142
import org.androidannotations.processing.FragmentByTagProcessor;
@@ -199,6 +201,7 @@
199201
import org.androidannotations.validation.EViewGroupValidator;
200202
import org.androidannotations.validation.EViewValidator;
201203
import org.androidannotations.validation.ExtraValidator;
204+
import org.androidannotations.validation.FocusChangeValidator;
202205
import org.androidannotations.validation.FragmentArgValidator;
203206
import org.androidannotations.validation.FragmentByIdValidator;
204207
import org.androidannotations.validation.FragmentByTagValidator;
@@ -254,6 +257,7 @@
254257
ItemClick.class, //
255258
ItemLongClick.class, //
256259
Touch.class, //
260+
FocusChange.class, //
257261
ItemSelect.class, //
258262
UiThread.class, //
259263
Transactional.class, //
@@ -449,6 +453,7 @@ private ModelValidator buildModelValidator(IRClass rClass, AndroidSystemServices
449453
modelValidator.register(new ClickValidator(processingEnv, rClass));
450454
modelValidator.register(new LongClickValidator(processingEnv, rClass));
451455
modelValidator.register(new TouchValidator(processingEnv, rClass));
456+
modelValidator.register(new FocusChangeValidator(processingEnv, rClass));
452457
modelValidator.register(new ItemClickValidator(processingEnv, rClass));
453458
modelValidator.register(new ItemSelectedValidator(processingEnv, rClass));
454459
modelValidator.register(new ItemLongClickValidator(processingEnv, rClass));
@@ -539,6 +544,7 @@ private ModelProcessor buildModelProcessor(IRClass rClass, AndroidSystemServices
539544
modelProcessor.register(new ClickProcessor(processingEnv, rClass));
540545
modelProcessor.register(new LongClickProcessor(processingEnv, rClass));
541546
modelProcessor.register(new TouchProcessor(processingEnv, rClass));
547+
modelProcessor.register(new FocusChangeProcessor(processingEnv, rClass));
542548
modelProcessor.register(new ItemClickProcessor(processingEnv, rClass));
543549
modelProcessor.register(new ItemSelectedProcessor(processingEnv, rClass));
544550
modelProcessor.register(new ItemLongClickProcessor(processingEnv, rClass));
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package org.androidannotations.processing;
2+
3+
import java.lang.annotation.Annotation;
4+
import java.util.List;
5+
6+
import javax.annotation.processing.ProcessingEnvironment;
7+
import javax.lang.model.element.VariableElement;
8+
import javax.lang.model.type.TypeMirror;
9+
10+
import org.androidannotations.annotations.FocusChange;
11+
import org.androidannotations.rclass.IRClass;
12+
13+
import com.sun.codemodel.JBlock;
14+
import com.sun.codemodel.JClass;
15+
import com.sun.codemodel.JDefinedClass;
16+
import com.sun.codemodel.JInvocation;
17+
import com.sun.codemodel.JMethod;
18+
import com.sun.codemodel.JMod;
19+
import com.sun.codemodel.JVar;
20+
21+
public class FocusChangeProcessor extends AbstractListenerProcessor {
22+
23+
public FocusChangeProcessor(ProcessingEnvironment processingEnv, IRClass rClass) {
24+
super(processingEnv, rClass);
25+
}
26+
27+
@Override
28+
public Class<? extends Annotation> getTarget() {
29+
return FocusChange.class;
30+
}
31+
32+
@Override
33+
protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror returnType) {
34+
listenerMethodBody.add(call);
35+
}
36+
37+
@Override
38+
protected void processParameters(JMethod listenerMethod, JInvocation call, List<? extends VariableElement> parameters) {
39+
JVar viewParam = listenerMethod.param(classes.VIEW, "view");
40+
JVar hasFocusParam = listenerMethod.param(codeModel.BOOLEAN, "hasFocus");
41+
boolean hasFocusParamExists = parameters.size() == 2;
42+
43+
call.arg(viewParam);
44+
if (hasFocusParamExists) {
45+
call.arg(hasFocusParam);
46+
}
47+
}
48+
49+
@Override
50+
protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) {
51+
return listenerAnonymousClass.method(JMod.PUBLIC, codeModel.VOID, "onFocusChange");
52+
}
53+
54+
@Override
55+
protected String getSetterName() {
56+
return "setOnFocusChangeListener";
57+
}
58+
59+
@Override
60+
protected JClass getListenerClass() {
61+
return classes.VIEW_ON_FOCUS_CHANGE_LISTENER;
62+
}
63+
64+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* Copyright (C) 2010-2012 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.validation;
17+
18+
import java.lang.annotation.Annotation;
19+
20+
import javax.annotation.processing.ProcessingEnvironment;
21+
import javax.lang.model.element.Element;
22+
import javax.lang.model.element.ExecutableElement;
23+
24+
import org.androidannotations.annotations.FocusChange;
25+
import org.androidannotations.helper.IdAnnotationHelper;
26+
import org.androidannotations.helper.IdValidatorHelper;
27+
import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy;
28+
import org.androidannotations.model.AnnotationElements;
29+
import org.androidannotations.rclass.IRClass;
30+
import org.androidannotations.rclass.IRClass.Res;
31+
32+
public class FocusChangeValidator implements ElementValidator {
33+
34+
private IdValidatorHelper validatorHelper;
35+
36+
public FocusChangeValidator(ProcessingEnvironment processingEnv, IRClass rClass) {
37+
IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass);
38+
validatorHelper = new IdValidatorHelper(annotationHelper);
39+
}
40+
41+
@Override
42+
public Class<? extends Annotation> getTarget() {
43+
return FocusChange.class;
44+
}
45+
46+
@Override
47+
public boolean validate(Element element, AnnotationElements validatedElements) {
48+
49+
IsValid valid = new IsValid();
50+
51+
validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid);
52+
53+
validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid);
54+
55+
validatorHelper.isNotPrivate(element, valid);
56+
57+
validatorHelper.doesntThrowException(element, valid);
58+
59+
validatorHelper.uniqueId(element, validatedElements, valid);
60+
61+
ExecutableElement executableElement = (ExecutableElement) element;
62+
validatorHelper.returnTypeIsVoid(executableElement, valid);
63+
64+
// validatorHelper.zeroOrOneViewParameters(executableElement, valid);
65+
int i = 0;
66+
67+
return valid.isValid();
68+
}
69+
70+
}

0 commit comments

Comments
 (0)