From 3ac56576717828e19e0b06a0b5abc53014ac9038 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Nicolas <6371790+pynicolas@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:37:12 +0200 Subject: [PATCH] Make image capture happen on separate thread executor --- .../main/java/org/mydomain/myscan/view/Camera.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mydomain/myscan/view/Camera.kt b/app/src/main/java/org/mydomain/myscan/view/Camera.kt index 9364d40..68836af 100644 --- a/app/src/main/java/org/mydomain/myscan/view/Camera.kt +++ b/app/src/main/java/org/mydomain/myscan/view/Camera.kt @@ -75,6 +75,9 @@ fun CameraScreen( } val captureController = remember { CameraCaptureController() } + DisposableEffect(Unit) { + onDispose { captureController.shutdown() } + } LaunchedEffect(Unit) { val camera = android.Manifest.permission.CAMERA @@ -100,7 +103,6 @@ fun CameraScreen( Button( onClick = { captureController.takePicture( - context = context, onImageCaptured = { imageProxy -> if (imageProxy != null) { viewModel.processCapturedImageAndNavigate(imageProxy) @@ -235,11 +237,15 @@ fun Point.toOffset() = Offset(x.toFloat(), y.toFloat()) class CameraCaptureController { var imageCapture: ImageCapture? = null + private val executor = Executors.newSingleThreadExecutor() - fun takePicture(context: Context, onImageCaptured: (ImageProxy?) -> Unit) { + fun shutdown() { + executor.shutdown() + } + + fun takePicture(onImageCaptured: (ImageProxy?) -> Unit) { imageCapture?.takePicture( - // TODO is it a good idea to use this executor? - ContextCompat.getMainExecutor(context), + executor, object : ImageCapture.OnImageCapturedCallback() { override fun onCaptureSuccess(imageProxy: ImageProxy) { onImageCaptured(imageProxy)