diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrFragment.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrFragment.kt index 13996eebb8..53715ebb6d 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrFragment.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/scanqr/ExternalCredentialScanQrFragment.kt @@ -87,15 +87,23 @@ internal class ExternalCredentialScanQrFragment : Fragment(R.layout.fragment_ext } } + override fun onPause() { + if (isCameraInitialized) { + cameraHelper.stopCamera() + isCameraInitialized = false + } + super.onPause() + } + override fun onResume() { super.onResume() val cameraPermissionStatus = requireActivity().getCurrentPermissionStatus(CAMERA) viewModel.updateCameraPermissionStatus(cameraPermissionStatus) } - override fun onDestroy() { + override fun onDestroyView() { dismissDialog() - super.onDestroy() + super.onDestroyView() } private fun dismissDialog() { diff --git a/feature/external-credential/src/main/res/layout/fragment_external_credential_scan_qr.xml b/feature/external-credential/src/main/res/layout/fragment_external_credential_scan_qr.xml index a6ec010214..0d29c28226 100644 --- a/feature/external-credential/src/main/res/layout/fragment_external_credential_scan_qr.xml +++ b/feature/external-credential/src/main/res/layout/fragment_external_credential_scan_qr.xml @@ -65,6 +65,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" + android:ellipsize="end" + android:maxLines="3" tools:text="QR_CODE" /> diff --git a/infra/ui-base/src/main/java/com/simprints/infra/uibase/camera/qrscan/CameraHelper.kt b/infra/ui-base/src/main/java/com/simprints/infra/uibase/camera/qrscan/CameraHelper.kt index aeedfb8e94..7192207ad1 100644 --- a/infra/ui-base/src/main/java/com/simprints/infra/uibase/camera/qrscan/CameraHelper.kt +++ b/infra/ui-base/src/main/java/com/simprints/infra/uibase/camera/qrscan/CameraHelper.kt @@ -28,6 +28,7 @@ class CameraHelper @AssistedInject constructor( private val cameraFocusManagerFactory: CameraFocusManager.Factory, ) { private val cameraFocusManager by lazy { cameraFocusManagerFactory.create(crashReportTag) } + private var cameraProvider: ProcessCameraProvider? = null @AssistedFactory interface Factory { @@ -43,9 +44,13 @@ class CameraHelper @AssistedInject constructor( val providerFuture = ProcessCameraProvider.getInstance(context) providerFuture.addListener( { - val cameraProvider = providerFuture.get() + val provider = providerFuture.get().also { provider -> + cameraProvider = provider + provider.unbindAll() + } + // Check if the back camera is available - if (cameraProvider.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA).not()) { + if (provider.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA).not()) { initializationErrorListener.onCameraError() return@addListener } @@ -54,7 +59,7 @@ class CameraHelper @AssistedInject constructor( val preview = buildPreview(cameraPreview) try { - cameraProvider + provider .bindToLifecycle( lifecycleOwner, cameraSelector, @@ -75,6 +80,11 @@ class CameraHelper @AssistedInject constructor( ) } + fun stopCamera() { + cameraProvider?.unbindAll() + cameraProvider = null + } + private fun buildAnalyser(qrAnalyser: QrCodeAnalyzer) = ImageAnalysis .Builder() .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)