Skip to content

Commit

Permalink
Merge pull request #204 from hotchemi/issue192
Browse files Browse the repository at this point in the history
Support maxSdkVersion
  • Loading branch information
hotchemi committed Sep 25, 2016
2 parents 6ad1e05 + fe2cbc9 commit a03bf73
Show file tree
Hide file tree
Showing 4 changed files with 182 additions and 1 deletion.
Expand Up @@ -12,4 +12,5 @@
@Retention(RetentionPolicy.CLASS)
public @interface NeedsPermission {
String[] value();
int maxSdkVersion() default 0;
}
Expand Up @@ -17,9 +17,10 @@ import javax.lang.model.element.Modifier
* <p>
* 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())
Expand Down Expand Up @@ -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)
Expand Down
@@ -1,6 +1,7 @@
package permissions.dispatcher.processor;

import org.junit.Test;

import permissions.dispatcher.processor.base.TestSuite;
import permissions.dispatcher.processor.data.Source;

Expand Down Expand Up @@ -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);
}
Expand Down
Expand Up @@ -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() {
Expand Down

0 comments on commit a03bf73

Please sign in to comment.