Skip to content
This repository was archived by the owner on Oct 3, 2024. It is now read-only.

Refactor to delegate to helpers #110

Merged
merged 5 commits into from
Apr 21, 2017
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ ext {

mavenGroup = 'pub.devrel'
mavenArtifactId = 'easypermissions'
mavenVersion = '0.3.1'
mavenVersion = '0.4.0'

bintrayOrg = 'easygoogle'

Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,22 @@
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.annotation.RestrictTo;
import android.support.annotation.StringRes;

/**
* {@link DialogFragment} to display rationale for permission requests when the request comes from
* a Fragment or Activity that can host a Fragment.
*/
@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
@RestrictTo(RestrictTo.Scope.LIBRARY)
public class RationaleDialogFragment extends DialogFragment {

public static final String TAG = "RationaleDialogFragment";

private EasyPermissions.PermissionCallbacks mPermissionCallbacks;

static RationaleDialogFragment newInstance(
public static RationaleDialogFragment newInstance(
@StringRes int positiveButton, @StringRes int negativeButton,
@NonNull String rationaleMsg, int requestCode, @NonNull String[] permissions) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.annotation.RestrictTo;
import android.support.annotation.StringRes;
import android.support.v7.app.AppCompatDialogFragment;

Expand All @@ -14,11 +15,14 @@
* comes from a Fragment or Activity that can host a Fragment.
*/
@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@RestrictTo(RestrictTo.Scope.LIBRARY)
public class RationaleDialogFragmentCompat extends AppCompatDialogFragment {

public static final String TAG = "RationaleDialogFragmentCompat";

private EasyPermissions.PermissionCallbacks mPermissionCallbacks;

static RationaleDialogFragmentCompat newInstance(
public static RationaleDialogFragmentCompat newInstance(
@StringRes int positiveButton, @StringRes int negativeButton,
@NonNull String rationaleMsg, int requestCode, @NonNull String[] permissions) {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package pub.devrel.easypermissions.helper;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v4.app.ActivityCompat;

/**
* Permissions helper for {@link Activity}.
*/
class ActivityPermissionHelper extends PermissionHelper<Activity> {

public ActivityPermissionHelper(Activity host) {
super(host);
}

@Override
@SuppressLint("NewApi")
public void requestPermissions(@NonNull String rationale,
@StringRes int positiveButton,
@StringRes int negativeButton,
int requestCode,
@NonNull String... perms) {

if (shouldShowRationale(perms)) {
showRationaleDialogFragment(
getHost().getFragmentManager(),
rationale,
positiveButton,
negativeButton,
requestCode,
perms);
} else {
ActivityCompat.requestPermissions(getHost(), perms, requestCode);
}
}

@Override
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
return ActivityCompat.shouldShowRequestPermissionRationale(getHost(), perm);
}

@Override
public Context getContext() {
return getHost();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package pub.devrel.easypermissions.helper;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;

/**
* Permissions helper for {@link Fragment} from the framework.
*/
class FrameworkFragmentPermissionHelper extends PermissionHelper<Fragment> {

public FrameworkFragmentPermissionHelper(@NonNull Fragment host) {
super(host);
}

@Override
@SuppressLint("NewApi")
public void requestPermissions(@NonNull String rationale,
@StringRes int positiveButton,
@StringRes int negativeButton, int requestCode,
@NonNull String... perms) {

if (shouldShowRationale(perms)) {
showRationaleDialogFragment(
getHost().getChildFragmentManager(),
rationale,
positiveButton,
negativeButton,
requestCode,
perms);
} else {
getHost().requestPermissions(perms, requestCode);
}
}

@Override
@SuppressLint("NewApi")
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
return getHost().shouldShowRequestPermissionRationale(perm);
}

@Override
@SuppressLint("NewApi")
public Context getContext() {
return getHost().getActivity();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package pub.devrel.easypermissions.helper;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;

/**
* Permissions helper for apps built against API < 23, which do not need runtime permissions.
*/
class LowApiPermissionsHelper extends PermissionHelper<Object> {

public LowApiPermissionsHelper(@NonNull Object host) {
super(host);
}

@Override
public void requestPermissions(@NonNull String rationale,
@StringRes int positiveButton,
@StringRes int negativeButton,
int requestCode,
@NonNull String... perms) {

throw new IllegalStateException("Should never be requesting permissions on API < 23!");
}

@Override
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
return false;
}

@Override
public Context getContext() {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package pub.devrel.easypermissions.helper;

import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.annotation.RestrictTo;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;

import java.util.List;

import pub.devrel.easypermissions.RationaleDialogFragment;

/**
* Delegate class to make permission calls based on the 'host' (Fragment, Activity, etc).
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
public abstract class PermissionHelper<T> {

private static final String TAG = "PermissionHelper";

private T mHost;

@NonNull
public static PermissionHelper newInstance(Activity host) {
if (Build.VERSION.SDK_INT < 23) {
return new LowApiPermissionsHelper(host);
}

return new ActivityPermissionHelper(host);
}

@NonNull
public static PermissionHelper newInstance(Fragment host) {
if (Build.VERSION.SDK_INT < 23) {
return new LowApiPermissionsHelper(host);
}

return new SupportFragmentPermissionHelper(host);
}

@NonNull
public static PermissionHelper newInstance(android.app.Fragment host) {
if (Build.VERSION.SDK_INT < 23) {
return new LowApiPermissionsHelper(host);
}

return new FrameworkFragmentPermissionHelper(host);
}

// ============================================================================
// Public concrete methods
// ============================================================================

public PermissionHelper(@NonNull T host) {
mHost = host;
}

public boolean shouldShowRationale(@NonNull String... perms) {
for (String perm : perms) {
if (shouldShowRequestPermissionRationale(perm)) {
return true;
}
}
return false;
}

public boolean somePermissionPermanentlyDenied(@NonNull List<String> perms) {
for (String deniedPermission : perms) {
if (permissionPermanentlyDenied(deniedPermission)) {
return true;
}
}

return false;
}

public boolean permissionPermanentlyDenied(@NonNull String perms) {
return !shouldShowRequestPermissionRationale(perms);
}

public boolean somePermissionDenied(@NonNull String... perms) {
return shouldShowRationale(perms);
}

@NonNull
public T getHost() {
return mHost;
}

// ============================================================================
// Public abstract methods
// ============================================================================

public abstract void requestPermissions(@NonNull String rationale,
@StringRes int positiveButton,
@StringRes int negativeButton,
int requestCode,
@NonNull String... perms);

public abstract boolean shouldShowRequestPermissionRationale(@NonNull String perm);

public abstract Context getContext();

// ============================================================================
// Protected methods
// ============================================================================

/**
* Show a {@link RationaleDialogFragment} explaining permission request rationale.
*/
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
protected void showRationaleDialogFragment(@NonNull android.app.FragmentManager fragmentManager,
@NonNull String rationale,
@StringRes int positiveButton,
@StringRes int negativeButton,
int requestCode,
@NonNull String... perms) {

RationaleDialogFragment
.newInstance(positiveButton, negativeButton, rationale, requestCode, perms)
.show(fragmentManager, RationaleDialogFragment.TAG);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package pub.devrel.easypermissions.helper;

import android.annotation.SuppressLint;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;

import pub.devrel.easypermissions.RationaleDialogFragmentCompat;

/**
* Permissions helper for {@link Fragment} from the support library.
*/
class SupportFragmentPermissionHelper extends PermissionHelper<Fragment> {

public SupportFragmentPermissionHelper(@NonNull Fragment host) {
super(host);
}

@Override
@SuppressLint("NewApi")
public void requestPermissions(@NonNull String rationale,
@StringRes int positiveButton,
@StringRes int negativeButton,
int requestCode,
@NonNull String... perms) {

if (shouldShowRationale(perms)) {
RationaleDialogFragmentCompat
.newInstance(positiveButton, negativeButton, rationale, requestCode, perms)
.show(getHost().getChildFragmentManager(), RationaleDialogFragmentCompat.TAG);
} else {
getHost().requestPermissions(perms, requestCode);
}
}

@Override
public boolean shouldShowRequestPermissionRationale(@NonNull String perm) {
return getHost().shouldShowRequestPermissionRationale(perm);
}

@Override
public Context getContext() {
return getHost().getActivity();
}
}