-
-
Save GAM3RG33K/876551eb76f7082f8a8dcea45fff2bee to your computer and use it in GitHub Desktop.
Utility class for access to runtime permissions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Utility class for access to runtime permissions. | |
*/ | |
public abstract class PermissionUtils { | |
/** | |
* Requests the fine location permission. If a rationale with an additional explanation should | |
* be shown to the user, displays a dialog that triggers the request. | |
*/ | |
public static void requestPermission(AppCompatActivity activity, int requestId, | |
String permission, boolean finishActivity) { | |
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { | |
// Display a dialog with rationale. | |
PermissionUtils.RationaleDialog.newInstance(requestId, finishActivity) | |
.show(activity.getSupportFragmentManager(), "dialog"); | |
} else { | |
// Location permission has not been granted yet, request it. | |
ActivityCompat.requestPermissions(activity, new String[]{permission}, requestId); | |
} | |
} | |
/** | |
* Checks if the result contains a {@link PackageManager#PERMISSION_GRANTED} result for a | |
* permission from a runtime permissions request. | |
* | |
* @see android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback | |
*/ | |
public static boolean isPermissionGranted(String[] grantPermissions, int[] grantResults, | |
String permission) { | |
for (int i = 0; i < grantPermissions.length; i++) { | |
if (permission.equals(grantPermissions[i])) { | |
return grantResults[i] == PackageManager.PERMISSION_GRANTED; | |
} | |
} | |
return false; | |
} | |
/** | |
* A dialog that displays a permission denied message. | |
*/ | |
public static class PermissionDeniedDialog extends DialogFragment { | |
private static final String ARGUMENT_FINISH_ACTIVITY = "finish"; | |
private boolean mFinishActivity = false; | |
/** | |
* Creates a new instance of this dialog and optionally finishes the calling Activity | |
* when the 'Ok' button is clicked. | |
*/ | |
public static PermissionDeniedDialog newInstance(boolean finishActivity) { | |
Bundle arguments = new Bundle(); | |
arguments.putBoolean(ARGUMENT_FINISH_ACTIVITY, finishActivity); | |
PermissionDeniedDialog dialog = new PermissionDeniedDialog(); | |
dialog.setArguments(arguments); | |
return dialog; | |
} | |
@Override | |
public Dialog onCreateDialog(Bundle savedInstanceState) { | |
mFinishActivity = getArguments().getBoolean(ARGUMENT_FINISH_ACTIVITY); | |
return new AlertDialog.Builder(getActivity()) | |
.setMessage(R.string.location_permission_denied) | |
.setPositiveButton(android.R.string.ok, null) | |
.create(); | |
} | |
@Override | |
public void onDismiss(DialogInterface dialog) { | |
super.onDismiss(dialog); | |
if (mFinishActivity) { | |
Toast.makeText(getActivity(), R.string.permission_required_toast, | |
Toast.LENGTH_SHORT).show(); | |
getActivity().finish(); | |
} | |
} | |
} | |
/** | |
* A dialog that explains the use of the location permission and requests the necessary | |
* permission. | |
* <p> | |
* The activity should implement | |
* {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback} | |
* to handle permit or denial of this permission request. | |
*/ | |
public static class RationaleDialog extends DialogFragment { | |
private static final String ARGUMENT_PERMISSION_REQUEST_CODE = "requestCode"; | |
private static final String ARGUMENT_FINISH_ACTIVITY = "finish"; | |
private boolean mFinishActivity = false; | |
/** | |
* Creates a new instance of a dialog displaying the rationale for the use of the location | |
* permission. | |
* <p> | |
* The permission is requested after clicking 'ok'. | |
* | |
* @param requestCode Id of the request that is used to request the permission. It is | |
* returned to the | |
* {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}. | |
* @param finishActivity Whether the calling Activity should be finished if the dialog is | |
* cancelled. | |
*/ | |
public static RationaleDialog newInstance(int requestCode, boolean finishActivity) { | |
Bundle arguments = new Bundle(); | |
arguments.putInt(ARGUMENT_PERMISSION_REQUEST_CODE, requestCode); | |
arguments.putBoolean(ARGUMENT_FINISH_ACTIVITY, finishActivity); | |
RationaleDialog dialog = new RationaleDialog(); | |
dialog.setArguments(arguments); | |
return dialog; | |
} | |
@Override | |
public Dialog onCreateDialog(Bundle savedInstanceState) { | |
Bundle arguments = getArguments(); | |
final int requestCode = arguments.getInt(ARGUMENT_PERMISSION_REQUEST_CODE); | |
mFinishActivity = arguments.getBoolean(ARGUMENT_FINISH_ACTIVITY); | |
return new AlertDialog.Builder(getActivity()) | |
.setMessage(R.string.permission_rationale_location) | |
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { | |
@Override | |
public void onClick(DialogInterface dialog, int which) { | |
// After click on Ok, request the permission. | |
ActivityCompat.requestPermissions(getActivity(), | |
new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, | |
requestCode); | |
// Do not finish the Activity while requesting permission. | |
mFinishActivity = false; | |
} | |
}) | |
.setNegativeButton(android.R.string.cancel, null) | |
.create(); | |
} | |
@Override | |
public void onDismiss(DialogInterface dialog) { | |
super.onDismiss(dialog); | |
if (mFinishActivity) { | |
Toast.makeText(getActivity(), | |
R.string.permission_required_toast, | |
Toast.LENGTH_SHORT) | |
.show(); | |
getActivity().finish(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment