From bee8bb6cca85a42f03b121a0ca65861bc1587098 Mon Sep 17 00:00:00 2001 From: tjroach Date: Fri, 6 Dec 2024 10:42:39 -0500 Subject: [PATCH] Detect failed camera opening. Automatically kill session if no camera frames detected after 5 seconds --- .../ui/liveness/camera/LivenessCoordinator.kt | 11 +++++++++++ .../ui/liveness/camera/PreviewTextureView.kt | 7 ++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/liveness/src/main/java/com/amplifyframework/ui/liveness/camera/LivenessCoordinator.kt b/liveness/src/main/java/com/amplifyframework/ui/liveness/camera/LivenessCoordinator.kt index 30e2938e..05c72c17 100644 --- a/liveness/src/main/java/com/amplifyframework/ui/liveness/camera/LivenessCoordinator.kt +++ b/liveness/src/main/java/com/amplifyframework/ui/liveness/camera/LivenessCoordinator.kt @@ -50,6 +50,7 @@ import java.util.concurrent.Executors import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.MainScope +import kotlinx.coroutines.delay import kotlinx.coroutines.launch internal typealias OnMuxedSegment = (bytes: ByteArray, timestamp: Long) -> Unit @@ -137,6 +138,16 @@ internal class LivenessCoordinator( private var disconnectEventReceived = false init { + MainScope().launch { + delay(5_000) + if (!previewTextureView.hasReceivedUpdate) { + val faceLivenessException = FaceLivenessDetectionException( + "The camera failed to open within the allowed time limit.", + "Ensure the camera is available to use and that no other apps are using it." + ) + processSessionError(faceLivenessException, true) + } + } MainScope().launch { getCameraProvider(context).apply { if (lifecycleOwner.lifecycle.currentState != Lifecycle.State.DESTROYED) { diff --git a/liveness/src/main/java/com/amplifyframework/ui/liveness/camera/PreviewTextureView.kt b/liveness/src/main/java/com/amplifyframework/ui/liveness/camera/PreviewTextureView.kt index fc036ab0..06fc06e9 100644 --- a/liveness/src/main/java/com/amplifyframework/ui/liveness/camera/PreviewTextureView.kt +++ b/liveness/src/main/java/com/amplifyframework/ui/liveness/camera/PreviewTextureView.kt @@ -31,6 +31,7 @@ internal class PreviewTextureView( ) : TextureView(context) { private var surface: Surface? = null + internal var hasReceivedUpdate = false init { surfaceTextureListener = object : SurfaceTextureListener { @@ -48,7 +49,11 @@ internal class PreviewTextureView( } } - override fun onSurfaceTextureUpdated(surfaceTexture: SurfaceTexture) {} + override fun onSurfaceTextureUpdated(surfaceTexture: SurfaceTexture) { + if (!hasReceivedUpdate) { + hasReceivedUpdate = true + } + } override fun onSurfaceTextureSizeChanged( surfaceTexture: SurfaceTexture,