Skip to content

Reject permissions requests when there is no activity available. #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: rn-34
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,11 @@ public String getName() {
*/
@ReactMethod
public void checkPermission(final String permission, final Promise promise) {
PermissionAwareActivity activity = getPermissionAwareActivity();
PermissionAwareActivity activity = getPermissionAwareActivity(getCurrentActivity(), promise);
if (activity == null) {
return;
}

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
promise.resolve(activity.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED);
return;
Expand All @@ -79,7 +83,12 @@ public void shouldShowRequestPermissionRationale(final String permission, final
promise.resolve(false);
return;
}
promise.resolve(getPermissionAwareActivity().shouldShowRequestPermissionRationale(permission));
PermissionAwareActivity activity = getPermissionAwareActivity(getCurrentActivity(), promise);
if (activity == null) {
return;
}

promise.resolve(activity.shouldShowRequestPermissionRationale(permission));
}

/**
Expand All @@ -90,7 +99,10 @@ public void shouldShowRequestPermissionRationale(final String permission, final
*/
@ReactMethod
public void requestPermission(final String permission, final Promise promise) {
PermissionAwareActivity activity = getPermissionAwareActivity();
PermissionAwareActivity activity = getPermissionAwareActivity(getCurrentActivity(), promise);
if (activity == null) {
return;
}

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
promise.resolve(activity.checkPermission(permission, Process.myPid(), Process.myUid()) ==
Expand All @@ -110,7 +122,11 @@ public void invoke(Object... args) {
if (results[0] == PackageManager.PERMISSION_GRANTED) {
promise.resolve(PERMISSION_GRANTED);
} else {
PermissionAwareActivity activity = (PermissionAwareActivity) args[1];
PermissionAwareActivity activity = getPermissionAwareActivity((Activity) args[1], promise);
if (activity == null) {
return;
}

if (activity.shouldShowRequestPermissionRationale(permission)) {
promise.resolve(PERMISSION_DENIED);
} else {
Expand All @@ -126,7 +142,11 @@ public void invoke(Object... args) {

@ReactMethod
public void requestMultiplePermissions(final ReadableArray permissions, final Promise promise) {
PermissionAwareActivity activity = getPermissionAwareActivity();
PermissionAwareActivity activity = getPermissionAwareActivity(getCurrentActivity(), promise);
if (activity == null) {
return;
}

final WritableMap grantedPermissions = new WritableNativeMap();
final ArrayList<String> permissionsToCheck = new ArrayList<String>();
int checkedPermissionsCount = 0;
Expand Down Expand Up @@ -156,7 +176,11 @@ mRequestCode, new Callback() {
@Override
public void invoke(Object... args) {
int[] results = (int[]) args[0];
PermissionAwareActivity activity = (PermissionAwareActivity) args[1];
PermissionAwareActivity activity = getPermissionAwareActivity((Activity) args[1], promise);
if (activity == null) {
return;
}

for (int j = 0; j < permissionsToCheck.size(); j++) {
String permission = permissionsToCheck.get(j);
if (results[j] == PackageManager.PERMISSION_GRANTED) {
Expand Down Expand Up @@ -185,20 +209,19 @@ public boolean onRequestPermissionsResult(
int requestCode,
String[] permissions,
int[] grantResults) {
mCallbacks.get(requestCode).invoke(grantResults, getPermissionAwareActivity());
mCallbacks.get(requestCode).invoke(grantResults, getCurrentActivity());
mCallbacks.remove(requestCode);
return mCallbacks.size() == 0;
}

private PermissionAwareActivity getPermissionAwareActivity() {
Activity activity = getCurrentActivity();
if (activity == null) {
throw new IllegalStateException("Tried to use permissions API while not attached to an " +
"Activity.");
} else if (!(activity instanceof PermissionAwareActivity)) {
throw new IllegalStateException("Tried to use permissions API but the host Activity doesn't" +
" implement PermissionAwareActivity.");
private PermissionAwareActivity getPermissionAwareActivity(Activity currentActivity, Promise promise) {
if (currentActivity == null) {
promise.reject("E_NO_ACTIVITY", "Tried to use permissions API while not attached to an Activity.");
return null;
} else if (!(currentActivity instanceof PermissionAwareActivity)) {
promise.reject("E_INVALID_ACTIVITY", "Tried to use permissions API but the host Activity doesn't implement PermissionAwareActivity");
return null;
}
return (PermissionAwareActivity) activity;
return (PermissionAwareActivity) currentActivity;
}
}