diff --git a/feature/dashboard/src/main/res/values/ids.xml b/feature/dashboard/src/main/res/values/ids.xml
index 6ab8e37fb3..cca9a92677 100644
--- a/feature/dashboard/src/main/res/values/ids.xml
+++ b/feature/dashboard/src/main/res/values/ids.xml
@@ -11,6 +11,7 @@
select_fingers_preference_key
sync_info_preference_key
preference_update_config_key
+ preference_enable_audio_on_scan_complete_key
app_details_key
app_details_preference_key
diff --git a/feature/dashboard/src/main/res/xml/preference_general.xml b/feature/dashboard/src/main/res/xml/preference_general.xml
index e4d4e6c5d1..20906d3c0c 100644
--- a/feature/dashboard/src/main/res/xml/preference_general.xml
+++ b/feature/dashboard/src/main/res/xml/preference_general.xml
@@ -23,6 +23,12 @@
android:key="@string/preference_update_config_key"
android:summary="@string/dashboard_preference_summary_update_config"
android:title="@string/dashboard_preference_update_config_title" />
+
+
(
+ replay = 0,
+ extraBufferCapacity = 1,
+ onBufferOverflow = BufferOverflow.DROP_OLDEST
+ )
+ val scanCompleted: SharedFlow get() = _scanCompleted
+
+ fun notifyScanCompleted() {
+ _scanCompleted.tryEmit(Unit)
+ }
+}
diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperFactoryTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperFactoryTest.kt
index e29a83fb55..9203784100 100644
--- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperFactoryTest.kt
+++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperFactoryTest.kt
@@ -16,7 +16,9 @@ class FingerprintCaptureWrapperFactoryTest {
@Before
fun setUp() {
fingerprintCaptureWrapperFactory =
- FingerprintCaptureWrapperFactory(UnconfinedTestDispatcher(), ScannerUiHelper())
+ FingerprintCaptureWrapperFactory(
+ UnconfinedTestDispatcher(), ScannerUiHelper(), mockk(relaxed = true)
+ )
}
@Test(expected = NullScannerException::class)
diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperV1Test.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperV1Test.kt
index d935dbad0a..6861c8ee9d 100644
--- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperV1Test.kt
+++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperV1Test.kt
@@ -11,6 +11,7 @@ import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.model
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
+import io.mockk.mockk
import io.mockk.slot
import io.mockk.verify
import kotlinx.coroutines.test.UnconfinedTestDispatcher
@@ -31,7 +32,8 @@ class FingerprintCaptureWrapperV1Test {
@Before
fun setup() {
MockKAnnotations.init(this, relaxed = true)
- scannerWrapper = FingerprintCaptureWrapperV1(scanner, UnconfinedTestDispatcher())
+ scannerWrapper =
+ FingerprintCaptureWrapperV1(scanner, UnconfinedTestDispatcher(), mockk(relaxed = true))
}
@Test(expected = ScannerOperationInterruptedException::class)
diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperV2Test.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperV2Test.kt
index 4aa2d51214..de4822fc5d 100644
--- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperV2Test.kt
+++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintCaptureWrapperV2Test.kt
@@ -17,6 +17,7 @@ import com.simprints.testtools.common.syntax.assertThrows
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
+import io.mockk.mockk
import io.mockk.verify
import io.reactivex.Completable
import io.reactivex.Maybe
@@ -39,7 +40,9 @@ class FingerprintCaptureWrapperV2Test {
fun setup() {
MockKAnnotations.init(this, relaxed = true)
scannerWrapper =
- FingerprintCaptureWrapperV2(scannerV2, scannerUiHelper, UnconfinedTestDispatcher())
+ FingerprintCaptureWrapperV2(
+ scannerV2, scannerUiHelper, UnconfinedTestDispatcher(), mockk(relaxed = true)
+ )
}
@Test
diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintScanningStatusTrackerTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintScanningStatusTrackerTest.kt
new file mode 100644
index 0000000000..f539dda0f9
--- /dev/null
+++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/capture/FingerprintScanningStatusTrackerTest.kt
@@ -0,0 +1,42 @@
+package com.simprints.fingerprint.infra.scanner.capture
+
+import com.google.common.truth.Truth
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class FingerprintScanningStatusTrackerTest {
+ private val tracker = FingerprintScanningStatusTracker()
+ private val testDispatcher = UnconfinedTestDispatcher()
+
+ @Test
+ fun `test notifyScanCompleted emits Unit`() = runTest(testDispatcher) {
+ var emitted = false
+ val job = launch {
+ tracker.scanCompleted.collect {
+ emitted = true
+ }
+ }
+ tracker.notifyScanCompleted()
+ Truth.assertThat(emitted).isTrue()
+ job.cancel()
+ }
+
+ @Test
+ fun `test scanCompleted flow does not replay past emissions`() = runTest(testDispatcher) {
+ tracker.notifyScanCompleted()
+
+ var emitted = false
+ val job = launch {
+ tracker.scanCompleted.collect {
+ emitted = true
+ }
+ }
+ Truth.assertThat(emitted).isFalse()
+ job.cancel()
+ }
+
+}
diff --git a/infra/resources/src/main/res/values/strings.xml b/infra/resources/src/main/res/values/strings.xml
index 46929283ca..2399e1a760 100644
--- a/infra/resources/src/main/res/values/strings.xml
+++ b/infra/resources/src/main/res/values/strings.xml
@@ -371,9 +371,10 @@
View the fingers that will be scanned
Further details on sync
Refresh device and project configuration
+ Enable or disable audio alerts when a fingerprint scan is completed, notifying the user to remove their hand from the scanner.
Copied to clipboard
Configuration update started
-
+ Audio on Fingerprint Scan Completion
Sync Information