Fixes #2888: Use Dexter for requesting location permissions (#2925)

* Use dexter to ask for location permissions

* Addressed code review comments
This commit is contained in:
Vivek Maskara 2019-06-08 11:15:30 +05:30 committed by neslihanturan
parent 6f9d69e63c
commit 8971743479
6 changed files with 95 additions and 375 deletions

View file

@ -5,17 +5,17 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.BasePermissionListener;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
@ -27,7 +27,7 @@ public class PermissionUtils {
It open the app settings from where the user can manually give us the required permission.
* @param activity
*/
public static void askUserToManuallyEnablePermissionFromSettings(Activity activity) {
private static void askUserToManuallyEnablePermissionFromSettings(Activity activity) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
@ -50,6 +50,9 @@ public class PermissionUtils {
* Checks for a particular permission and runs the runnable to perform an action when the permission is granted
* Also, it shows a rationale if needed
*
* rationaleTitle and rationaleMessage can be invalid @StringRes. If the value is -1 then no permission rationale
* will be displayed and permission would be requested
*
* Sample usage:
*
* PermissionUtils.checkPermissionsAndPerformAction(activity,
@ -58,12 +61,20 @@ public class PermissionUtils {
* R.string.storage_permission_title,
* R.string.write_storage_permission_rationale);
*
* If you don't want the permission rationale to be shown then use:
*
* PermissionUtils.checkPermissionsAndPerformAction(activity,
* Manifest.permission.WRITE_EXTERNAL_STORAGE,
* () -> initiateCameraUpload(activity),
* - 1, -1);
*
*
*
* @param activity activity requesting permissions
* @param permission the permission being requests
* @param onPermissionGranted the runnable to be executed when the permission is granted
* @param rationaleTitle rationale title to be displayed when permission was denied
* @param rationaleMessage rationale message to be displayed when permission was denied
* @param rationaleTitle rationale title to be displayed when permission was denied. It can be an invalid @StringRes
* @param rationaleMessage rationale message to be displayed when permission was denied. It can be an invalid @StringRes
*/
public static void checkPermissionsAndPerformAction(Activity activity, String permission,
Runnable onPermissionGranted, @StringRes int rationaleTitle,
@ -93,7 +104,6 @@ public class PermissionUtils {
* @param rationaleTitle rationale title to be displayed when permission was denied
* @param rationaleMessage rationale message to be displayed when permission was denied
*/
public static void checkPermissionsAndPerformAction(Activity activity, String permission,
Runnable onPermissionGranted, Runnable onPermissionDenied, @StringRes int rationaleTitle,
@StringRes int rationaleMessage) {
@ -120,6 +130,10 @@ public class PermissionUtils {
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission,
PermissionToken token) {
if (rationaleTitle == -1 && rationaleMessage == -1) {
token.continuePermissionRequest();
return;
}
DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle),
activity.getString(rationaleMessage),
activity.getString(android.R.string.ok),
@ -129,4 +143,5 @@ public class PermissionUtils {
})
.check();
}
}