Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
Expand All @@ -38,6 +39,7 @@ import com.simprints.feature.externalcredential.screens.scanocr.usecase.ProvideC
import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential
import com.simprints.infra.logging.LoggingConstants.CrashReportTag.MULTI_FACTOR_ID
import com.simprints.infra.logging.Simber
import com.simprints.infra.uibase.camera.qrscan.CameraFocusManager
import com.simprints.infra.uibase.navigation.navigateSafely
import com.simprints.infra.uibase.view.applySystemBarInsets
import com.simprints.infra.uibase.view.fadeIn
Expand Down Expand Up @@ -97,6 +99,9 @@ internal class ExternalCredentialScanOcrFragment : Fragment(R.layout.fragment_ex
@Inject
lateinit var provideCameraListenerUseCase: ProvideCameraListenerUseCase

@Inject
lateinit var cameraFocusManagerFactory: CameraFocusManager.Factory

@Inject
@DispatcherBG
lateinit var bgDispatcher: CoroutineDispatcher
Expand All @@ -114,7 +119,10 @@ internal class ExternalCredentialScanOcrFragment : Fragment(R.layout.fragment_ex
super.onResume()
val currentPermission = requireActivity().getCurrentPermissionStatus(CAMERA)
when (currentPermission) {
PermissionStatus.Granted -> initializeFragment()
Comment thread
alexandr-simprints marked this conversation as resolved.
PermissionStatus.Granted -> {
initializeFragment()
}

PermissionStatus.Denied -> {
// Permission dialog was already displayed, and user denied permissions. Showing rationale so to avoid constantly-appearing
// system dialog.
Expand Down Expand Up @@ -167,8 +175,13 @@ internal class ExternalCredentialScanOcrFragment : Fragment(R.layout.fragment_ex
}
}

ScanOcrState.NotScanning -> renderInitialState()
ScanOcrState.Complete -> animateCompletionState()
ScanOcrState.NotScanning -> {
renderInitialState()
}

ScanOcrState.Complete -> {
animateCompletionState()
}
}
}

Expand Down Expand Up @@ -198,6 +211,13 @@ internal class ExternalCredentialScanOcrFragment : Fragment(R.layout.fragment_ex
onImageCaptureReady = { capture ->
imageCapture = capture
},
onCameraReady = { camera ->
if (lifecycle.currentState == Lifecycle.State.RESUMED) {
val cameraFocusManager = cameraFocusManagerFactory.create(MULTI_FACTOR_ID)
cameraFocusManager.setUpFocusOnTap(binding.preview, camera)
cameraFocusManager.setUpAutoFocus(binding.preview, camera)
}
},
Comment thread
alexandr-simprints marked this conversation as resolved.
)
cameraProviderFuture.addListener(cameraListener, ContextCompat.getMainExecutor(requireContext()))
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.simprints.feature.externalcredential.screens.scanocr.usecase

import androidx.camera.core.AspectRatio
import androidx.camera.core.Camera
import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCapture
Expand All @@ -21,6 +22,7 @@ internal class ProvideCameraListenerUseCase @Inject constructor() {
viewLifecycleOwner: LifecycleOwner,
onImageAnalysisReady: (ImageAnalysis) -> Unit,
onImageCaptureReady: (ImageCapture) -> Unit,
onCameraReady: (Camera) -> Unit,
) = Runnable {
val cameraProvider = cameraProviderFuture.get()
val aspectRatio = AspectRatio.RATIO_16_9
Expand Down Expand Up @@ -48,9 +50,10 @@ internal class ProvideCameraListenerUseCase @Inject constructor() {

try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(viewLifecycleOwner, cameraSelector, preview, imageCapture, imageAnalysis)
val camera = cameraProvider.bindToLifecycle(viewLifecycleOwner, cameraSelector, preview, imageCapture, imageAnalysis)
onImageAnalysisReady(imageAnalysis)
onImageCaptureReady(imageCapture)
onCameraReady(camera)
} catch (e: Exception) {
Simber.e("Camera binding failed in OCR", e, MULTI_FACTOR_ID)
}
Expand Down