Fix crash when opening in-app Camera for the very first time (#6139)

* fix: correctly handle permission callbacks on Main thread

The PermissionUtils was incorrectly executing permission callbacks on a background thread, leading to a Handler error. Now, it is using Main dispatcher.

* fix crash when opening camera while having partial storage access
This commit is contained in:
Rohit Verma 2025-01-17 12:07:07 +05:30 committed by GitHub
parent 2d6583fea6
commit 9f1fe8737f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -16,6 +16,9 @@ import com.karumi.dexter.listener.PermissionRequest
import com.karumi.dexter.listener.multi.MultiplePermissionsListener import com.karumi.dexter.listener.multi.MultiplePermissionsListener
import fr.free.nrw.commons.R import fr.free.nrw.commons.R
import fr.free.nrw.commons.upload.UploadActivity import fr.free.nrw.commons.upload.UploadActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
object PermissionUtils { object PermissionUtils {
@ -130,7 +133,7 @@ object PermissionUtils {
vararg permissions: String vararg permissions: String
) { ) {
if (hasPartialAccess(activity)) { if (hasPartialAccess(activity)) {
Thread(onPermissionGranted).start() CoroutineScope(Dispatchers.Main).launch { onPermissionGranted.run() }
return return
} }
checkPermissionsAndPerformAction( checkPermissionsAndPerformAction(
@ -166,13 +169,15 @@ object PermissionUtils {
rationaleMessage: Int, rationaleMessage: Int,
vararg permissions: String vararg permissions: String
) { ) {
val scope = CoroutineScope(Dispatchers.Main)
Dexter.withActivity(activity) Dexter.withActivity(activity)
.withPermissions(*permissions) .withPermissions(*permissions)
.withListener(object : MultiplePermissionsListener { .withListener(object : MultiplePermissionsListener {
override fun onPermissionsChecked(report: MultiplePermissionsReport) { override fun onPermissionsChecked(report: MultiplePermissionsReport) {
when { when {
report.areAllPermissionsGranted() || hasPartialAccess(activity) -> report.areAllPermissionsGranted() || hasPartialAccess(activity) ->
Thread(onPermissionGranted).start() scope.launch { onPermissionGranted.run() }
report.isAnyPermissionPermanentlyDenied -> { report.isAnyPermissionPermanentlyDenied -> {
DialogUtil.showAlertDialog( DialogUtil.showAlertDialog(
activity, activity,
@ -189,7 +194,7 @@ object PermissionUtils {
null, null null, null
) )
} }
else -> Thread(onPermissionDenied).start() else -> scope.launch { onPermissionDenied?.run() }
} }
} }