Skip to content

Commit 2de0d79

Browse files
Merge pull request #6 from team-supercharge/5_overrideDelegating
Override methods to delegate
2 parents 7c2993c + 7181e4f commit 2de0d79

File tree

7 files changed

+160
-21
lines changed

7 files changed

+160
-21
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ dependencies {
3333

3434
> #Please notice that PermissionsDispatcher is above AndroidAnnotations.
3535
36+
Finally, you should not call the PermissionDispatcher delegate class static methods anymore, this
37+
plugin will generate those calls for you. Just call the method which was annotated with `@NeedsPermission`. Overriding `onRequestPermissionsResult` should also be removed completely.
38+
See the example project for code.
39+
3640
## Changelog
3741

3842
### 1.0.0 (2017-07-02)

androidannotationspermissionsdispatcherplugin/src/main/java/com/github/aleksandermielczarek/androidannotationspermissionsdispatcherplugin/AndroidAnnotationsPermissionsDispatcherPlugin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public String getName() {
2121
public List<AnnotationHandler<?>> getHandlers(AndroidAnnotationsEnvironment androidAnnotationEnv) {
2222
List<AnnotationHandler<?>> handlers = new ArrayList<>();
2323
handlers.add(new RuntimePermissionsHandler(androidAnnotationEnv));
24+
handlers.add(new NeedsPermissionHandler(androidAnnotationEnv));
2425
return handlers;
2526
}
2627
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.github.aleksandermielczarek.androidannotationspermissionsdispatcherplugin;
2+
3+
import com.helger.jcodemodel.AbstractJClass;
4+
import com.helger.jcodemodel.JBlock;
5+
import com.helger.jcodemodel.JConditional;
6+
import com.helger.jcodemodel.JExpr;
7+
import com.helger.jcodemodel.JFieldVar;
8+
import com.helger.jcodemodel.JInvocation;
9+
import com.helger.jcodemodel.JMethod;
10+
import com.helger.jcodemodel.JVar;
11+
import org.androidannotations.AndroidAnnotationsEnvironment;
12+
import org.androidannotations.ElementValidation;
13+
import org.androidannotations.handler.BaseAnnotationHandler;
14+
import org.androidannotations.holder.EComponentHolder;
15+
16+
import javax.lang.model.element.Element;
17+
import javax.lang.model.element.ExecutableElement;
18+
import javax.lang.model.element.TypeElement;
19+
20+
public class NeedsPermissionHandler extends BaseAnnotationHandler<EComponentHolder> {
21+
22+
public NeedsPermissionHandler(AndroidAnnotationsEnvironment environment) {
23+
super("permissions.dispatcher.NeedsPermission", environment);
24+
}
25+
26+
@Override
27+
protected void validate(Element element, ElementValidation validation) {
28+
validatorHelper.enclosingElementHasEActivityOrEFragment(element, validation);
29+
validatorHelper.isNotPrivate(element, validation);
30+
validatorHelper.isNotFinal(element, validation);
31+
validatorHelper.returnTypeIsVoid((ExecutableElement) element, validation);
32+
}
33+
34+
@Override
35+
public void process(Element element, EComponentHolder holder) throws Exception {
36+
TypeElement annotatedElement = holder.getAnnotatedElement();
37+
String delegateClassName = annotatedElement.getQualifiedName().toString() + "PermissionsDispatcher";
38+
AbstractJClass delegateClass = getJClass(delegateClassName);
39+
40+
PermissionDispatcherHolder permissionDispatcherHolder = holder.getPluginHolder(new PermissionDispatcherHolder(holder));
41+
permissionDispatcherHolder.setDelegateCall(delegateClass);
42+
JFieldVar dispatcherCalledField = permissionDispatcherHolder.getPermissionDispatcherCalledField();
43+
44+
ExecutableElement executableElement = (ExecutableElement) element;
45+
46+
JMethod overrideMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder);
47+
JBlock previousMethodBody = codeModelHelper.removeBody(overrideMethod);
48+
49+
JBlock overrideMethodBody = overrideMethod.body();
50+
JConditional conditional = overrideMethodBody._if(dispatcherCalledField.not());
51+
52+
JBlock thenBlock = conditional._then();
53+
thenBlock.assign(dispatcherCalledField, JExpr.TRUE);
54+
String delegateMethodName = element.getSimpleName().toString() + "WithCheck";
55+
56+
JInvocation delegateCall = delegateClass.staticInvoke(delegateMethodName)
57+
.arg(JExpr._this());
58+
59+
for (JVar param : overrideMethod.params()) {
60+
delegateCall.arg(param);
61+
}
62+
63+
if (overrideMethod.hasVarArgs()) {
64+
delegateCall.arg(overrideMethod.varParam());
65+
}
66+
67+
thenBlock.add(delegateCall);
68+
69+
JBlock elseBlock = conditional._else();
70+
elseBlock.assign(dispatcherCalledField, JExpr.FALSE);
71+
elseBlock.add(previousMethodBody);
72+
}
73+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.github.aleksandermielczarek.androidannotationspermissionsdispatcherplugin;
2+
3+
import com.helger.jcodemodel.AbstractJClass;
4+
import com.helger.jcodemodel.JBlock;
5+
import com.helger.jcodemodel.JExpr;
6+
import com.helger.jcodemodel.JFieldVar;
7+
import com.helger.jcodemodel.JMethod;
8+
import com.helger.jcodemodel.JMod;
9+
import com.helger.jcodemodel.JVar;
10+
import org.androidannotations.holder.EComponentHolder;
11+
import org.androidannotations.plugin.PluginClassHolder;
12+
13+
public class PermissionDispatcherHolder extends PluginClassHolder<EComponentHolder> {
14+
15+
private JFieldVar permissionDispatcherCalledField;
16+
private JMethod onRequestPermissionsResultMethod;
17+
private JBlock onRequestPermissionsResultMethodDelegateBlock;
18+
private JVar requestCodeParam;
19+
private JVar grantResultsParam;
20+
21+
public PermissionDispatcherHolder(EComponentHolder holder) {
22+
super(holder);
23+
}
24+
25+
public JFieldVar getPermissionDispatcherCalledField() {
26+
if (permissionDispatcherCalledField == null) {
27+
setPermissionDispatcherCalledField();
28+
}
29+
30+
return permissionDispatcherCalledField;
31+
}
32+
33+
private void setPermissionDispatcherCalledField() {
34+
permissionDispatcherCalledField = holder().getGeneratedClass().field(JMod.PRIVATE, getCodeModel().BOOLEAN, "permissionDispatcherCalled_");
35+
}
36+
37+
public JMethod getOnRequestPermissionsResult() {
38+
if (onRequestPermissionsResultMethod == null) {
39+
setOnRequestPermissionsResultMethod();
40+
}
41+
42+
return onRequestPermissionsResultMethod;
43+
}
44+
45+
private void setOnRequestPermissionsResultMethod() {
46+
onRequestPermissionsResultMethod = holder().getGeneratedClass().method(JMod.PUBLIC, getCodeModel().VOID, "onRequestPermissionsResult");
47+
onRequestPermissionsResultMethod.annotate(Override.class);
48+
49+
requestCodeParam = onRequestPermissionsResultMethod.param(getCodeModel().INT, "requestCode");
50+
JVar permissionsParam = onRequestPermissionsResultMethod.param(getJClass("java.lang.String").array(), "permissions");
51+
grantResultsParam = onRequestPermissionsResultMethod.param(getCodeModel().INT.array(), "grantResults");
52+
53+
JBlock onRequestPermissionsResultMethodBody = onRequestPermissionsResultMethod.body();
54+
55+
onRequestPermissionsResultMethodBody.invoke(JExpr._super(), "onRequestPermissionsResult")
56+
.arg(requestCodeParam)
57+
.arg(permissionsParam)
58+
.arg(grantResultsParam);
59+
60+
onRequestPermissionsResultMethodDelegateBlock = onRequestPermissionsResultMethodBody.blockVirtual();
61+
62+
onRequestPermissionsResultMethodBody.assign(getPermissionDispatcherCalledField(), JExpr.FALSE);
63+
}
64+
65+
public void setDelegateCall(AbstractJClass delegateClass) {
66+
if (onRequestPermissionsResultMethod != null) {
67+
return;
68+
}
69+
70+
setOnRequestPermissionsResultMethod();
71+
72+
onRequestPermissionsResultMethodDelegateBlock.add(delegateClass.staticInvoke("onRequestPermissionsResult")
73+
.arg(JExpr._this())
74+
.arg(requestCodeParam)
75+
.arg(grantResultsParam));
76+
}
77+
78+
}

androidannotationspermissionsdispatcherplugin/src/main/java/com/github/aleksandermielczarek/androidannotationspermissionsdispatcherplugin/RuntimePermissionsHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ public RuntimePermissionsHandler(AndroidAnnotationsEnvironment environment) {
1818

1919
@Override
2020
protected void validate(Element element, ElementValidation validation) {
21-
21+
validatorHelper.hasEActivityOrEFragment(element, validation);
2222
}
2323

2424
@Override
2525
public void process(Element element, EComponentHolder holder) throws Exception {
26-
26+
// no-op
2727
}
2828
}

app/src/main/java/com/github/aleksandermielczarek/androidannotationspermissionsdispatcherpluginexample/MainActivity.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package com.github.aleksandermielczarek.androidannotationspermissionsdispatcherpluginexample;
22

33
import android.Manifest;
4-
import android.support.annotation.NonNull;
54
import android.support.v7.app.AppCompatActivity;
65
import android.widget.Toast;
7-
86
import org.androidannotations.annotations.Click;
97
import org.androidannotations.annotations.EActivity;
10-
118
import permissions.dispatcher.NeedsPermission;
129
import permissions.dispatcher.OnNeverAskAgain;
1310
import permissions.dispatcher.OnShowRationale;
@@ -23,7 +20,7 @@ public class MainActivity extends AppCompatActivity {
2320

2421
@Click(R.id.permissionButton)
2522
void askForPermission() {
26-
MainActivityPermissionsDispatcher.showCameraWithCheck(this);
23+
showCamera();
2724
}
2825

2926
@NeedsPermission(Manifest.permission.CAMERA)
@@ -42,10 +39,4 @@ protected void showNeverAskForSettings() {
4239
Toast.makeText(this, "OnNeverAskAgain", Toast.LENGTH_SHORT).show();
4340
}
4441

45-
@Override
46-
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
47-
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
48-
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
49-
}
50-
5142
}

app/src/main/java/com/github/aleksandermielczarek/androidannotationspermissionsdispatcherpluginexample/MainFragment.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package com.github.aleksandermielczarek.androidannotationspermissionsdispatcherpluginexample;
22

33
import android.Manifest;
4-
import android.support.annotation.NonNull;
54
import android.support.v4.app.Fragment;
65
import android.widget.Toast;
7-
86
import org.androidannotations.annotations.Click;
97
import org.androidannotations.annotations.EFragment;
10-
118
import permissions.dispatcher.NeedsPermission;
129
import permissions.dispatcher.OnNeverAskAgain;
1310
import permissions.dispatcher.OnShowRationale;
@@ -23,7 +20,7 @@ public class MainFragment extends Fragment {
2320

2421
@Click(R.id.permissionButton)
2522
void askForPermission() {
26-
MainFragmentPermissionsDispatcher.showCameraWithCheck(this);
23+
showCamera();
2724
}
2825

2926
@NeedsPermission(Manifest.permission.CAMERA)
@@ -42,9 +39,4 @@ protected void showNeverAskForSettings() {
4239
Toast.makeText(getContext(), "OnNeverAskAgain", Toast.LENGTH_SHORT).show();
4340
}
4441

45-
@Override
46-
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
47-
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
48-
MainFragmentPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
49-
}
5042
}

0 commit comments

Comments
 (0)