Skip to content

Commit 7fe3a12

Browse files
author
Shintaro Katafuchi
committed
Merge pull request #30 from hotchemi/fix-16
Fix to use support fragment methods to handle permissions stuff.
2 parents cd4c640 + 4328849 commit 7fe3a12

File tree

7 files changed

+51
-20
lines changed

7 files changed

+51
-20
lines changed

permissionsdispatcher-processor/src/main/java/permissions/dispatcher/processor/ClassType.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
enum ClassType {
44
ACTIVITY("target"),
5-
FRAGMENT("target.getActivity()");
5+
V4FRAGMENT("target.getActivity()");
66

77
private final String activity;
88

@@ -18,7 +18,7 @@ static ClassType getClassType(String className, TypeResolver resolver) {
1818
if (resolver.isSubTypeOf(className, ConstantsProvider.ACTIVITY)) {
1919
return ACTIVITY;
2020
} else if (resolver.isSubTypeOf(className, ConstantsProvider.V4FRAGMENT)) {
21-
return FRAGMENT;
21+
return V4FRAGMENT;
2222
}
2323
return null;
2424
}

permissionsdispatcher-processor/src/main/java/permissions/dispatcher/processor/JavaFileBuilder.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package permissions.dispatcher.processor;
22

33
import com.squareup.javapoet.*;
4+
45
import permissions.dispatcher.NeedsPermission;
56
import permissions.dispatcher.NeedsPermissions;
67

78
import javax.lang.model.element.ExecutableElement;
89
import javax.lang.model.element.Modifier;
10+
911
import java.util.ArrayList;
1012
import java.util.List;
1113

@@ -26,7 +28,8 @@ private static List<MethodSpec> createNeedsPermissionMethods(RuntimePermissionsA
2628
String value = element.getAnnotation(NeedsPermission.class).value();
2729
ExecutableElement showsRationale = clazz.getShowsRationaleFromValue(value);
2830
String activity = clazz.getClassType().getActivity();
29-
methodSpecs.add(createMethodWithCheck(activity, clazz.getClassName(), element, showsRationale));
31+
methodSpecs.add(createMethodWithCheck(clazz.getClassType(), activity,
32+
clazz.getClassName(), element, showsRationale));
3033
}
3134
return methodSpecs;
3235
}
@@ -38,12 +41,14 @@ private static List<MethodSpec> createNeedsPermissionsMethods(RuntimePermissions
3841
String[] value = element.getAnnotation(NeedsPermissions.class).value();
3942
ExecutableElement showsRationale = clazz.getShowsRationaleFromValue(value);
4043
String activity = clazz.getClassType().getActivity();
41-
methodSpecs.add(createMethodWithCheck(activity, clazz.getClassName(), element, showsRationale));
44+
methodSpecs.add(createMethodWithCheck(clazz.getClassType(), activity,
45+
clazz.getClassName(), element, showsRationale));
4246
}
4347
return methodSpecs;
4448
}
4549

