|
7 | 7 | import android.provider.Settings;
|
8 | 8 | import android.support.annotation.StringRes;
|
9 | 9 | import android.support.v4.content.ContextCompat;
|
10 |
| - |
11 | 10 | import com.karumi.dexter.Dexter;
|
12 | 11 | import com.karumi.dexter.PermissionToken;
|
13 | 12 | import com.karumi.dexter.listener.PermissionDeniedResponse;
|
14 | 13 | import com.karumi.dexter.listener.PermissionGrantedResponse;
|
15 | 14 | import com.karumi.dexter.listener.PermissionRequest;
|
16 | 15 | import com.karumi.dexter.listener.single.BasePermissionListener;
|
17 |
| - |
18 | 16 | import fr.free.nrw.commons.CommonsApplication;
|
19 | 17 | import fr.free.nrw.commons.R;
|
20 | 18 |
|
@@ -102,4 +100,60 @@ public void onPermissionRationaleShouldBeShown(PermissionRequest permission, Per
|
102 | 100 | }
|
103 | 101 | }).check();
|
104 | 102 | }
|
| 103 | + |
| 104 | + /** |
| 105 | + * Checks for a particular permission and runs the corresponding runnables to perform an action when the permission is granted/denied |
| 106 | + * Also, it shows a rationale if needed |
| 107 | + * |
| 108 | + * Sample usage: |
| 109 | + * |
| 110 | + * PermissionUtils.checkPermissionsAndPerformAction(activity, |
| 111 | + * Manifest.permission.WRITE_EXTERNAL_STORAGE, |
| 112 | + * () -> initiateCameraUpload(activity), |
| 113 | + * () -> showMessage(), |
| 114 | + * R.string.storage_permission_title, |
| 115 | + * R.string.write_storage_permission_rationale); |
| 116 | + * |
| 117 | + * |
| 118 | + * @param activity activity requesting permissions |
| 119 | + * @param permission the permission being requests |
| 120 | + * @param onPermissionGranted the runnable to be executed when the permission is granted |
| 121 | + * @param onPermissionDenied the runnable to be executed when the permission is denied(but not permanently) |
| 122 | + * @param rationaleTitle rationale title to be displayed when permission was denied |
| 123 | + * @param rationaleMessage rationale message to be displayed when permission was denied |
| 124 | + */ |
| 125 | + |
| 126 | + public static void checkPermissionsAndPerformAction(Activity activity, String permission, |
| 127 | + Runnable onPermissionGranted, Runnable onPermissionDenied, @StringRes int rationaleTitle, |
| 128 | + @StringRes int rationaleMessage) { |
| 129 | + Dexter.withActivity(activity) |
| 130 | + .withPermission(permission) |
| 131 | + .withListener(new BasePermissionListener() { |
| 132 | + @Override public void onPermissionGranted(PermissionGrantedResponse response) { |
| 133 | + onPermissionGranted.run(); |
| 134 | + } |
| 135 | + |
| 136 | + @Override public void onPermissionDenied(PermissionDeniedResponse response) { |
| 137 | + if (response.isPermanentlyDenied()) { |
| 138 | + DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle), |
| 139 | + activity.getString(rationaleMessage), |
| 140 | + activity.getString(R.string.navigation_item_settings), null, |
| 141 | + () -> askUserToManuallyEnablePermissionFromSettings(activity), null); |
| 142 | + } else { |
| 143 | + onPermissionDenied.run(); |
| 144 | + } |
| 145 | + } |
| 146 | + |
| 147 | + @Override |
| 148 | + public void onPermissionRationaleShouldBeShown(PermissionRequest permission, |
| 149 | + PermissionToken token) { |
| 150 | + DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle), |
| 151 | + activity.getString(rationaleMessage), |
| 152 | + activity.getString(android.R.string.ok), |
| 153 | + activity.getString(android.R.string.cancel), |
| 154 | + token::continuePermissionRequest, token::cancelPermissionRequest); |
| 155 | + } |
| 156 | + }) |
| 157 | + .check(); |
| 158 | + } |
105 | 159 | }
|
0 commit comments