|
15 | 15 | */ |
16 | 16 | package org.androidannotations.helper; |
17 | 17 |
|
18 | | -import org.androidannotations.annotations.*; |
19 | | -import org.androidannotations.annotations.rest.*; |
20 | | -import org.androidannotations.annotations.sharedpreferences.*; |
| 18 | +import static java.util.Arrays.asList; |
| 19 | +import static org.androidannotations.helper.AndroidConstants.LOG_DEBUG; |
| 20 | +import static org.androidannotations.helper.AndroidConstants.LOG_ERROR; |
| 21 | +import static org.androidannotations.helper.AndroidConstants.LOG_INFO; |
| 22 | +import static org.androidannotations.helper.AndroidConstants.LOG_VERBOSE; |
| 23 | +import static org.androidannotations.helper.AndroidConstants.LOG_WARN; |
| 24 | +import static org.androidannotations.helper.CanonicalNameConstants.CLIENT_HTTP_REQUEST_FACTORY; |
| 25 | +import static org.androidannotations.helper.CanonicalNameConstants.CLIENT_HTTP_REQUEST_INTERCEPTOR; |
| 26 | +import static org.androidannotations.helper.CanonicalNameConstants.HTTP_MESSAGE_CONVERTER; |
| 27 | +import static org.androidannotations.helper.CanonicalNameConstants.INTERNET_PERMISSION; |
| 28 | +import static org.androidannotations.helper.CanonicalNameConstants.WAKELOCK_PERMISSION; |
| 29 | +import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; |
| 30 | +import static org.androidannotations.helper.ModelConstants.VALID_ANDROID_ANNOTATIONS; |
| 31 | +import static org.androidannotations.helper.ModelConstants.VALID_ENHANCED_COMPONENT_ANNOTATIONS; |
| 32 | +import static org.androidannotations.helper.ModelConstants.VALID_ENHANCED_VIEW_SUPPORT_ANNOTATIONS; |
| 33 | + |
| 34 | +import java.lang.annotation.Annotation; |
| 35 | +import java.util.ArrayList; |
| 36 | +import java.util.Arrays; |
| 37 | +import java.util.Collection; |
| 38 | +import java.util.HashMap; |
| 39 | +import java.util.List; |
| 40 | +import java.util.Map; |
| 41 | +import java.util.Set; |
| 42 | +import java.util.TreeSet; |
| 43 | + |
| 44 | +import javax.lang.model.element.AnnotationMirror; |
| 45 | +import javax.lang.model.element.Element; |
| 46 | +import javax.lang.model.element.ElementKind; |
| 47 | +import javax.lang.model.element.ExecutableElement; |
| 48 | +import javax.lang.model.element.Modifier; |
| 49 | +import javax.lang.model.element.TypeElement; |
| 50 | +import javax.lang.model.element.VariableElement; |
| 51 | +import javax.lang.model.type.ArrayType; |
| 52 | +import javax.lang.model.type.DeclaredType; |
| 53 | +import javax.lang.model.type.ErrorType; |
| 54 | +import javax.lang.model.type.TypeKind; |
| 55 | +import javax.lang.model.type.TypeMirror; |
| 56 | +import javax.lang.model.util.ElementFilter; |
| 57 | +import javax.lang.model.util.Elements; |
| 58 | + |
| 59 | +import org.androidannotations.annotations.EActivity; |
| 60 | +import org.androidannotations.annotations.EBean; |
| 61 | +import org.androidannotations.annotations.EFragment; |
| 62 | +import org.androidannotations.annotations.EIntentService; |
| 63 | +import org.androidannotations.annotations.EService; |
| 64 | +import org.androidannotations.annotations.Receiver; |
| 65 | +import org.androidannotations.annotations.Trace; |
| 66 | +import org.androidannotations.annotations.ViewById; |
| 67 | +import org.androidannotations.annotations.WakeLock; |
| 68 | +import org.androidannotations.annotations.WakeLock.Level; |
| 69 | +import org.androidannotations.annotations.rest.Delete; |
| 70 | +import org.androidannotations.annotations.rest.Get; |
| 71 | +import org.androidannotations.annotations.rest.Head; |
| 72 | +import org.androidannotations.annotations.rest.Options; |
| 73 | +import org.androidannotations.annotations.rest.Post; |
| 74 | +import org.androidannotations.annotations.rest.Put; |
| 75 | +import org.androidannotations.annotations.rest.Rest; |
| 76 | +import org.androidannotations.annotations.sharedpreferences.DefaultBoolean; |
| 77 | +import org.androidannotations.annotations.sharedpreferences.DefaultFloat; |
| 78 | +import org.androidannotations.annotations.sharedpreferences.DefaultInt; |
| 79 | +import org.androidannotations.annotations.sharedpreferences.DefaultLong; |
| 80 | +import org.androidannotations.annotations.sharedpreferences.DefaultString; |
| 81 | +import org.androidannotations.annotations.sharedpreferences.SharedPref; |
21 | 82 | import org.androidannotations.api.rest.RestClientErrorHandling; |
22 | 83 | import org.androidannotations.api.rest.RestClientHeaders; |
23 | 84 | import org.androidannotations.api.rest.RestClientRootUrl; |
|
27 | 88 | import org.androidannotations.model.AnnotationElements; |
28 | 89 | import org.androidannotations.process.IsValid; |
29 | 90 |
|
30 | | -import javax.lang.model.element.*; |
31 | | -import javax.lang.model.type.*; |
32 | | -import javax.lang.model.util.ElementFilter; |
33 | | -import javax.lang.model.util.Elements; |
34 | | -import java.lang.annotation.Annotation; |
35 | | -import java.util.*; |
36 | | - |
37 | | -import static java.util.Arrays.asList; |
38 | | -import static org.androidannotations.helper.AndroidConstants.*; |
39 | | -import static org.androidannotations.helper.CanonicalNameConstants.*; |
40 | | -import static org.androidannotations.helper.ModelConstants.*; |
41 | | - |
42 | 91 | public class ValidatorHelper { |
43 | 92 |
|
44 | 93 | private static final List<String> VALID_REST_INTERFACES = asList(RestClientHeaders.class.getName(), RestClientErrorHandling.class.getName(), RestClientRootUrl.class.getName(), RestClientSupport.class.getName()); |
@@ -383,6 +432,21 @@ public void returnTypeIsVoid(ExecutableElement executableElement, IsValid valid) |
383 | 432 | } |
384 | 433 | } |
385 | 434 |
|
| 435 | + public void doesNotHaveTraceAnnotationAndReturnValue(ExecutableElement executableElement, AnnotationElements validatedElements, IsValid valid) { |
| 436 | + TypeMirror returnType = executableElement.getReturnType(); |
| 437 | + |
| 438 | + if (elementHasAnnotation(Trace.class, executableElement, validatedElements) && returnType.getKind() != TypeKind.VOID) { |
| 439 | + annotationHelper.printAnnotationError(executableElement, "@WakeLock annotated methods with a return value are not supported by @Trace"); |
| 440 | + } |
| 441 | + } |
| 442 | + |
| 443 | + public void doesNotUseFlagsWithPartialWakeLock(Element element, AnnotationElements validatedElements, IsValid valid) { |
| 444 | + WakeLock annotation = element.getAnnotation(WakeLock.class); |
| 445 | + if (annotation.level().equals(Level.PARTIAL_WAKE_LOCK) && annotation.flags().length > 0) { |
| 446 | + annotationHelper.printAnnotationWarning(element, "Flags have no effect when combined with a PARTIAL_WAKE_LOCK"); |
| 447 | + } |
| 448 | + } |
| 449 | + |
386 | 450 | public void returnTypeIsNotVoid(ExecutableElement executableElement, IsValid valid) { |
387 | 451 | TypeMirror returnType = executableElement.getReturnType(); |
388 | 452 |
|
@@ -478,11 +542,9 @@ public void extendsListOfView(Element element, IsValid valid) { |
478 | 542 |
|
479 | 543 | TypeMirror viewType = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.VIEW).asType(); |
480 | 544 |
|
481 | | - if (!elementType.toString().equals(CanonicalNameConstants.LIST) |
482 | | - && elementTypeArguments.size() == 1 |
483 | | - && !annotationHelper.isSubtype(elementTypeArguments.get(0), viewType)) { |
| 545 | + if (!elementType.toString().equals(CanonicalNameConstants.LIST) && elementTypeArguments.size() == 1 && !annotationHelper.isSubtype(elementTypeArguments.get(0), viewType)) { |
484 | 546 | valid.invalidate(); |
485 | | - annotationHelper.printAnnotationError(element, "%s can only be used on a "+CanonicalNameConstants.LIST+ " of elements extending " + CanonicalNameConstants.VIEW); |
| 547 | + annotationHelper.printAnnotationError(element, "%s can only be used on a " + CanonicalNameConstants.LIST + " of elements extending " + CanonicalNameConstants.VIEW); |
486 | 548 | } |
487 | 549 | } |
488 | 550 |
|
@@ -1112,16 +1174,22 @@ public void isDebuggable(Element element, AndroidManifest androidManifest, IsVal |
1112 | 1174 | } |
1113 | 1175 |
|
1114 | 1176 | public void hasInternetPermission(Element element, AndroidManifest androidManifest, IsValid valid) { |
1115 | | - if (androidManifest.isLibraryProject()) { |
1116 | | - return; |
1117 | | - } |
| 1177 | + hasPermission(element, androidManifest, valid, INTERNET_PERMISSION); |
| 1178 | + } |
1118 | 1179 |
|
1119 | | - String internetPermissionQualifiedName = INTERNET_PERMISSION; |
| 1180 | + public void hasWakeLockPermission(Element element, AndroidManifest androidManifest, IsValid valid) { |
| 1181 | + hasPermission(element, androidManifest, valid, WAKELOCK_PERMISSION); |
| 1182 | + } |
1120 | 1183 |
|
| 1184 | + public void hasPermission(Element element, AndroidManifest androidManifest, IsValid valid, String permissionQualifiedName) { |
1121 | 1185 | List<String> permissionQualifiedNames = androidManifest.getPermissionQualifiedNames(); |
1122 | | - if (!permissionQualifiedNames.contains(internetPermissionQualifiedName)) { |
1123 | | - valid.invalidate(); |
1124 | | - annotationHelper.printAnnotationError(element, "Your application must require the INTERNET permission."); |
| 1186 | + if (!permissionQualifiedNames.contains(permissionQualifiedName)) { |
| 1187 | + if (androidManifest.isLibraryProject()) { |
| 1188 | + annotationHelper.printAnnotationWarning(element, "Your library should require the " + permissionQualifiedName + " permission."); |
| 1189 | + } else { |
| 1190 | + valid.invalidate(); |
| 1191 | + annotationHelper.printAnnotationError(element, "Your application must require the " + permissionQualifiedName + " permission."); |
| 1192 | + } |
1125 | 1193 | } |
1126 | 1194 | } |
1127 | 1195 |
|
|
0 commit comments