From e39f9bc25100a258b3bee0234af1f9e6056fdb7e Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Wed, 3 Aug 2022 10:47:51 +0300 Subject: [PATCH] QRCodeScanner will close camera on back press (#872) --- .../app/views/newchat/QRCodeScanner.kt | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/newchat/QRCodeScanner.kt b/apps/android/app/src/main/java/chat/simplex/app/views/newchat/QRCodeScanner.kt index 5d594b98b3..e0ee944195 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/newchat/QRCodeScanner.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/newchat/QRCodeScanner.kt @@ -30,6 +30,16 @@ fun QRCodeScanner(onBarcode: (String) -> Unit) { var lastAnalyzedTimeStamp = 0L var contactLink = "" + val cameraProviderFuture by produceState?>(initialValue = null) { + value = ProcessCameraProvider.getInstance(context) + } + + DisposableEffect(lifecycleOwner) { + onDispose { + cameraProviderFuture?.get()?.unbindAll() + } + } + AndroidView( factory = { AndroidViewContext -> PreviewView(AndroidViewContext).apply { @@ -46,14 +56,10 @@ fun QRCodeScanner(onBarcode: (String) -> Unit) { .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() val cameraExecutor: ExecutorService = Executors.newSingleThreadExecutor() - val cameraProviderFuture: ListenableFuture = - ProcessCameraProvider.getInstance(context) - - cameraProviderFuture.addListener({ + cameraProviderFuture?.addListener({ preview = Preview.Builder().build().also { it.setSurfaceProvider(previewView.surfaceProvider) } - val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() val detector: QrCodeDetector = FactoryFiducial.qrcode(null, GrayU8::class.java) fun getQR(imageProxy: ImageProxy) { val currentTimeStamp = System.currentTimeMillis() @@ -78,8 +84,8 @@ fun QRCodeScanner(onBarcode: (String) -> Unit) { .build() .also { it.setAnalyzer(cameraExecutor, imageAnalyzer) } try { - cameraProvider.unbindAll() - cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalysis) + cameraProviderFuture?.get()?.unbindAll() + cameraProviderFuture?.get()?.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalysis) } catch (e: Exception) { Log.d(TAG, "CameraPreview: ${e.localizedMessage}") }