One library to rule them all
Handling the permission requests in Android is not as straightforward as I thought it should be, especially for beginners. Thus, I decided to write a small library to help in managing them.
The library is very simple to use:
- choose a request code for each group of permissions you are going to ask altogether, and define an array containing those permissions (for example, if the application has a button enabling Bluetooth, and a view showing the user location on a map, you would create a
BLUETOOTH_REQUEST_CODE = 1and aLOCATION_REQUEST_CODE = 2, and define two arraysBLUETOOTH_PERMISSIONS = arrayOf(...), andLOCATION_PERMISSIONS = arrayOf(...)) - create in the
Activitythat you want to request the permissions aPermissionManager
private val permissionsManager = PermissionManager(this)
- Using the provided DSL, build an appropriate dispatcher
- where you want to check or grant the permissions, call the manager’s
checkRequestAndDispatchmethod
permissionManager.checkRequestAndDispatch(BLUETOOTH_REQUEST_CODE)
- override the Activity’s
onRequestPermissionsResultand add to it the line
permissionManager.dispatchOnRequestPermissionsResult(requestCode, grantResults)
- enjoy!
The Dispatcher’s DSL
The DSL to build the dispatcher has a few functions that helps to create the dispatcher in a human-readable way. The following is an example:
permissionManager.buildRequestResultsDispatcher {
withRequestCode(BLUETOOTH_REQUEST_CODE) {
checkPermissions(BLUETOOTH_PERMISSIONS)
doOnGranted {
Log.d(TAG, "Bluetooth permission granted")
// something ...
}
doOnDenied {
Log.d(TAG, "Bluetooth permission denied")
// something else ...
}
}
withRequestCode(LOCATION_REQUEST_CODE) {
checkPermissions(LOCATION_PERMISSIONS)
doOnGranted {
Log.d(TAG, "Location permission granted")
// something ...
}
doOnDenied {
Log.d(TAG, "Location permission denied")
// something else ...
}
}
}
Inside buildRequestResultsDispatcher, you can define as many as you want withRequestCode(requestCode) blocks, each containing the permissions to check (checkPermissions) and the behavior to dispatch in case all the permissions are granted (doOnGranted), or some were not (doOnDenied).
The checkRequestAndDispatch Method
This method does two things:
- it checks if the permissions were already granted, and if so it dispatches the same action associated in the dispatcher to the
doOnGrantedfor the given request code - otherwise, it asks for the permissions that are not granted; and it would be the overridden
onRequestPermissionsResultto dispatch the appropriate action after the permission request.
How To Use The Library
The library is deployed on Jitpack, and you can easily add it to your project by adding to your settings.gradle:
dependencyResolutionManagement {
...
repositories {
...
maven { url 'https://jitpack.io' }
}
}
And to your module level build.gradle:
dependencies {
...
implementation 'com.github.lorenzofelletti:permissions:0.4.2'
}
The showRationaleDialog Function
It is recommended that you also manage the shouldShowRequestPermissionRationale, so since version 0.3.0 it is possible to do it. Two DSL functions are defined to do this:
-
rationale— suitable for the cases when you need the maximum configurability, but you should manage “manually” some things, such as callingpermissionManager.checkRequestAndDispatchagain if needed with thecomingFromRationaleflag set totrue -
showRationaleDialog— suitable in all the cases when what you want is to show a dialog with a message. In that case, everything is already set up to function properly, you don’t have to do anything but choosing the message.
An example of the latter is:
permissionManager.buildRequestResultsDispatcher {
withRequestCode(LOCATION_REQUEST_CODE) {
checkPermissions(LOCATION_PERMISSIONS)
showRationaleDialog("Location permissions are needed for this feature.")
doOnGranted {
// something ...
}
doOnDenied {
// something else ...
}
}
}
The library is still very young and new features may be added in the future, as well as the existing features may be modified.
Please let me know your opinion on this simple library and if you want any feature added to it.
Cover image by Mark König on Unsplash
Top comments (0)