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

Commit 20987dc

Browse files
Ernest Saidu Kamarasamtstern
Ernest Saidu Kamara
authored andcommitted
Added RationaleDialogCallback (#208)
1 parent 813e744 commit 20987dc

File tree

7 files changed

+101
-21
lines changed

7 files changed

+101
-21
lines changed

README.md

+20
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,26 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
152152
}
153153
```
154154

155+
### Interacting with the rationale dialog
156+
157+
Implement the `EasyPermissions.RationaleCallbacks` if you want to interact with the rationale dialog.
158+
159+
```java
160+
@Override
161+
public void onRationaleAccepted(int requestCode) {
162+
// Rationale accpets to request some permissions
163+
// ...
164+
}
165+
166+
@Override
167+
public void onRationaleDenied(int requestCode) {
168+
// Rationale denied to request some permissions
169+
// ...
170+
}
171+
```
172+
173+
Rationale callbacks don't necessarily imply permission changes. To check for those, see the `EasyPermissions.RationaleCallbacks`.
174+
155175
## LICENSE
156176

157177
```

app/src/main/AndroidManifest.xml

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<uses-permission android:name="android.permission.READ_CONTACTS" />
1111

1212
<uses-permission android:name="android.permission.READ_SMS" />
13+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1314

1415
<application
1516
android:label="@string/app_name"

app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
import pub.devrel.easypermissions.AppSettingsDialog;
3131
import pub.devrel.easypermissions.EasyPermissions;
3232

33-
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
33+
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks,
34+
EasyPermissions.RationaleCallbacks{
3435

3536
private static final String TAG = "MainActivity";
3637
private static final String[] LOCATION_AND_CONTACTS =
@@ -73,6 +74,10 @@ private boolean hasSmsPermission() {
7374
return EasyPermissions.hasPermissions(this, Manifest.permission.READ_SMS);
7475
}
7576

77+
private boolean hasStoragePermission() {
78+
return EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
79+
}
80+
7681
@AfterPermissionGranted(RC_CAMERA_PERM)
7782
public void cameraTask() {
7883
if (hasCameraPermission()) {
@@ -148,4 +153,14 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
148153
.show();
149154
}
150155
}
156+
157+
@Override
158+
public void onRationaleAccepted(int requestCode) {
159+
Log.d(TAG, "onRationaleAccepted:" + requestCode);
160+
}
161+
162+
@Override
163+
public void onRationaleDenied(int requestCode) {
164+
Log.d(TAG, "onRationaleDenied:" + requestCode);
165+
}
151166
}

easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java

+10
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717

1818
import android.Manifest;
1919
import android.app.Activity;
20+
import android.app.Dialog;
2021
import android.content.Context;
22+
import android.content.DialogInterface;
2123
import android.content.pm.PackageManager;
2224
import android.os.Build;
2325
import android.support.annotation.NonNull;
@@ -49,7 +51,15 @@ public interface PermissionCallbacks extends ActivityCompat.OnRequestPermissions
4951
void onPermissionsGranted(int requestCode, @NonNull List<String> perms);
5052

5153
void onPermissionsDenied(int requestCode, @NonNull List<String> perms);
54+
}
55+
56+
/**
57+
* Callback interface to receive button clicked events of the rationale dialog
58+
*/
59+
public interface RationaleCallbacks {
60+
void onRationaleAccepted(int requestCode);
5261

62+
void onRationaleDenied(int requestCode);
5363
}
5464

5565
private static final String TAG = "EasyPermissions";

easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java

+20-10
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,27 @@ class RationaleDialogClickListener implements Dialog.OnClickListener {
1818
private Object mHost;
1919
private RationaleDialogConfig mConfig;
2020
private EasyPermissions.PermissionCallbacks mCallbacks;
21+
private EasyPermissions.RationaleCallbacks mRationaleCallbacks;
2122

2223
RationaleDialogClickListener(RationaleDialogFragmentCompat compatDialogFragment,
2324
RationaleDialogConfig config,
24-
EasyPermissions.PermissionCallbacks callbacks) {
25+
EasyPermissions.PermissionCallbacks callbacks,
26+
EasyPermissions.RationaleCallbacks rationaleCallbacks) {
2527

2628
mHost = compatDialogFragment.getParentFragment() != null
2729
? compatDialogFragment.getParentFragment()
2830
: compatDialogFragment.getActivity();
2931

3032
mConfig = config;
3133
mCallbacks = callbacks;
34+
mRationaleCallbacks = rationaleCallbacks;
35+
3236
}
3337

3438
RationaleDialogClickListener(RationaleDialogFragment dialogFragment,
3539
RationaleDialogConfig config,
36-
EasyPermissions.PermissionCallbacks callbacks) {
40+
EasyPermissions.PermissionCallbacks callbacks,
41+
EasyPermissions.RationaleCallbacks dialogCallback) {
3742

3843
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
3944
mHost = dialogFragment.getParentFragment() != null ?
@@ -45,32 +50,37 @@ class RationaleDialogClickListener implements Dialog.OnClickListener {
4550

4651
mConfig = config;
4752
mCallbacks = callbacks;
53+
mRationaleCallbacks = dialogCallback;
4854
}
4955

5056
@Override
5157
public void onClick(DialogInterface dialog, int which) {
58+
int requestCode = mConfig.requestCode;
5259
if (which == Dialog.BUTTON_POSITIVE) {
60+
String[] permissions = mConfig.permissions;
61+
if (mRationaleCallbacks != null) {
62+
mRationaleCallbacks.onRationaleAccepted(requestCode);
63+
}
5364
if (mHost instanceof Fragment) {
54-
PermissionHelper.newInstance((Fragment) mHost).directRequestPermissions(
55-
mConfig.requestCode, mConfig.permissions);
65+
PermissionHelper.newInstance((Fragment) mHost).directRequestPermissions(requestCode, permissions);
5666
} else if (mHost instanceof android.app.Fragment) {
57-
PermissionHelper.newInstance((android.app.Fragment) mHost).directRequestPermissions(
58-
mConfig.requestCode, mConfig.permissions);
67+
PermissionHelper.newInstance((android.app.Fragment) mHost).directRequestPermissions(requestCode, permissions);
5968
} else if (mHost instanceof Activity) {
60-
PermissionHelper.newInstance((Activity) mHost).directRequestPermissions(
61-
mConfig.requestCode, mConfig.permissions);
69+
PermissionHelper.newInstance((Activity) mHost).directRequestPermissions(requestCode, permissions);
6270
} else {
6371
throw new RuntimeException("Host must be an Activity or Fragment!");
6472
}
6573
} else {
74+
if (mRationaleCallbacks != null) {
75+
mRationaleCallbacks.onRationaleDenied(requestCode);
76+
}
6677
notifyPermissionDenied();
6778
}
6879
}
6980

7081
private void notifyPermissionDenied() {
7182
if (mCallbacks != null) {
72-
mCallbacks.onPermissionsDenied(mConfig.requestCode,
73-
Arrays.asList(mConfig.permissions));
83+
mCallbacks.onPermissionsDenied(mConfig.requestCode, Arrays.asList(mConfig.permissions));
7484
}
7585
}
7686
}

easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragment.java

+17-6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class RationaleDialogFragment extends DialogFragment {
2020
public static final String TAG = "RationaleDialogFragment";
2121

2222
private EasyPermissions.PermissionCallbacks mPermissionCallbacks;
23+
private EasyPermissions.RationaleCallbacks mRationaleCallbacks;
2324
private boolean mStateSaved = false;
2425

2526
public static RationaleDialogFragment newInstance(
@@ -44,13 +45,23 @@ public static RationaleDialogFragment newInstance(
4445
@Override
4546
public void onAttach(Context context) {
4647
super.onAttach(context);
47-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
48-
&& getParentFragment() != null
49-
&& getParentFragment() instanceof EasyPermissions.PermissionCallbacks) {
50-
mPermissionCallbacks = (EasyPermissions.PermissionCallbacks) getParentFragment();
51-
} else if (context instanceof EasyPermissions.PermissionCallbacks) {
48+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && getParentFragment() != null) {
49+
if (getParentFragment() instanceof EasyPermissions.PermissionCallbacks) {
50+
mPermissionCallbacks = (EasyPermissions.PermissionCallbacks) getParentFragment();
51+
}
52+
if (getParentFragment() instanceof EasyPermissions.RationaleCallbacks){
53+
mRationaleCallbacks = (EasyPermissions.RationaleCallbacks) getParentFragment();
54+
}
55+
56+
}
57+
58+
if (context instanceof EasyPermissions.PermissionCallbacks) {
5259
mPermissionCallbacks = (EasyPermissions.PermissionCallbacks) context;
5360
}
61+
62+
if (context instanceof EasyPermissions.RationaleCallbacks) {
63+
mRationaleCallbacks = (EasyPermissions.RationaleCallbacks) context;
64+
}
5465
}
5566

5667
@Override
@@ -93,7 +104,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
93104
// Get config from arguments, create click listener
94105
RationaleDialogConfig config = new RationaleDialogConfig(getArguments());
95106
RationaleDialogClickListener clickListener =
96-
new RationaleDialogClickListener(this, config, mPermissionCallbacks);
107+
new RationaleDialogClickListener(this, config, mPermissionCallbacks, mRationaleCallbacks);
97108

98109
// Create an AlertDialog
99110
return config.createFrameworkDialog(getActivity(), clickListener);

easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogFragmentCompat.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class RationaleDialogFragmentCompat extends AppCompatDialogFragment {
1919
public static final String TAG = "RationaleDialogFragmentCompat";
2020

2121
private EasyPermissions.PermissionCallbacks mPermissionCallbacks;
22+
private EasyPermissions.RationaleCallbacks mRationaleCallbacks;
2223

2324
public static RationaleDialogFragmentCompat newInstance(
2425
@NonNull String rationaleMsg,
@@ -54,17 +55,29 @@ public void showAllowingStateLoss(FragmentManager manager, String tag) {
5455
@Override
5556
public void onAttach(Context context) {
5657
super.onAttach(context);
57-
if (getParentFragment() != null && getParentFragment() instanceof EasyPermissions.PermissionCallbacks) {
58-
mPermissionCallbacks = (EasyPermissions.PermissionCallbacks) getParentFragment();
59-
} else if (context instanceof EasyPermissions.PermissionCallbacks) {
58+
if (getParentFragment() != null) {
59+
if (getParentFragment() instanceof EasyPermissions.PermissionCallbacks) {
60+
mPermissionCallbacks = (EasyPermissions.PermissionCallbacks) getParentFragment();
61+
}
62+
if (getParentFragment() instanceof EasyPermissions.RationaleCallbacks){
63+
mRationaleCallbacks = (EasyPermissions.RationaleCallbacks) getParentFragment();
64+
}
65+
}
66+
67+
if (context instanceof EasyPermissions.PermissionCallbacks) {
6068
mPermissionCallbacks = (EasyPermissions.PermissionCallbacks) context;
6169
}
70+
71+
if (context instanceof EasyPermissions.RationaleCallbacks) {
72+
mRationaleCallbacks = (EasyPermissions.RationaleCallbacks) context;
73+
}
6274
}
6375

6476
@Override
6577
public void onDetach() {
6678
super.onDetach();
6779
mPermissionCallbacks = null;
80+
mRationaleCallbacks = null;
6881
}
6982

7083
@NonNull
@@ -76,7 +89,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
7689
// Get config from arguments, create click listener
7790
RationaleDialogConfig config = new RationaleDialogConfig(getArguments());
7891
RationaleDialogClickListener clickListener =
79-
new RationaleDialogClickListener(this, config, mPermissionCallbacks);
92+
new RationaleDialogClickListener(this, config, mPermissionCallbacks, mRationaleCallbacks);
8093

8194
// Create an AlertDialog
8295
return config.createSupportDialog(getContext(), clickListener);

0 commit comments

Comments
 (0)