From 07545e46d0119038c2c6bd19e287fd6562446001 Mon Sep 17 00:00:00 2001 From: Melad Raouf Date: Thu, 28 Nov 2024 10:16:35 +0200 Subject: [PATCH] [MS-831] Ensure audio alerts play immediately --- .../ObserveFingerprintScanStatusUseCase.kt | 58 +++++++------------ .../FingerprintScanningStatusTracker.kt | 6 +- 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCase.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCase.kt index 3708b57fba..11431d1fcb 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCase.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/ObserveFingerprintScanStatusUseCase.kt @@ -14,10 +14,6 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.filterNot -import kotlinx.coroutines.flow.flatMapConcat -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Singleton @@ -31,7 +27,6 @@ class ObserveFingerprintScanStatusUseCase @Inject constructor( @ApplicationContext private val context: Context, ) { private var observeJob: Job? = null - private var previousState: FingerprintScanState = FingerprintScanState.Idle private var ledsMode: Vero2Configuration.LedsMode? = BASIC private val preference = PreferenceManager.getDefaultSharedPreferences(context) @@ -43,32 +38,23 @@ class ObserveFingerprintScanStatusUseCase @Inject constructor( ledsMode = configManager.getProjectConfiguration().fingerprint?.getSdkConfiguration( fingerprintSdk )?.vero2?.ledsMode - - statusTracker.state - .onEach { state -> - if (state is FingerprintScanState.ScanCompleted) { - provideFeedback(state)// Handle ScanCompleted immediately to let the user know to remove the finger - } - } - .filterNot { it is FingerprintScanState.ScanCompleted } // Exclude ScanCompleted - .flatMapConcat { state -> - flow { emit(provideFeedback(state)) } // Process other states sequentially - } - .collect { - // Do nothing + launch { + statusTracker.scanCompleted.collect { + playRemoveFingerAudio() } + } + statusTracker.state.collect { + provideFeedback(it) + } } } - private suspend fun provideFeedback(state: FingerprintScanState) { - when (state) { - is FingerprintScanState.Idle -> turnOnFlashingWhiteSmileLeds() - is FingerprintScanState.Scanning -> turnOffSmileLeds() - is FingerprintScanState.ScanCompleted -> playRemoveFingerAudio() - is FingerprintScanState.ImageQualityChecking.Good -> setUiAfterScan(true) - is FingerprintScanState.ImageQualityChecking.Bad -> setUiAfterScan(false) - } - previousState = state + private suspend fun provideFeedback(state: FingerprintScanState) = when (state) { + is FingerprintScanState.Idle -> turnOnFlashingWhiteSmileLeds() + is FingerprintScanState.Scanning -> turnOffSmileLeds() + is FingerprintScanState.ScanCompleted -> playRemoveFingerAudio() + is FingerprintScanState.ImageQualityChecking.Good -> setUiAfterScan(true) + is FingerprintScanState.ImageQualityChecking.Bad -> setUiAfterScan(false) } fun stopObserving() { @@ -90,23 +76,19 @@ class ObserveFingerprintScanStatusUseCase @Inject constructor( } private suspend fun setUiAfterScan(isGoodScan: Boolean) { - // Check if the previous state was ScanCompleted to avoid displaying the bad or good scan UI twice // There's no need to check the configuration, as the good/bad scan visual notifications apply across all LED modes. - if (previousState == FingerprintScanState.ScanCompleted) { - with(scannerManager.scanner) { - if (isGoodScan) setUiGoodCapture() - else setUiBadCapture() + with(scannerManager.scanner) { + if (isGoodScan) setUiGoodCapture() + else setUiBadCapture() - //Wait before turn of the leds - delay(LONG_DELAY) - turnOffSmileLeds() - } + //Wait before turn of the leds + delay(LONG_DELAY) + turnOffSmileLeds() } + } private fun playRemoveFingerAudio() { - // Verify that the previous state was not "ScanCompleted" to prevent the sound from playing twice. - if (previousState == FingerprintScanState.ScanCompleted) return if (isAudioEnabled()) playAudioBeep() } diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintScanningStatusTracker.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintScanningStatusTracker.kt index 542916b72e..c18fc11edc 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintScanningStatusTracker.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintScanningStatusTracker.kt @@ -4,7 +4,6 @@ import com.simprints.core.DispatcherBG import com.simprints.fingerprint.infra.scanner.capture.FingerprintScanState.Idle import com.simprints.fingerprint.infra.scanner.capture.FingerprintScanState.ImageQualityChecking.Bad import com.simprints.fingerprint.infra.scanner.capture.FingerprintScanState.ImageQualityChecking.Good -import com.simprints.fingerprint.infra.scanner.capture.FingerprintScanState.ScanCompleted import com.simprints.fingerprint.infra.scanner.capture.FingerprintScanState.Scanning import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope @@ -24,9 +23,12 @@ class FingerprintScanningStatusTracker @Inject constructor( MutableSharedFlow(replay = 1, extraBufferCapacity = 1) val state: SharedFlow = _state + private val _scanCompleted = MutableSharedFlow(replay = 0) + val scanCompleted: SharedFlow = _scanCompleted + fun startScanning() = emitState(Scanning) - fun completeScan() = emitState(ScanCompleted) + suspend fun completeScan() = _scanCompleted.emit(Unit) fun setImageQualityCheckingResult(isQualityOk: Boolean) = emitState(if (isQualityOk) Good else Bad)