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 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..42afa548 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 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()) @@ -140,6 +141,19 @@ public abstract class BaseProcessorUnit : ProcessorUnit { val requestCodeField = requestCodeFieldName(needsMethod) val permissionField = permissionFieldName(needsMethod) + // 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) + .addCode(CodeBlock.builder() + .add("\$N.\$N(", targetParam, needsMethod.simpleString()) + .add(varargsParametersCodeBlock(needsMethod)) + .addStatement(")") + .addStatement("return") + .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) 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() {