From 23d7019b97f44d43c359e721ed196a877c494506 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 2 Dec 2017 15:45:53 -0800 Subject: [PATCH 1/7] Add new builder API and support customizing rationale dialog theme Signed-off-by: Alex Saveau --- .../easypermissions/sample/MainActivity.java | 17 +- .../easypermissions/sample/MainFragment.java | 19 +- .../easypermissions/EasyPermissions.java | 70 ++++-- .../easypermissions/PermissionRequest.java | 199 ++++++++++++++++++ .../RationaleDialogConfig.java | 42 +++- .../RationaleDialogFragment.java | 12 +- .../RationaleDialogFragmentCompat.java | 12 +- .../BaseFrameworkPermissionsHelper.java | 8 +- .../helper/BaseSupportPermissionsHelper.java | 8 +- .../helper/LowApiPermissionsHelper.java | 23 +- .../helper/PermissionHelper.java | 41 ++-- .../easypermissions/helper/package-info.java | 4 + .../src/main/res/values/strings.xml | 6 +- 13 files changed, 372 insertions(+), 89 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/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java b/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java index 94eaf9d..39abb8d 100644 --- a/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java +++ b/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java @@ -29,6 +29,7 @@ import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.AppSettingsDialog; import pub.devrel.easypermissions.EasyPermissions; +import pub.devrel.easypermissions.PermissionRequest; public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { @@ -81,10 +82,9 @@ public void cameraTask() { } else { // Ask for one permission EasyPermissions.requestPermissions( - this, - getString(R.string.rationale_camera), - RC_CAMERA_PERM, - Manifest.permission.CAMERA); + new PermissionRequest.Builder(this, RC_CAMERA_PERM, Manifest.permission.CAMERA) + .setRationale(getString(R.string.rationale_camera)) + .build()); } } @@ -96,10 +96,11 @@ public void locationAndContactsTask() { } else { // Ask for both permissions EasyPermissions.requestPermissions( - this, - getString(R.string.rationale_location_contacts), - RC_LOCATION_CONTACTS_PERM, - LOCATION_AND_CONTACTS); + new PermissionRequest.Builder(this, + RC_LOCATION_CONTACTS_PERM, + LOCATION_AND_CONTACTS) + .setRationale(getString(R.string.rationale_location_contacts)) + .build()); } } 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..01899c9 100644 --- a/app/src/main/java/pub/devrel/easypermissions/sample/MainFragment.java +++ b/app/src/main/java/pub/devrel/easypermissions/sample/MainFragment.java @@ -14,9 +14,10 @@ import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.EasyPermissions; +import pub.devrel.easypermissions.PermissionRequest; /** - * Created in {@link R.layout#activity_main} + * Created in {@link R.layout#activity_main} */ public class MainFragment extends Fragment implements EasyPermissions.PermissionCallbacks { @@ -24,11 +25,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 +45,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. @@ -56,8 +61,10 @@ private void smsTask() { Toast.makeText(getActivity(), "TODO: SMS things", Toast.LENGTH_LONG).show(); } else { // Request one permission - EasyPermissions.requestPermissions(this, getString(R.string.rationale_sms), - RC_SMS_PERM, Manifest.permission.READ_SMS); + EasyPermissions.requestPermissions( + new PermissionRequest.Builder(this, RC_SMS_PERM, Manifest.permission.READ_SMS) + .setRationale(getString(R.string.rationale_sms)) + .build()); } } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java index bf0117d..25178d8 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java @@ -94,11 +94,14 @@ public static boolean hasPermissions(@NonNull Context context, * * @see #requestPermissions(Activity, String, int, int, int, String...) */ + @Deprecated 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()); } /** @@ -106,12 +109,15 @@ public static void requestPermissions( * * @see #requestPermissions(Activity, String, int, int, int, String...) */ + @Deprecated 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()); } /** @@ -119,12 +125,15 @@ public static void requestPermissions( * * @see #requestPermissions(Activity, String, int, int, int, String...) */ + @Deprecated 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()); } /** @@ -139,13 +148,17 @@ public static void requestPermissions( * @param perms a set of permissions to be requested. * @see Manifest.permission */ + @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()); } /** @@ -153,41 +166,52 @@ public static void requestPermissions( * * @see #requestPermissions(Activity, String, int, int, int, String...) */ + @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 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) { + 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..3e56426 --- /dev/null +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java @@ -0,0 +1,199 @@ +package pub.devrel.easypermissions; + +import android.app.Activity; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +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; + +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; + mRequestCode = requestCode; + mRationale = rationale; + mPositiveButtonText = positiveButtonText; + mNegativeButtonText = negativeButtonText; + mTheme = theme; + } + + @NonNull + public PermissionHelper getHelper() { + return mHelper; + } + + @NonNull + public String[] getPerms() { + return mPerms; + } + + 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 + + '}'; + } + + 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; + + public Builder(@NonNull Activity activity, int requestCode, + @NonNull @Size(min = 1) String... perms) { + mHelper = PermissionHelper.newInstance(activity); + mRequestCode = requestCode; + mPerms = perms; + } + + public Builder(@NonNull Fragment fragment, int requestCode, + @NonNull @Size(min = 1) String... perms) { + mHelper = PermissionHelper.newInstance(fragment); + mRequestCode = requestCode; + mPerms = perms; + } + + public Builder(@NonNull android.app.Fragment fragment, int requestCode, + @NonNull @Size(min = 1) String... perms) { + mHelper = PermissionHelper.newInstance(fragment); + mRequestCode = requestCode; + mPerms = perms; + } + + @NonNull + public Builder setRationale(@Nullable String rationale) { + mRationale = rationale; + return this; + } + + @NonNull + public Builder setRationale(@StringRes int resId) { + mRationale = mHelper.getContext().getString(resId); + return this; + } + + @NonNull + public Builder setPositiveButtonText(@Nullable String positiveButtonText) { + mPositiveButtonText = positiveButtonText; + return this; + } + + @NonNull + public Builder setPositiveButtonText(@StringRes int resId) { + mPositiveButtonText = mHelper.getContext().getString(resId); + return this; + } + + @NonNull + public Builder setNegativeButtonText(@Nullable String negativeButtonText) { + mNegativeButtonText = negativeButtonText; + return this; + } + + @NonNull + public Builder setNegativeButtonText(@StringRes int resId) { + mNegativeButtonText = mHelper.getContext().getString(resId); + return this; + } + + @NonNull + public Builder setTheme(@StyleRes int theme) { + mTheme = theme; + return this; + } + + @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..c52ac7e 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,38 @@ /** * 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) { - return new AppCompatActivityPermissionHelper((AppCompatActivity) host); - } else { + if (host instanceof AppCompatActivity) + //noinspection unchecked Hmmm... not sure what's going on here + return (PermissionHelper) (Object) + new AppCompatActivityPermissionHelper((AppCompatActivity) host); + 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 +58,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 +68,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 +113,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 From 23952823584cf7d76e69cb0d1644c0e9dbdde7fd Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 5 Dec 2017 13:38:16 -0800 Subject: [PATCH 2/7] Add documentation Signed-off-by: Alex Saveau --- .../easypermissions/sample/MainActivity.java | 17 ++-- .../easypermissions/sample/MainFragment.java | 7 +- .../easypermissions/EasyPermissions.java | 27 ++++-- .../easypermissions/PermissionRequest.java | 86 +++++++++++++++++-- 4 files changed, 106 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java b/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java index 39abb8d..94eaf9d 100644 --- a/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java +++ b/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java @@ -29,7 +29,6 @@ import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.AppSettingsDialog; import pub.devrel.easypermissions.EasyPermissions; -import pub.devrel.easypermissions.PermissionRequest; public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { @@ -82,9 +81,10 @@ public void cameraTask() { } else { // Ask for one permission EasyPermissions.requestPermissions( - new PermissionRequest.Builder(this, RC_CAMERA_PERM, Manifest.permission.CAMERA) - .setRationale(getString(R.string.rationale_camera)) - .build()); + this, + getString(R.string.rationale_camera), + RC_CAMERA_PERM, + Manifest.permission.CAMERA); } } @@ -96,11 +96,10 @@ public void locationAndContactsTask() { } else { // Ask for both permissions EasyPermissions.requestPermissions( - new PermissionRequest.Builder(this, - RC_LOCATION_CONTACTS_PERM, - LOCATION_AND_CONTACTS) - .setRationale(getString(R.string.rationale_location_contacts)) - .build()); + this, + getString(R.string.rationale_location_contacts), + RC_LOCATION_CONTACTS_PERM, + LOCATION_AND_CONTACTS); } } 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 01899c9..73ca2fa 100644 --- a/app/src/main/java/pub/devrel/easypermissions/sample/MainFragment.java +++ b/app/src/main/java/pub/devrel/easypermissions/sample/MainFragment.java @@ -14,7 +14,6 @@ import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.EasyPermissions; -import pub.devrel.easypermissions.PermissionRequest; /** * Created in {@link R.layout#activity_main} @@ -61,10 +60,8 @@ private void smsTask() { Toast.makeText(getActivity(), "TODO: SMS things", Toast.LENGTH_LONG).show(); } else { // Request one permission - EasyPermissions.requestPermissions( - new PermissionRequest.Builder(this, RC_SMS_PERM, Manifest.permission.READ_SMS) - .setRationale(getString(R.string.rationale_sms)) - .build()); + EasyPermissions.requestPermissions(this, getString(R.string.rationale_sms), + RC_SMS_PERM, Manifest.permission.READ_SMS); } } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java index 25178d8..07f1888 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java @@ -90,11 +90,15 @@ 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 */ - @Deprecated public static void requestPermissions( @NonNull Activity host, @NonNull String rationale, int requestCode, @Size(min = 1) @NonNull String... perms) { @@ -107,13 +111,11 @@ public static void requestPermissions( /** * 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...) */ - @Deprecated public static void requestPermissions( @NonNull Fragment host, @NonNull String rationale, int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions( new PermissionRequest.Builder(host, requestCode, perms) .setRationale(rationale) @@ -123,13 +125,11 @@ public static void requestPermissions( /** * 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...) */ - @Deprecated public static void requestPermissions( @NonNull android.app.Fragment host, @NonNull String rationale, int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions( new PermissionRequest.Builder(host, requestCode, perms) .setRationale(rationale) @@ -147,6 +147,7 @@ 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( @@ -165,6 +166,7 @@ public static void requestPermissions( * 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( @@ -181,6 +183,7 @@ public static void requestPermissions( /** * @see #requestPermissions(Activity, String, int, int, int, String...) + * @deprecated use {@link #requestPermissions(PermissionRequest)} instead */ @Deprecated public static void requestPermissions( @@ -195,6 +198,12 @@ public static void requestPermissions( .build()); } + /** + * 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 diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java index 3e56426..67206fb 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java @@ -3,6 +3,7 @@ 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; @@ -12,6 +13,12 @@ import pub.devrel.easypermissions.helper.PermissionHelper; +/** + * An immutable model represent a permission request. + * + * @see EasyPermissions#requestPermissions(PermissionRequest) + * @see PermissionRequest.Builder + */ public final class PermissionRequest { private final PermissionHelper mHelper; private final String[] mPerms; @@ -22,14 +29,14 @@ public final class PermissionRequest { private final int mTheme; private PermissionRequest(PermissionHelper helper, - String[] perms, - int requestCode, - String rationale, - String positiveButtonText, - String negativeButtonText, - int theme) { + String[] perms, + int requestCode, + String rationale, + String positiveButtonText, + String negativeButtonText, + int theme) { mHelper = helper; - mPerms = perms; + mPerms = perms.clone(); mRequestCode = requestCode; mRationale = rationale; mPositiveButtonText = positiveButtonText; @@ -38,13 +45,14 @@ private PermissionRequest(PermissionHelper helper, } @NonNull + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public PermissionHelper getHelper() { return mHelper; } @NonNull public String[] getPerms() { - return mPerms; + return mPerms.clone(); } public int getRequestCode() { @@ -101,6 +109,11 @@ public String toString() { '}'; } + /** + * Builder to build a permission request with variable options. + * + * @see PermissionRequest + */ public static final class Builder { private final PermissionHelper mHelper; private final int mRequestCode; @@ -111,6 +124,14 @@ public static final class Builder { 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); @@ -118,6 +139,9 @@ public Builder(@NonNull Activity activity, int 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); @@ -125,6 +149,9 @@ public Builder(@NonNull Fragment fragment, int 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); @@ -132,48 +159,91 @@ public Builder(@NonNull android.app.Fragment fragment, int 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 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 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 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) { From 0c182eced7716508132cbca90050cc4660bf564d Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 5 Dec 2017 13:48:06 -0800 Subject: [PATCH 3/7] Cleanup Signed-off-by: Alex Saveau --- .../pub/devrel/easypermissions/PermissionRequest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java index 67206fb..51c84c9 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java @@ -14,7 +14,7 @@ import pub.devrel.easypermissions.helper.PermissionHelper; /** - * An immutable model represent a permission request. + * An immutable model representing a permission request. * * @see EasyPermissions#requestPermissions(PermissionRequest) * @see PermissionRequest.Builder @@ -165,7 +165,7 @@ public Builder(@NonNull android.app.Fragment fragment, int requestCode, * 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 is {@link R.string#rationale_ask}. + * 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 @@ -187,7 +187,7 @@ public Builder setRationale(@StringRes int resId) { } /** - * Set the positive button for the rationale dialog should it be shown. + * Set the positive button text for the rationale dialog should it be shown. *

* The default is {@link android.R.string#ok} */ @@ -207,7 +207,7 @@ public Builder setPositiveButtonText(@StringRes int resId) { } /** - * Set the negative button for the rationale dialog should it be shown. + * Set the negative button text for the rationale dialog should it be shown. *

* The default is {@link android.R.string#cancel} */ From 6a1dafce2e9942f05c2d1cae8d2f4df469743e0a Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 5 Dec 2017 14:28:33 -0800 Subject: [PATCH 4/7] Clarify PermissionRequest docs Signed-off-by: Alex Saveau --- .../java/pub/devrel/easypermissions/PermissionRequest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java index 51c84c9..a9e4b1a 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java @@ -14,7 +14,8 @@ import pub.devrel.easypermissions.helper.PermissionHelper; /** - * An immutable model representing a permission request. + * 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 From 5cf11c3528892942520b91cb57736e51e837bb1b Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 5 Dec 2017 15:15:35 -0800 Subject: [PATCH 5/7] Fix type invariance Signed-off-by: Alex Saveau --- .../pub/devrel/easypermissions/helper/PermissionHelper.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 c52ac7e..e278120 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java @@ -18,15 +18,13 @@ public abstract class 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); } if (host instanceof AppCompatActivity) - //noinspection unchecked Hmmm... not sure what's going on here - return (PermissionHelper) (Object) - new AppCompatActivityPermissionHelper((AppCompatActivity) host); + return new AppCompatActivityPermissionHelper((AppCompatActivity) host); else { return new ActivityPermissionHelper(host); } From 5de5e18b9ec913fad5b13c994d0e1be5d4641266 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 5 Dec 2017 15:31:52 -0800 Subject: [PATCH 6/7] Add README example Signed-off-by: Alex Saveau --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index c957fda..e678b95 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,14 @@ private void methodRequiresTwoPermission() { // Do not have permissions, request them now EasyPermissions.requestPermissions(this, getString(R.string.camera_and_location_rationale), RC_CAMERA_AND_LOCATION, perms); + // OR for finer control over the rationale dialog + 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()); } } ``` From c704289258fa6869bc205dafea8cc8c8aed3f1e8 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 5 Dec 2017 17:24:42 -0800 Subject: [PATCH 7/7] Fix README Signed-off-by: Alex Saveau --- README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e678b95..f23c85c 100644 --- a/README.md +++ b/README.md @@ -66,18 +66,22 @@ private void methodRequiresTwoPermission() { // Do not have permissions, request them now EasyPermissions.requestPermissions(this, getString(R.string.camera_and_location_rationale), RC_CAMERA_AND_LOCATION, perms); - // OR for finer control over the rationale dialog - 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()); } } ``` +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.