From 49b6867e6dd7d80effeb02e7d68ed6e890a6d100 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Wed, 6 Dec 2017 11:42:10 -0800 Subject: [PATCH] Add new builder API and support customizing rationale dialog theme (#180) --- README.md | 12 + .../easypermissions/sample/MainFragment.java | 12 +- .../easypermissions/EasyPermissions.java | 91 ++++-- .../easypermissions/PermissionRequest.java | 270 ++++++++++++++++++ .../RationaleDialogConfig.java | 42 ++- .../RationaleDialogFragment.java | 12 +- .../RationaleDialogFragmentCompat.java | 12 +- .../BaseFrameworkPermissionsHelper.java | 8 +- .../helper/BaseSupportPermissionsHelper.java | 8 +- .../helper/LowApiPermissionsHelper.java | 23 +- .../helper/PermissionHelper.java | 37 ++- .../easypermissions/helper/package-info.java | 4 + .../src/main/res/values/strings.xml | 6 +- 13 files changed, 453 insertions(+), 84 deletions(-) create mode 100644 easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java create mode 100644 easypermissions/src/main/java/pub/devrel/easypermissions/helper/package-info.java diff --git a/README.md b/README.md index c957fda..f23c85c 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,18 @@ private void methodRequiresTwoPermission() { } ``` +Or for finer control over the rationale dialog, use a `PermissionRequest`: + +```java +EasyPermissions.requestPermissions( + new PermissionRequest.Builder(this, RC_CAMERA_AND_LOCATION, perms) + .setRationale(R.string.camera_and_location_rationale) + .setPositiveButtonText(R.string.rationale_ask_ok) + .setNegativeButtonText(R.string.rationale_ask_cancel) + .setTheme(R.style.my_fancy_style) + .build()); +``` + Optionally, for a finer control, you can have your `Activity` / `Fragment` implement the `PermissionCallbacks` interface. diff --git a/app/src/main/java/pub/devrel/easypermissions/sample/MainFragment.java b/app/src/main/java/pub/devrel/easypermissions/sample/MainFragment.java index edb4164..73ca2fa 100644 --- a/app/src/main/java/pub/devrel/easypermissions/sample/MainFragment.java +++ b/app/src/main/java/pub/devrel/easypermissions/sample/MainFragment.java @@ -16,7 +16,7 @@ import pub.devrel.easypermissions.EasyPermissions; /** - * Created in {@link R.layout#activity_main} + * Created in {@link R.layout#activity_main} */ public class MainFragment extends Fragment implements EasyPermissions.PermissionCallbacks { @@ -24,11 +24,13 @@ public class MainFragment extends Fragment implements EasyPermissions.Permission private static final int RC_SMS_PERM = 122; @Override - public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, + ViewGroup container, + Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); // Create view - View v = inflater.inflate(R.layout.fragment_main, container); + View v = inflater.inflate(R.layout.fragment_main, container); // Button click listener v.findViewById(R.id.button_sms).setOnClickListener(new View.OnClickListener() { @@ -42,7 +44,9 @@ public void onClick(View v) { } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + public void onRequestPermissionsResult(int requestCode, + @NonNull String[] permissions, + @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // EasyPermissions handles the request result. diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java index bf0117d..07f1888 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java @@ -90,41 +90,50 @@ public static boolean hasPermissions(@NonNull Context context, } /** - * Request permissions from an Activity with standard OK/Cancel buttons. + * Request a set of permissions, showing a rationale if the system requests it. * - * @see #requestPermissions(Activity, String, int, int, int, String...) + * @param host requesting context. + * @param rationale a message explaining why the application needs this set of permissions; + * will be displayed if the user rejects the request the first time. + * @param requestCode request code to track this request, must be < 256. + * @param perms a set of permissions to be requested. + * @see Manifest.permission */ public static void requestPermissions( @NonNull Activity host, @NonNull String rationale, int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions(host, rationale, android.R.string.ok, android.R.string.cancel, - requestCode, perms); + requestPermissions( + new PermissionRequest.Builder(host, requestCode, perms) + .setRationale(rationale) + .build()); } /** * Request permissions from a Support Fragment with standard OK/Cancel buttons. * - * @see #requestPermissions(Activity, String, int, int, int, String...) + * @see #requestPermissions(Activity, String, int, String...) */ public static void requestPermissions( @NonNull Fragment host, @NonNull String rationale, int requestCode, @Size(min = 1) @NonNull String... perms) { - - requestPermissions(host, rationale, android.R.string.ok, android.R.string.cancel, - requestCode, perms); + requestPermissions( + new PermissionRequest.Builder(host, requestCode, perms) + .setRationale(rationale) + .build()); } /** * Request permissions from a standard Fragment with standard OK/Cancel buttons. * - * @see #requestPermissions(Activity, String, int, int, int, String...) + * @see #requestPermissions(Activity, String, int, String...) */ public static void requestPermissions( @NonNull android.app.Fragment host, @NonNull String rationale, int requestCode, @Size(min = 1) @NonNull String... perms) { - - requestPermissions(host, rationale, android.R.string.ok, android.R.string.cancel, - requestCode, perms); + requestPermissions( + new PermissionRequest.Builder(host, requestCode, perms) + .setRationale(rationale) + .build()); } /** @@ -138,56 +147,80 @@ public static void requestPermissions( * @param requestCode request code to track this request, must be < 256. * @param perms a set of permissions to be requested. * @see Manifest.permission + * @deprecated use {@link #requestPermissions(PermissionRequest)} instead */ + @Deprecated public static void requestPermissions( @NonNull Activity host, @NonNull String rationale, @StringRes int positiveButton, @StringRes int negativeButton, int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions(PermissionHelper.newInstance(host), rationale, - positiveButton, negativeButton, - requestCode, perms); + requestPermissions( + new PermissionRequest.Builder(host, requestCode, perms) + .setRationale(rationale) + .setPositiveButtonText(positiveButton) + .setNegativeButtonText(negativeButton) + .build()); } /** * Request permissions from a Support Fragment. * * @see #requestPermissions(Activity, String, int, int, int, String...) + * @deprecated use {@link #requestPermissions(PermissionRequest)} instead */ + @Deprecated public static void requestPermissions( @NonNull Fragment host, @NonNull String rationale, @StringRes int positiveButton, @StringRes int negativeButton, int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions(PermissionHelper.newInstance(host), rationale, - positiveButton, negativeButton, - requestCode, perms); + requestPermissions( + new PermissionRequest.Builder(host, requestCode, perms) + .setRationale(rationale) + .setPositiveButtonText(positiveButton) + .setNegativeButtonText(negativeButton) + .build()); } /** * @see #requestPermissions(Activity, String, int, int, int, String...) + * @deprecated use {@link #requestPermissions(PermissionRequest)} instead */ + @Deprecated public static void requestPermissions( @NonNull android.app.Fragment host, @NonNull String rationale, @StringRes int positiveButton, @StringRes int negativeButton, int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions(PermissionHelper.newInstance(host), rationale, - positiveButton, negativeButton, - requestCode, perms); + requestPermissions( + new PermissionRequest.Builder(host, requestCode, perms) + .setRationale(rationale) + .setPositiveButtonText(positiveButton) + .setNegativeButtonText(negativeButton) + .build()); } - private static void requestPermissions( - @NonNull PermissionHelper helper, @NonNull String rationale, - @StringRes int positiveButton, @StringRes int negativeButton, - int requestCode, @Size(min = 1) @NonNull String... perms) { + /** + * Request a set of permissions. + * + * @param request the permission request + * @see PermissionRequest + */ + public static void requestPermissions(PermissionRequest request) { // Check for permissions before dispatching the request - if (hasPermissions(helper.getContext(), perms)) { - notifyAlreadyHasPermissions(helper.getHost(), requestCode, perms); + if (hasPermissions(request.getHelper().getContext(), request.getPerms())) { + notifyAlreadyHasPermissions( + request.getHelper().getHost(), request.getRequestCode(), request.getPerms()); return; } // Request permissions - helper.requestPermissions(rationale, positiveButton, - negativeButton, requestCode, perms); + request.getHelper().requestPermissions( + request.getRationale(), + request.getPositiveButtonText(), + request.getNegativeButtonText(), + request.getTheme(), + request.getRequestCode(), + request.getPerms()); } /** diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java new file mode 100644 index 0000000..a9e4b1a --- /dev/null +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java @@ -0,0 +1,270 @@ +package pub.devrel.easypermissions; + +import android.app.Activity; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.RestrictTo; +import android.support.annotation.Size; +import android.support.annotation.StringRes; +import android.support.annotation.StyleRes; +import android.support.v4.app.Fragment; + +import java.util.Arrays; + +import pub.devrel.easypermissions.helper.PermissionHelper; + +/** + * An immutable model object that holds all of the parameters associated with a permission request, + * such as the permissions, request code, and rationale. + * + * @see EasyPermissions#requestPermissions(PermissionRequest) + * @see PermissionRequest.Builder + */ +public final class PermissionRequest { + private final PermissionHelper mHelper; + private final String[] mPerms; + private final int mRequestCode; + private final String mRationale; + private final String mPositiveButtonText; + private final String mNegativeButtonText; + private final int mTheme; + + private PermissionRequest(PermissionHelper helper, + String[] perms, + int requestCode, + String rationale, + String positiveButtonText, + String negativeButtonText, + int theme) { + mHelper = helper; + mPerms = perms.clone(); + mRequestCode = requestCode; + mRationale = rationale; + mPositiveButtonText = positiveButtonText; + mNegativeButtonText = negativeButtonText; + mTheme = theme; + } + + @NonNull + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) + public PermissionHelper getHelper() { + return mHelper; + } + + @NonNull + public String[] getPerms() { + return mPerms.clone(); + } + + public int getRequestCode() { + return mRequestCode; + } + + @NonNull + public String getRationale() { + return mRationale; + } + + @NonNull + public String getPositiveButtonText() { + return mPositiveButtonText; + } + + @NonNull + public String getNegativeButtonText() { + return mNegativeButtonText; + } + + @StyleRes + public int getTheme() { + return mTheme; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + PermissionRequest request = (PermissionRequest) o; + + return Arrays.equals(mPerms, request.mPerms) && mRequestCode == request.mRequestCode; + } + + @Override + public int hashCode() { + int result = Arrays.hashCode(mPerms); + result = 31 * result + mRequestCode; + return result; + } + + @Override + public String toString() { + return "PermissionRequest{" + + "mHelper=" + mHelper + + ", mPerms=" + Arrays.toString(mPerms) + + ", mRequestCode=" + mRequestCode + + ", mRationale='" + mRationale + '\'' + + ", mPositiveButtonText='" + mPositiveButtonText + '\'' + + ", mNegativeButtonText='" + mNegativeButtonText + '\'' + + ", mTheme=" + mTheme + + '}'; + } + + /** + * Builder to build a permission request with variable options. + * + * @see PermissionRequest + */ + public static final class Builder { + private final PermissionHelper mHelper; + private final int mRequestCode; + private final String[] mPerms; + + private String mRationale; + private String mPositiveButtonText; + private String mNegativeButtonText; + private int mTheme = -1; + + /** + * Construct a new permission request builder with a host, request code, and the requested + * permissions. + * + * @param activity the permission request host + * @param requestCode request code to track this request; must be < 256 + * @param perms the set of permissions to be requested + */ + public Builder(@NonNull Activity activity, int requestCode, + @NonNull @Size(min = 1) String... perms) { + mHelper = PermissionHelper.newInstance(activity); + mRequestCode = requestCode; + mPerms = perms; + } + + /** + * @see #Builder(Activity, int, String...) + */ + public Builder(@NonNull Fragment fragment, int requestCode, + @NonNull @Size(min = 1) String... perms) { + mHelper = PermissionHelper.newInstance(fragment); + mRequestCode = requestCode; + mPerms = perms; + } + + /** + * @see #Builder(Activity, int, String...) + */ + public Builder(@NonNull android.app.Fragment fragment, int requestCode, + @NonNull @Size(min = 1) String... perms) { + mHelper = PermissionHelper.newInstance(fragment); + mRequestCode = requestCode; + mPerms = perms; + } + + /** + * Set the rationale to display to the user if they don't allow your permissions on the + * first try. This rationale will be shown as long as the user has denied your permissions + * at least once, but has not yet permanently denied your permissions. Should the user + * permanently deny your permissions, use the {@link AppSettingsDialog} instead. + *

+ * The default rationale text is {@link R.string#rationale_ask}. + * + * @param rationale the rationale to be displayed to the user should they deny your + * permission at least once + */ + @NonNull + public Builder setRationale(@Nullable String rationale) { + mRationale = rationale; + return this; + } + + /** + * @param resId the string resource to be used as a rationale + * @see #setRationale(String) + */ + @NonNull + public Builder setRationale(@StringRes int resId) { + mRationale = mHelper.getContext().getString(resId); + return this; + } + + /** + * Set the positive button text for the rationale dialog should it be shown. + *

+ * The default is {@link android.R.string#ok} + */ + @NonNull + public Builder setPositiveButtonText(@Nullable String positiveButtonText) { + mPositiveButtonText = positiveButtonText; + return this; + } + + /** + * @see #setPositiveButtonText(String) + */ + @NonNull + public Builder setPositiveButtonText(@StringRes int resId) { + mPositiveButtonText = mHelper.getContext().getString(resId); + return this; + } + + /** + * Set the negative button text for the rationale dialog should it be shown. + *

+ * The default is {@link android.R.string#cancel} + */ + @NonNull + public Builder setNegativeButtonText(@Nullable String negativeButtonText) { + mNegativeButtonText = negativeButtonText; + return this; + } + + /** + * @see #setNegativeButtonText(String) + */ + @NonNull + public Builder setNegativeButtonText(@StringRes int resId) { + mNegativeButtonText = mHelper.getContext().getString(resId); + return this; + } + + /** + * Set the theme to be used for the rationale dialog should it be shown. + * + * @param theme a style resource + */ + @NonNull + public Builder setTheme(@StyleRes int theme) { + mTheme = theme; + return this; + } + + /** + * Build the permission request. + * + * @return the permission request + * @see EasyPermissions#requestPermissions(PermissionRequest) + * @see PermissionRequest + */ + @NonNull + public PermissionRequest build() { + if (mRationale == null) { + mRationale = mHelper.getContext().getString(R.string.rationale_ask); + } + if (mPositiveButtonText == null) { + mPositiveButtonText = mHelper.getContext().getString(android.R.string.ok); + } + if (mNegativeButtonText == null) { + mNegativeButtonText = mHelper.getContext().getString(android.R.string.cancel); + } + + return new PermissionRequest( + mHelper, + mPerms, + mRequestCode, + mRationale, + mPositiveButtonText, + mNegativeButtonText, + mTheme); + } + } +} diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogConfig.java b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogConfig.java index 56022e3..b829e4a 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogConfig.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogConfig.java @@ -4,7 +4,7 @@ import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.annotation.StringRes; +import android.support.annotation.StyleRes; import android.support.v7.app.AlertDialog; /** @@ -15,39 +15,47 @@ class RationaleDialogConfig { private static final String KEY_POSITIVE_BUTTON = "positiveButton"; private static final String KEY_NEGATIVE_BUTTON = "negativeButton"; private static final String KEY_RATIONALE_MESSAGE = "rationaleMsg"; + private static final String KEY_THEME = "theme"; private static final String KEY_REQUEST_CODE = "requestCode"; private static final String KEY_PERMISSIONS = "permissions"; - int positiveButton; - int negativeButton; + String positiveButton; + String negativeButton; + int theme; int requestCode; String rationaleMsg; String[] permissions; - RationaleDialogConfig(@StringRes int positiveButton, @StringRes int negativeButton, - @NonNull String rationaleMsg, int requestCode, + RationaleDialogConfig(@NonNull String positiveButton, + @NonNull String negativeButton, + @NonNull String rationaleMsg, + @StyleRes int theme, + int requestCode, @NonNull String[] permissions) { this.positiveButton = positiveButton; this.negativeButton = negativeButton; this.rationaleMsg = rationaleMsg; + this.theme = theme; this.requestCode = requestCode; this.permissions = permissions; } RationaleDialogConfig(Bundle bundle) { - positiveButton = bundle.getInt(KEY_POSITIVE_BUTTON); - negativeButton = bundle.getInt(KEY_NEGATIVE_BUTTON); + positiveButton = bundle.getString(KEY_POSITIVE_BUTTON); + negativeButton = bundle.getString(KEY_NEGATIVE_BUTTON); rationaleMsg = bundle.getString(KEY_RATIONALE_MESSAGE); + theme = bundle.getInt(KEY_THEME); requestCode = bundle.getInt(KEY_REQUEST_CODE); permissions = bundle.getStringArray(KEY_PERMISSIONS); } Bundle toBundle() { Bundle bundle = new Bundle(); - bundle.putInt(KEY_POSITIVE_BUTTON, positiveButton); - bundle.putInt(KEY_NEGATIVE_BUTTON, negativeButton); + bundle.putString(KEY_POSITIVE_BUTTON, positiveButton); + bundle.putString(KEY_NEGATIVE_BUTTON, negativeButton); bundle.putString(KEY_RATIONALE_MESSAGE, rationaleMsg); + bundle.putInt(KEY_THEME, theme); bundle.putInt(KEY_REQUEST_CODE, requestCode); bundle.putStringArray(KEY_PERMISSIONS, permissions); @@ -55,7 +63,13 @@ Bundle toBundle() { } AlertDialog createSupportDialog(Context context, Dialog.OnClickListener listener) { - return new AlertDialog.Builder(context) + AlertDialog.Builder builder; + if (theme > 0) { + builder = new AlertDialog.Builder(context, theme); + } else { + builder = new AlertDialog.Builder(context); + } + return builder .setCancelable(false) .setPositiveButton(positiveButton, listener) .setNegativeButton(negativeButton, listener) @@ -64,7 +78,13 @@ AlertDialog createSupportDialog(Context context, Dialog.OnClickListener listener } android.app.AlertDialog createFrameworkDialog(Context context, Dialog.OnClickListener listener) { - return new android.app.AlertDialog.Builder(context) + android.app.AlertDialog.Builder builder; + if (theme > 0) { + builder = new android.app.AlertDialog.Builder(context, theme); + } else { + builder = new android.app.AlertDialog.Builder(context); + } + return builder .setCancelable(false) .setPositiveButton(positiveButton, listener) .setNegativeButton(negativeButton, listener) diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragment.java b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragment.java index 9cb55e0..9718a74 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragment.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragment.java @@ -8,7 +8,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.RestrictTo; -import android.support.annotation.StringRes; +import android.support.annotation.StyleRes; /** * {@link DialogFragment} to display rationale for permission requests when the request comes from @@ -23,15 +23,19 @@ public class RationaleDialogFragment extends DialogFragment { private boolean mStateSaved = false; public static RationaleDialogFragment newInstance( - @StringRes int positiveButton, @StringRes int negativeButton, - @NonNull String rationaleMsg, int requestCode, @NonNull String[] permissions) { + @NonNull String positiveButton, + @NonNull String negativeButton, + @NonNull String rationaleMsg, + @StyleRes int theme, + int requestCode, + @NonNull String[] permissions) { // Create new Fragment RationaleDialogFragment dialogFragment = new RationaleDialogFragment(); // Initialize configuration as arguments RationaleDialogConfig config = new RationaleDialogConfig( - positiveButton, negativeButton, rationaleMsg, requestCode, permissions); + positiveButton, negativeButton, rationaleMsg, theme, requestCode, permissions); dialogFragment.setArguments(config.toBundle()); return dialogFragment; diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragmentCompat.java b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragmentCompat.java index c292872..bd80199 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragmentCompat.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragmentCompat.java @@ -5,7 +5,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.RestrictTo; -import android.support.annotation.StringRes; +import android.support.annotation.StyleRes; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatDialogFragment; @@ -21,15 +21,19 @@ public class RationaleDialogFragmentCompat extends AppCompatDialogFragment { private EasyPermissions.PermissionCallbacks mPermissionCallbacks; public static RationaleDialogFragmentCompat newInstance( - @StringRes int positiveButton, @StringRes int negativeButton, - @NonNull String rationaleMsg, int requestCode, @NonNull String[] permissions) { + @NonNull String rationaleMsg, + @NonNull String positiveButton, + @NonNull String negativeButton, + @StyleRes int theme, + int requestCode, + @NonNull String[] permissions) { // Create new Fragment RationaleDialogFragmentCompat dialogFragment = new RationaleDialogFragmentCompat(); // Initialize configuration as arguments RationaleDialogConfig config = new RationaleDialogConfig( - positiveButton, negativeButton, rationaleMsg, requestCode, permissions); + positiveButton, negativeButton, rationaleMsg, theme, requestCode, permissions); dialogFragment.setArguments(config.toBundle()); return dialogFragment; diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java index fc88966..8e88a73 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java @@ -2,6 +2,7 @@ import android.app.FragmentManager; import android.support.annotation.NonNull; +import android.support.annotation.StyleRes; import pub.devrel.easypermissions.RationaleDialogFragment; @@ -18,12 +19,13 @@ public BaseFrameworkPermissionsHelper(@NonNull T host) { @Override public void showRequestPermissionRationale(@NonNull String rationale, - int positiveButton, - int negativeButton, + @NonNull String positiveButton, + @NonNull String negativeButton, + @StyleRes int theme, int requestCode, @NonNull String... perms) { RationaleDialogFragment - .newInstance(positiveButton, negativeButton, rationale, requestCode, perms) + .newInstance(positiveButton, negativeButton, rationale, theme, requestCode, perms) .showAllowingStateLoss(getFragmentManager(), RationaleDialogFragment.TAG); } } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseSupportPermissionsHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseSupportPermissionsHelper.java index fe3e407..11952e1 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseSupportPermissionsHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseSupportPermissionsHelper.java @@ -1,6 +1,7 @@ package pub.devrel.easypermissions.helper; import android.support.annotation.NonNull; +import android.support.annotation.StyleRes; import android.support.v4.app.FragmentManager; import pub.devrel.easypermissions.RationaleDialogFragmentCompat; @@ -18,12 +19,13 @@ public BaseSupportPermissionsHelper(@NonNull T host) { @Override public void showRequestPermissionRationale(@NonNull String rationale, - int positiveButton, - int negativeButton, + @NonNull String positiveButton, + @NonNull String negativeButton, + @StyleRes int theme, int requestCode, @NonNull String... perms) { RationaleDialogFragmentCompat - .newInstance(positiveButton, negativeButton, rationale, requestCode, perms) + .newInstance(rationale, positiveButton, negativeButton, theme, requestCode, perms) .showAllowingStateLoss(getSupportFragmentManager(), RationaleDialogFragmentCompat.TAG); } } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/LowApiPermissionsHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/LowApiPermissionsHelper.java index 2f2f4c0..92a93b5 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/LowApiPermissionsHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/LowApiPermissionsHelper.java @@ -1,14 +1,16 @@ package pub.devrel.easypermissions.helper; +import android.app.Activity; import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.StyleRes; +import android.support.v4.app.Fragment; /** * Permissions helper for apps built against API < 23, which do not need runtime permissions. */ -class LowApiPermissionsHelper extends PermissionHelper { - - public LowApiPermissionsHelper(@NonNull Object host) { +class LowApiPermissionsHelper extends PermissionHelper { + public LowApiPermissionsHelper(@NonNull T host) { super(host); } @@ -24,8 +26,9 @@ public boolean shouldShowRequestPermissionRationale(@NonNull String perm) { @Override public void showRequestPermissionRationale(@NonNull String rationale, - int positiveButton, - int negativeButton, + @NonNull String positiveButton, + @NonNull String negativeButton, + @StyleRes int theme, int requestCode, @NonNull String... perms) { throw new IllegalStateException("Should never be requesting permissions on API < 23!"); @@ -33,6 +36,14 @@ public void showRequestPermissionRationale(@NonNull String rationale, @Override public Context getContext() { - return null; + if (getHost() instanceof Activity) { + return (Context) getHost(); + } else if (getHost() instanceof Fragment) { + return ((Fragment) getHost()).getContext(); + } else if (getHost() instanceof android.app.Fragment) { + return ((Fragment) getHost()).getContext(); + } else { + throw new IllegalStateException("Unknown host: " + getHost()); + } } } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java index 29da05e..e278120 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java @@ -4,8 +4,7 @@ import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; -import android.support.annotation.RestrictTo; -import android.support.annotation.StringRes; +import android.support.annotation.StyleRes; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; @@ -14,39 +13,36 @@ /** * Delegate class to make permission calls based on the 'host' (Fragment, Activity, etc). */ -@RestrictTo(RestrictTo.Scope.LIBRARY) public abstract class PermissionHelper { - private static final String TAG = "PermissionHelper"; - private T mHost; @NonNull - public static PermissionHelper newInstance(Activity host) { + public static PermissionHelper newInstance(Activity host) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return new LowApiPermissionsHelper(host); + return new LowApiPermissionsHelper<>(host); } - if (host instanceof AppCompatActivity) { + if (host instanceof AppCompatActivity) return new AppCompatActivityPermissionHelper((AppCompatActivity) host); - } else { + else { return new ActivityPermissionHelper(host); } } @NonNull - public static PermissionHelper newInstance(Fragment host) { + public static PermissionHelper newInstance(Fragment host) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return new LowApiPermissionsHelper(host); + return new LowApiPermissionsHelper<>(host); } return new SupportFragmentPermissionHelper(host); } @NonNull - public static PermissionHelper newInstance(android.app.Fragment host) { + public static PermissionHelper newInstance(android.app.Fragment host) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return new LowApiPermissionsHelper(host); + return new LowApiPermissionsHelper<>(host); } return new FrameworkFragmentPermissionHelper(host); @@ -60,7 +56,7 @@ public PermissionHelper(@NonNull T host) { mHost = host; } - public boolean shouldShowRationale(@NonNull String... perms) { + private boolean shouldShowRationale(@NonNull String... perms) { for (String perm : perms) { if (shouldShowRequestPermissionRationale(perm)) { return true; @@ -70,13 +66,14 @@ public boolean shouldShowRationale(@NonNull String... perms) { } public void requestPermissions(@NonNull String rationale, - @StringRes int positiveButton, - @StringRes int negativeButton, + @NonNull String positiveButton, + @NonNull String negativeButton, + @StyleRes int theme, int requestCode, @NonNull String... perms) { if (shouldShowRationale(perms)) { showRequestPermissionRationale( - rationale, positiveButton, negativeButton, requestCode, perms); + rationale, positiveButton, negativeButton, theme, requestCode, perms); } else { directRequestPermissions(requestCode, perms); } @@ -114,10 +111,12 @@ public T getHost() { public abstract boolean shouldShowRequestPermissionRationale(@NonNull String perm); public abstract void showRequestPermissionRationale(@NonNull String rationale, - @StringRes int positiveButton, - @StringRes int negativeButton, + @NonNull String positiveButton, + @NonNull String negativeButton, + @StyleRes int theme, int requestCode, @NonNull String... perms); + public abstract Context getContext(); } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/package-info.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/package-info.java new file mode 100644 index 0000000..c745cb1 --- /dev/null +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/package-info.java @@ -0,0 +1,4 @@ +@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) +package pub.devrel.easypermissions.helper; + +import android.support.annotation.RestrictTo; diff --git a/easypermissions/src/main/res/values/strings.xml b/easypermissions/src/main/res/values/strings.xml index a290fd7..2ceab86 100644 --- a/easypermissions/src/main/res/values/strings.xml +++ b/easypermissions/src/main/res/values/strings.xml @@ -1,4 +1,8 @@ - This app may not work correctly without the requested permissions. Open the app settings screen to modify app permissions. + This app may not work correctly without the requested permissions. + + This app may not work correctly without the requested permissions. + Open the app settings screen to modify app permissions. + Permissions Required