46-
private static MethodSpec createMethodWithCheck(String activity, ClassName target, ExecutableElement needsPermission, ExecutableElement showsRationale) {
50+
private static MethodSpec createMethodWithCheck(ClassType classType, String activity, ClassName target,
51+
ExecutableElement needsPermission, ExecutableElement showsRationale) {
4752
String methodName = needsPermission.getSimpleName().toString();
4853
String value = getPermissionFieldName(needsPermission.getSimpleName().toString());
4954
MethodSpec.Builder
@@ -55,15 +60,26 @@ private static MethodSpec createMethodWithCheck(String activity, ClassName targe
5560
.addStatement("target.$N()", methodName)
5661
.nextControlFlow("else");
5762
if (showsRationale != null) {
58-
methodBuilder.beginControlFlow("if ($T.shouldShowRequestPermissionRationale($N, $N))",
59-
PERMISSION_UTILS, activity, value)
63+
String rationaleTarget = null;
64+
if (classType == ClassType.ACTIVITY) {
65+
rationaleTarget = activity;
66+
} else if (classType == ClassType.V4FRAGMENT) {
67+
rationaleTarget = "target";
68+
}
69+
methodBuilder
70+
.beginControlFlow("if ($T.shouldShowRequestPermissionRationale($N, $N))",
71+
PERMISSION_UTILS, rationaleTarget, value)
6072
.addStatement("target.$N()", showsRationale.getSimpleName())
6173
.endControlFlow();
6274
}
63-
return methodBuilder.addStatement("$T.requestPermissions($N, $N, $N)",
64-
ACTIVITY_COMPAT, activity, value, getRequestCodeFieldName(methodName))
65-
.endControlFlow()
66-
.build();
75+
if (classType == ClassType.ACTIVITY) {
76+
methodBuilder.addStatement("$T.requestPermissions($N, $N, $N)",
77+
ACTIVITY_COMPAT, activity, value, getRequestCodeFieldName(methodName));
78+
} else if (classType == ClassType.V4FRAGMENT) {
79+
methodBuilder.addStatement("target.requestPermissions($N, $N)",
80+
value, getRequestCodeFieldName(methodName));
81+
}
82+
return methodBuilder.endControlFlow().build();
6783
}
6884

6985
private static MethodSpec createOnRequestPermissionsResult(RuntimePermissionsAnnotatedElement element) {

permissionsdispatcher-processor/src/test/java/permissions/dispatcher/processor/ClassTypeTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class ClassTypeTest {
1212
@Test
1313
public void getActivityTest() {
1414
assertThat(ClassType.ACTIVITY.getActivity()).isEqualTo("target");
15-
assertThat(ClassType.FRAGMENT.getActivity()).isEqualTo("target.getActivity()");
15+
assertThat(ClassType.V4FRAGMENT.getActivity()).isEqualTo("target.getActivity()");
1616
}
1717

1818
}

permissionsdispatcher-processor/src/test/java/permissions/dispatcher/processor/UtilsTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ public void testGetFieldName() {
6969
assertThat(getRequestCodeFieldName(name)).isEqualTo("REQUEST_ACTIVITY");
7070
}
7171
{
72-
String name = "FRAGMENT";
73-
assertThat(getRequestCodeFieldName(name)).isEqualTo("REQUEST_FRAGMENT");
72+
String name = "V4FRAGMENT";
73+
assertThat(getRequestCodeFieldName(name)).isEqualTo("REQUEST_V4FRAGMENT");
7474
}
7575
}
7676

permissionsdispatcher-processor/src/test/java/permissions/dispatcher/processor/data/Source.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ public static class OnePermissionFragment {
9090
public static final String[] EXPECT = {
9191
"package permissions.dispatcher.sample;",
9292
"\n",
93-
"import android.support.v4.app.ActivityCompat;",
9493
"import java.lang.String;",
9594
"import permissions.dispatcher.PermissionUtils;",
9695
"\n",
@@ -106,10 +105,10 @@ public static class OnePermissionFragment {
106105
" if (PermissionUtils.hasSelfPermissions(target.getActivity(), PERMISSION_SHOWCAMERA)) {",
107106
" target.showCamera();",
108107
" } else {",
109-
" if (PermissionUtils.shouldShowRequestPermissionRationale(target.getActivity(), PERMISSION_SHOWCAMERA)) {",
108+
" if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {",
110109
" target.showRationaleForCamera();",
111110
" }",
112-
" ActivityCompat.requestPermissions(target.getActivity(), PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);",
111+
" target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);",
113112
" }",
114113
" }",
115114
"\n",
@@ -920,7 +919,6 @@ public static class NestedSuperClassFragment {
920919
public static final String[] EXPECT = {
921920
"package permissions.dispatcher.sample;",
922921
"\n",
923-
"import android.support.v4.app.ActivityCompat;",
924922
"import java.lang.String;",
925923
"import permissions.dispatcher.PermissionUtils;",
926924
"\n",
@@ -936,10 +934,10 @@ public static class NestedSuperClassFragment {
936934
" if (PermissionUtils.hasSelfPermissions(target.getActivity(), PERMISSION_SHOWCAMERA)) {",
937935
" target.showCamera();",
938936
" } else {",
939-
" if (PermissionUtils.shouldShowRequestPermissionRationale(target.getActivity(), PERMISSION_SHOWCAMERA)) {",
937+
" if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {",
940938
" target.showRationaleForCamera();",
941939
" }",
942-
" ActivityCompat.requestPermissions(target.getActivity(), PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);",
940+
" target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);",
943941
" }",
944942
" }",
945943
"\n",
Binary file not shown.

permissionsdispatcher/src/main/android/permissions/dispatcher/PermissionUtils.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.Context;
55
import android.content.pm.PackageManager;
66
import android.support.v4.app.ActivityCompat;
7+
import android.support.v4.app.Fragment;
78

89
import static android.support.v4.content.PermissionChecker.checkSelfPermission;
910

@@ -59,4 +60,20 @@ public static boolean shouldShowRequestPermissionRationale(Activity activity, St
5960
return false;
6061
}
6162

63+
/**
64+
* Checks given permissions are needed to show rationale.
65+
*
66+
* @param fragment fragment
67+
* @param permissions permission list
68+
* @return returns true if one of the permission is needed to show rationale.
69+
*/
70+
public static boolean shouldShowRequestPermissionRationale(Fragment fragment, String... permissions) {
71+
for (String permission : permissions) {
72+
if (fragment.shouldShowRequestPermissionRationale(permission)) {
73+
return true;
74+
}
75+
}
76+
return false;
77+
}
78+
6279
}

0 commit comments

Comments
 (0)