From c3010676ae544ab973e87b356c92d05781a717a3 Mon Sep 17 00:00:00 2001 From: hotchemi Date: Sat, 24 Sep 2016 18:27:01 +0900 Subject: [PATCH 1/5] Add maxSdkVersion. --- .../src/main/java/permissions/dispatcher/NeedsPermission.java | 1 + 1 file changed, 1 insertion(+) diff --git a/library/src/main/java/permissions/dispatcher/NeedsPermission.java b/library/src/main/java/permissions/dispatcher/NeedsPermission.java index 3c609404..b9702f56 100644 --- a/library/src/main/java/permissions/dispatcher/NeedsPermission.java +++ b/library/src/main/java/permissions/dispatcher/NeedsPermission.java @@ -12,4 +12,5 @@ @Retention(RetentionPolicy.CLASS) public @interface NeedsPermission { String[] value(); + int maxSdkVersion() default 0; } \ No newline at end of file From 67bb862234a69f93042d67809ef31a2dbadd6de4 Mon Sep 17 00:00:00 2001 From: hotchemi Date: Sun, 25 Sep 2016 03:05:29 +0900 Subject: [PATCH 2/5] Add a junction of maxSdkVersion. --- .../processor/impl/BaseProcessorUnit.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt b/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt index 04a3c4fa..2b58c645 100644 --- a/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt +++ b/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt @@ -17,9 +17,10 @@ import javax.lang.model.element.Modifier *

