88import com .helger .jcodemodel .JInvocation ;
99import com .helger .jcodemodel .JMethod ;
1010import com .helger .jcodemodel .JVar ;
11+
1112import org .androidannotations .AndroidAnnotationsEnvironment ;
1213import org .androidannotations .ElementValidation ;
1314import org .androidannotations .annotations .EActivity ;
2223
2324public class NeedsPermissionHandler extends BaseAnnotationHandler <EComponentHolder > {
2425
25- public NeedsPermissionHandler (AndroidAnnotationsEnvironment environment ) {
26- super ("permissions.dispatcher.NeedsPermission" , environment );
27- }
28-
29- @ Override
30- protected void validate (Element element , ElementValidation validation ) {
31- if (validatorHelper .elementHasAnnotation (EActivity .class , element .getEnclosingElement ())
32- || validatorHelper .elementHasAnnotation (EFragment .class , element .getEnclosingElement ())) {
33- validatorHelper .isNotPrivate (element , validation );
34- validatorHelper .isNotFinal (element , validation );
35- validatorHelper .returnTypeIsVoid ((ExecutableElement ) element , validation );
36- }
37- }
38-
39- @ Override
40- public void process (Element element , EComponentHolder holder ) throws Exception {
41- TypeElement annotatedElement = holder .getAnnotatedElement ();
42- String delegateClassName = annotatedElement .getQualifiedName ().toString () + "PermissionsDispatcher" ;
43- AbstractJClass delegateClass = getJClass (delegateClassName );
44-
45- PermissionDispatcherHolder permissionDispatcherHolder = holder .getPluginHolder (new PermissionDispatcherHolder (holder ));
46- permissionDispatcherHolder .setDelegateCall (delegateClass );
47- JFieldVar dispatcherCalledField = permissionDispatcherHolder .getPermissionDispatcherCalledField ();
48-
49- ExecutableElement executableElement = (ExecutableElement ) element ;
50-
51- JMethod overrideMethod = codeModelHelper .overrideAnnotatedMethod (executableElement , holder );
52- JBlock previousMethodBody = codeModelHelper .removeBody (overrideMethod );
53-
54- JBlock overrideMethodBody = overrideMethod .body ();
55- JConditional conditional = overrideMethodBody ._if (dispatcherCalledField .not ());
56-
57- JBlock thenBlock = conditional ._then ();
58- thenBlock .assign (dispatcherCalledField , JExpr .TRUE );
59- String delegateMethodName = element .getSimpleName ().toString () + "WithCheck" ;
60-
61- JInvocation delegateCall = delegateClass .staticInvoke (delegateMethodName )
62- .arg (JExpr ._this ());
63-
64- for (JVar param : overrideMethod .params ()) {
65- delegateCall .arg (param );
66- }
67-
68- if (overrideMethod .hasVarArgs ()) {
69- delegateCall .arg (overrideMethod .varParam ());
70- }
71-
72- codeModelHelper .copyAnnotation (overrideMethod , findAnnotation (element ));
73-
74- thenBlock .add (delegateCall );
75-
76- JBlock elseBlock = conditional ._else ();
77- elseBlock .assign (dispatcherCalledField , JExpr .FALSE );
78- elseBlock .add (previousMethodBody );
79- }
80-
81- private AnnotationMirror findAnnotation (Element element ) {
82- for (AnnotationMirror annotationMirror : element .getAnnotationMirrors ()) {
83- if (annotationMirror .getAnnotationType ().asElement ().getSimpleName ().toString ().equals ("NeedsPermission" )) {
84- return annotationMirror ;
85- }
86- }
87-
88- throw new IllegalStateException ("Handled annotation should be on the method!" );
89- }
90- }
26+ public static final String PERMISSION_WRITE_SETTINGS = "\" android.permission.WRITE_SETTINGS\" " ;
27+ public static final String PERMISSION_SYSTEM_ALERT_WINDOW = "\" android.permission.SYSTEM_ALERT_WINDOW\" " ;
28+
29+ public NeedsPermissionHandler (AndroidAnnotationsEnvironment environment ) {
30+ super ("permissions.dispatcher.NeedsPermission" , environment );
31+ }
32+
33+ @ Override
34+ protected void validate (Element element , ElementValidation validation ) {
35+ if (validatorHelper .elementHasAnnotation (EActivity .class , element .getEnclosingElement ())
36+ || validatorHelper .elementHasAnnotation (EFragment .class , element .getEnclosingElement ())) {
37+ validatorHelper .isNotPrivate (element , validation );
38+ validatorHelper .isNotFinal (element , validation );
39+ validatorHelper .returnTypeIsVoid ((ExecutableElement ) element , validation );
40+ }
41+ }
42+
43+ @ Override
44+ public void process (Element element , EComponentHolder holder ) throws Exception {
45+ TypeElement annotatedElement = holder .getAnnotatedElement ();
46+ String delegateClassName = annotatedElement .getQualifiedName ().toString () + "PermissionsDispatcher" ;
47+ AbstractJClass delegateClass = getJClass (delegateClassName );
48+
49+ PermissionDispatcherHolder permissionDispatcherHolder = holder .getPluginHolder (new PermissionDispatcherHolder (holder ));
50+
51+ if (hasSpecialPermissions (element )) {
52+ permissionDispatcherHolder .setOnActivityResultDelegateCall (delegateClass );
53+ }
54+ if (hasNormalPermissions (element )) {
55+ permissionDispatcherHolder .setOnRequestPermissionsResultDelegateCall (delegateClass );
56+ }
57+
58+ JFieldVar dispatcherCalledField = permissionDispatcherHolder .getPermissionDispatcherCalledField ();
59+
60+ ExecutableElement executableElement = (ExecutableElement ) element ;
61+
62+ JMethod overrideMethod = codeModelHelper .overrideAnnotatedMethod (executableElement , holder );
63+ JBlock previousMethodBody = codeModelHelper .removeBody (overrideMethod );
64+
65+ JBlock overrideMethodBody = overrideMethod .body ();
66+ JConditional conditional = overrideMethodBody ._if (dispatcherCalledField .not ());
67+
68+ JBlock thenBlock = conditional ._then ();
69+ thenBlock .assign (dispatcherCalledField , JExpr .TRUE );
70+ String delegateMethodName = element .getSimpleName ().toString () + "WithCheck" ;
71+
72+ JInvocation delegateCall = delegateClass .staticInvoke (delegateMethodName )
73+ .arg (JExpr ._this ());
74+
75+ overrideMethod .params ().forEach (delegateCall ::arg );
76+
77+ if (overrideMethod .hasVarArgs ()) {
78+ JVar jVar = overrideMethod .varParam ();
79+ if (jVar != null ) {
80+ delegateCall .arg (jVar );
81+ }
82+ }
83+
84+ codeModelHelper .copyAnnotation (overrideMethod , findAnnotation (element ));
85+
86+ thenBlock .add (delegateCall );
87+
88+ JBlock elseBlock = conditional ._else ();
89+ elseBlock .assign (dispatcherCalledField , JExpr .FALSE );
90+ elseBlock .add (previousMethodBody );
91+ }
92+
93+ private AnnotationMirror findAnnotation (Element element ) {
94+ return element .getAnnotationMirrors ().stream ()
95+ .filter (this ::isNeedsPermission )
96+ .findAny ()
97+ .orElseThrow (() -> new IllegalStateException ("Handled annotation should be on the method!" ));
98+ }
99+
100+ private boolean hasSpecialPermissions (Element element ) {
101+ return element .getAnnotationMirrors ().stream ()
102+ .filter (this ::isNeedsPermission )
103+ .anyMatch (this ::hasSpecialPermissions );
104+ }
105+
106+ private boolean hasNormalPermissions (Element element ) {
107+ return element .getAnnotationMirrors ().stream ()
108+ .filter (this ::isNeedsPermission )
109+ .anyMatch (annotationMirror -> !hasSpecialPermissions (annotationMirror ));
110+ }
111+
112+ private boolean hasSpecialPermissions (AnnotationMirror annotationMirror ) {
113+ String name = annotationMirror .toString ();
114+ return name .contains (PERMISSION_SYSTEM_ALERT_WINDOW ) || name .contains (PERMISSION_WRITE_SETTINGS );
115+ }
116+
117+ private boolean isNeedsPermission (AnnotationMirror annotationMirror ) {
118+ return annotationMirror .getAnnotationType ().asElement ().getSimpleName ().toString ().equals ("NeedsPermission" );
119+ }
120+ }
0 commit comments