From 9f1fe8737f1a661d086707a55eb2270a54b2c0d8 Mon Sep 17 00:00:00 2001 From: Rohit Verma <101377978+rohit9625@users.noreply.github.com> Date: Fri, 17 Jan 2025 12:07:07 +0530 Subject: [PATCH] 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 --- .../java/fr/free/nrw/commons/utils/PermissionUtils.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.kt b/app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.kt index daf158fc13..df3b33bf6c 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.kt +++ b/app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.kt @@ -16,6 +16,9 @@ import com.karumi.dexter.listener.PermissionRequest import com.karumi.dexter.listener.multi.MultiplePermissionsListener import fr.free.nrw.commons.R import fr.free.nrw.commons.upload.UploadActivity +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch object PermissionUtils { @@ -130,7 +133,7 @@ object PermissionUtils { vararg permissions: String ) { if (hasPartialAccess(activity)) { - Thread(onPermissionGranted).start() + CoroutineScope(Dispatchers.Main).launch { onPermissionGranted.run() } return } checkPermissionsAndPerformAction( @@ -166,13 +169,15 @@ object PermissionUtils { rationaleMessage: Int, vararg permissions: String ) { + val scope = CoroutineScope(Dispatchers.Main) + Dexter.withActivity(activity) .withPermissions(*permissions) .withListener(object : MultiplePermissionsListener { override fun onPermissionsChecked(report: MultiplePermissionsReport) { when { report.areAllPermissionsGranted() || hasPartialAccess(activity) -> - Thread(onPermissionGranted).start() + scope.launch { onPermissionGranted.run() } report.isAnyPermissionPermanentlyDenied -> { DialogUtil.showAlertDialog( activity, @@ -189,7 +194,7 @@ object PermissionUtils { null, null ) } - else -> Thread(onPermissionDenied).start() + else -> scope.launch { onPermissionDenied?.run() } } }