* This generates the parts of code independent from specific permission method signatures for different target objects. */ -public abstract class BaseProcessorUnit : ProcessorUnit { +abstract class BaseProcessorUnit : ProcessorUnit { protected val PERMISSION_UTILS = ClassName.get("permissions.dispatcher", "PermissionUtils") + private val SDK_INT = ClassName.get("android.os", "Build") private val MANIFEST_WRITE_SETTING = "android.permission.WRITE_SETTINGS" private val MANIFEST_SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW" private val ADD_WITH_CHECK_BODY_MAP = hashMapOf(MANIFEST_SYSTEM_ALERT_WINDOW to SystemAlertWindowHelper(), MANIFEST_WRITE_SETTING to WriteSettingsHelper()) @@ -140,6 +141,19 @@ public abstract class BaseProcessorUnit : ProcessorUnit { val requestCodeField = requestCodeFieldName(needsMethod) val permissionField = permissionFieldName(needsMethod) + // if maxSdkVersion is lower than os level don't check permission + val needsPermissionMaxSdkVersion = needsMethod.getAnnotation(NeedsPermission::class.java).maxSdkVersion + if (needsPermissionMaxSdkVersion > 0) { + builder.beginControlFlow("if (\$T.VERSION.SDK_INT > \$L}", SDK_INT, needsPermissionMaxSdkVersion) + .addCode(CodeBlock.builder() + .add("\$N.\$N(", targetParam, needsMethod.simpleString()) + .add(varargsParametersCodeBlock(needsMethod)) + .addStatement("return") + .addStatement(")") + .build()) + .endControlFlow() + } + // Add the conditional for when permission has already been granted val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0] val activityVar = getActivityName(targetParam) From 5bfe2218464471ef1c7e7d5ade5b5f2514122412 Mon Sep 17 00:00:00 2001 From: hotchemi Date: Sun, 25 Sep 2016 13:24:28 +0900 Subject: [PATCH 3/5] Add unit test. --- .../processor/impl/BaseProcessorUnit.kt | 4 +- .../processor/ProcessorTestSuite.java | 9 + .../dispatcher/processor/data/Source.java | 157 ++++++++++++++++++ 3 files changed, 168 insertions(+), 2 deletions(-) diff --git a/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt b/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt index 2b58c645..b6bc9b33 100644 --- a/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt +++ b/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt @@ -144,12 +144,12 @@ abstract class BaseProcessorUnit : ProcessorUnit { // if maxSdkVersion is lower than os level don't check permission val needsPermissionMaxSdkVersion = needsMethod.getAnnotation(NeedsPermission::class.java).maxSdkVersion if (needsPermissionMaxSdkVersion > 0) { - builder.beginControlFlow("if (\$T.VERSION.SDK_INT > \$L}", SDK_INT, needsPermissionMaxSdkVersion) + builder.beginControlFlow("if (\$T.VERSION.SDK_INT > \$L)", SDK_INT, needsPermissionMaxSdkVersion) .addCode(CodeBlock.builder() .add("\$N.\$N(", targetParam, needsMethod.simpleString()) .add(varargsParametersCodeBlock(needsMethod)) - .addStatement("return") .addStatement(")") + .addStatement("return") .build()) .endControlFlow() } diff --git a/processor/src/test/java/permissions/dispatcher/processor/ProcessorTestSuite.java b/processor/src/test/java/permissions/dispatcher/processor/ProcessorTestSuite.java index c3de9eac..34514a1e 100644 --- a/processor/src/test/java/permissions/dispatcher/processor/ProcessorTestSuite.java +++ b/processor/src/test/java/permissions/dispatcher/processor/ProcessorTestSuite.java @@ -1,6 +1,7 @@ package permissions.dispatcher.processor; import org.junit.Test; + import permissions.dispatcher.processor.base.TestSuite; import permissions.dispatcher.processor.data.Source; @@ -312,6 +313,14 @@ public class ProcessorTestSuite extends TestSuite { assertJavaSource(Source.NoDuplicatesDespiteRepeatedValuesActivity); } + @Test public void validMaxSdkVersion() { + assertJavaSource(Source.ValidMaxSdkVersion); + } + + @Test public void invalidMaxSdkVersion() { + assertJavaSource(Source.InValidMaxSdkVersion); + } + @Test public void writeSettingsSupportFragment() { assertJavaSource(Source.WriteSettingsSupportFragment); } diff --git a/processor/src/test/java/permissions/dispatcher/processor/data/Source.java b/processor/src/test/java/permissions/dispatcher/processor/data/Source.java index 1d5e959a..2b1ba4e6 100644 --- a/processor/src/test/java/permissions/dispatcher/processor/data/Source.java +++ b/processor/src/test/java/permissions/dispatcher/processor/data/Source.java @@ -4961,6 +4961,163 @@ protected String[] getExpectSource() { } }; + public static final BaseTest ValidMaxSdkVersion = new BaseTest() { + @Override + protected String getName() { + return "MyActivity"; + } + + @Override + protected String[] getActualSource() { + return new String[]{ + "package tests;", + "import android.Manifest;", + "import android.app.Activity;", + "import permissions.dispatcher.RuntimePermissions;", + "import permissions.dispatcher.NeedsPermission;", + "import permissions.dispatcher.OnPermissionDenied;", + "import permissions.dispatcher.OnNeverAskAgain;", + "@RuntimePermissions", + "public class MyActivity extends Activity {", + " @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 18)", + " void showGetStorage() {", + " }", + " @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)", + " void onGetStorageDenied() {", + " }", + " @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)", + " void onGetStorageNeverAsk() {", + " }", + "}" + }; + } + + @Override + protected String[] getExpectSource() { + return new String[]{ + "package tests;", + "import android.os.Build;", + "import android.support.v4.app.ActivityCompat;", + "import java.lang.String;", + "import permissions.dispatcher.PermissionUtils;", + "final class MyActivityPermissionsDispatcher {", + " private static final int REQUEST_SHOWGETSTORAGE = 0;", + " private static final String[] PERMISSION_SHOWGETSTORAGE = new String[] {\"android.permission.WRITE_EXTERNAL_STORAGE\"};", + " private MyActivityPermissionsDispatcher() {", + " }", + " static void showGetStorageWithCheck(MyActivity target) {", + " if (Build.VERSION.SDK_INT > 18) {", + " target.showGetStorage();", + " return;", + " }", + " if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWGETSTORAGE)) {", + " target.showGetStorage();", + " } else {", + " ActivityCompat.requestPermissions(target, PERMISSION_SHOWGETSTORAGE, REQUEST_SHOWGETSTORAGE);", + " }", + " }", + " static void onRequestPermissionsResult(MyActivity target, int requestCode, int[] grantResults) {", + " switch (requestCode) {", + " case REQUEST_SHOWGETSTORAGE:", + " if (PermissionUtils.getTargetSdkVersion(target) < 23 && !PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWGETSTORAGE)) {", + " target.onGetStorageDenied();", + " return;", + " }", + " if (PermissionUtils.verifyPermissions(grantResults)) {", + " target.showGetStorage();", + " } else {", + " if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWGETSTORAGE)) {", + " target.onGetStorageNeverAsk();", + " } else {", + " target.onGetStorageDenied();", + " }", + " }", + " break;", + " default:", + " break;", + " }", + " }", + "}" + }; + } + }; + + public static final BaseTest InValidMaxSdkVersion = new BaseTest() { + @Override + protected String getName() { + return "MyActivity"; + } + + @Override + protected String[] getActualSource() { + return new String[]{ + "package tests;", + "import android.Manifest;", + "import android.app.Activity;", + "import permissions.dispatcher.RuntimePermissions;", + "import permissions.dispatcher.NeedsPermission;", + "import permissions.dispatcher.OnPermissionDenied;", + "import permissions.dispatcher.OnNeverAskAgain;", + "@RuntimePermissions", + "public class MyActivity extends Activity {", + " @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 0)", + " void showGetStorage() {", + " }", + " @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)", + " void onGetStorageDenied() {", + " }", + " @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)", + " void onGetStorageNeverAsk() {", + " }", + "}" + }; + } + + @Override + protected String[] getExpectSource() { + return new String[]{ + "package tests;", + "import android.support.v4.app.ActivityCompat;", + "import java.lang.String;", + "import permissions.dispatcher.PermissionUtils;", + "final class MyActivityPermissionsDispatcher {", + " private static final int REQUEST_SHOWGETSTORAGE = 0;", + " private static final String[] PERMISSION_SHOWGETSTORAGE = new String[] {\"android.permission.WRITE_EXTERNAL_STORAGE\"};", + " private MyActivityPermissionsDispatcher() {", + " }", + " static void showGetStorageWithCheck(MyActivity target) {", + " if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWGETSTORAGE)) {", + " target.showGetStorage();", + " } else {", + " ActivityCompat.requestPermissions(target, PERMISSION_SHOWGETSTORAGE, REQUEST_SHOWGETSTORAGE);", + " }", + " }", + " static void onRequestPermissionsResult(MyActivity target, int requestCode, int[] grantResults) {", + " switch (requestCode) {", + " case REQUEST_SHOWGETSTORAGE:", + " if (PermissionUtils.getTargetSdkVersion(target) < 23 && !PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWGETSTORAGE)) {", + " target.onGetStorageDenied();", + " return;", + " }", + " if (PermissionUtils.verifyPermissions(grantResults)) {", + " target.showGetStorage();", + " } else {", + " if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWGETSTORAGE)) {", + " target.onGetStorageNeverAsk();", + " } else {", + " target.onGetStorageDenied();", + " }", + " }", + " break;", + " default:", + " break;", + " }", + " }", + "}" + }; + } + }; + public static final BaseTest DuplicatesInListsActivity = new BaseTest() { @Override protected String getName() { From 18426fce35f7b8d1b06b81b143c56d3cd891b708 Mon Sep 17 00:00:00 2001 From: hotchemi Date: Sun, 25 Sep 2016 13:33:26 +0900 Subject: [PATCH 4/5] Rename variable. --- .../dispatcher/processor/impl/BaseProcessorUnit.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt b/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt index b6bc9b33..9a6c77ff 100644 --- a/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt +++ b/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt @@ -20,7 +20,7 @@ import javax.lang.model.element.Modifier abstract class BaseProcessorUnit : ProcessorUnit { protected val PERMISSION_UTILS = ClassName.get("permissions.dispatcher", "PermissionUtils") - private val SDK_INT = ClassName.get("android.os", "Build") + private val BUILD = ClassName.get("android.os", "Build") private val MANIFEST_WRITE_SETTING = "android.permission.WRITE_SETTINGS" private val MANIFEST_SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW" private val ADD_WITH_CHECK_BODY_MAP = hashMapOf(MANIFEST_SYSTEM_ALERT_WINDOW to SystemAlertWindowHelper(), MANIFEST_WRITE_SETTING to WriteSettingsHelper()) @@ -144,7 +144,7 @@ abstract class BaseProcessorUnit : ProcessorUnit { // if maxSdkVersion is lower than os level don't check permission val needsPermissionMaxSdkVersion = needsMethod.getAnnotation(NeedsPermission::class.java).maxSdkVersion if (needsPermissionMaxSdkVersion > 0) { - builder.beginControlFlow("if (\$T.VERSION.SDK_INT > \$L)", SDK_INT, needsPermissionMaxSdkVersion) + builder.beginControlFlow("if (\$T.VERSION.SDK_INT > \$L)", BUILD, needsPermissionMaxSdkVersion) .addCode(CodeBlock.builder() .add("\$N.\$N(", targetParam, needsMethod.simpleString()) .add(varargsParametersCodeBlock(needsMethod)) From fe2cbc97ae468b96c225fd8ccfb0a82b18dc2026 Mon Sep 17 00:00:00 2001 From: hotchemi Date: Sun, 25 Sep 2016 13:53:58 +0900 Subject: [PATCH 5/5] Fix comment little bit. --- .../permissions/dispatcher/processor/impl/BaseProcessorUnit.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt b/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt index 9a6c77ff..42afa548 100644 --- a/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt +++ b/processor/src/main/kotlin/permissions/dispatcher/processor/impl/BaseProcessorUnit.kt @@ -141,7 +141,7 @@ abstract class BaseProcessorUnit : ProcessorUnit { val requestCodeField = requestCodeFieldName(needsMethod) val permissionField = permissionFieldName(needsMethod) - // if maxSdkVersion is lower than os level don't check permission + // if maxSdkVersion is lower than os level does nothing val needsPermissionMaxSdkVersion = needsMethod.getAnnotation(NeedsPermission::class.java).maxSdkVersion if (needsPermissionMaxSdkVersion > 0) { builder.beginControlFlow("if (\$T.VERSION.SDK_INT > \$L)", BUILD, needsPermissionMaxSdkVersion)