easypermissions-ktx
easypermissions-ktx copied to clipboard
onRationaleAccepted and onRationaleDenied implemented in Fragment are not called
Basic Information
Device type: Emulator (Pixel4 API 29) OS version: Android 10 EasyPermissions version: 1.0.0
Question
When I was implementing the EasyPermissions feature in Fragment, I noticed that these callback functions were not being called, even though I implements EasyPermissions.RationaleCallbacks.
I investigated in the debugger and found the following
Execute EasyPermissions.requestPermissions, passing MainFragment as the host.
PermissionRequest.Builder(host.context) is called. host.context = MainActivity
MainActivity does not implement EasyPermissions.RationaleCallbacks, so onRationaleAccepted and onRationaleDenied will not be called.
Is this the correct behavior? Should EasyPermissions.RationaleCallbacks be implemented only in Activity?
Code
The source code has been uploaded to github. https://github.com/Nunocky/EasyPermissionsStudy
class MainFragment : Fragment(), EasyPermissions.PermissionCallbacks,
EasyPermissions.RationaleCallbacks {
private val requiredPermissions = listOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
)
...
override fun onResume() {
super.onResume()
checkPermissions()
}
private fun checkPermissions() {
if (!EasyPermissions.hasPermissions(
requireContext(),
*(requiredPermissions.toTypedArray())
)
) {
// Do not have permissions, request them now
EasyPermissions.requestPermissions(
host = this,
rationale = "permissions required",
requestCode = REQUEST_PERMISSIONS,
perms = requiredPermissions.toTypedArray()
)
}
}
...
// TODO : not called?
override fun onRationaleAccepted(requestCode: Int) {
toast("onRationaleAccepted")
}
// TODO : not called?
override fun onRationaleDenied(requestCode: Int) {
toast("onRationaleDenied")
}
}
Basic Information
Device type: Emulator (Pixel3a API 31) OS version: Android 12 EasyPermissions master branch sample.
Question
I have try easypermissions-ktx's sample project.
When denied SMS
(which request permissions from MainFragment.kt
), and then allowed it again, MainFragment.kt :: onPermissionGranted was not called. (MainActivity.kt :: onPermissionGranted was called. )
When pass through the rationale dialog, onPermissionGranted
in the fragment is not called ?
(Immediately allows the same permission from fragment, then onPermissionGranted
in Fragment was called.)
https://user-images.githubusercontent.com/45166/146365323-6dacd90e-56e1-4c6b-81ca-fd6a9c9e000c.mov
This casting context to Fragment doesn't seem to be succeeding.
https://github.com/vmadalin/easypermissions-ktx/blob/e2da43e9f1a5a3b68f7333b0a85a1b9f9232d7d8/easypermissions-ktx/src/main/java/com/vmadalin/easypermissions/dialogs/RationaleDialog.kt#L70-L73