diff --git a/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt b/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt index fb676fee61..d486f6bb24 100644 --- a/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt +++ b/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt @@ -7,8 +7,8 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.DeviceID import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureIdentity -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplateCapture import com.simprints.core.livedata.LiveDataEvent import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.core.livedata.send @@ -79,9 +79,9 @@ internal class FaceCaptureViewModel @Inject constructor( get() = _unexpectedErrorEvent private val _unexpectedErrorEvent = MutableLiveData() - val finishFlowEvent: LiveData> + val finishFlowEvent: LiveData> get() = _finishFlowEvent - private val _finishFlowEvent = MutableLiveData>() + private val _finishFlowEvent = MutableLiveData>() val invalidLicense: LiveData get() = _invalidLicense @@ -179,18 +179,21 @@ internal class FaceCaptureViewModel @Inject constructor( saveFaceDetections() } - val items = faceDetections.mapIndexed { index, detection -> - CaptureSample( + val items = faceDetections.map { detection -> + BiometricTemplateCapture( captureEventId = detection.id, template = detection.face?.template ?: ByteArray(0), - format = detection.face?.format ?: "", - modality = Modality.FACE, ) } val referenceId = UUID.randomUUID().toString() eventReporter.addBiometricReferenceCreationEvents(referenceId, items.map { it.captureEventId }) - _finishFlowEvent.send(CaptureIdentity(referenceId, Modality.FACE, items)) + val format = faceDetections + .firstOrNull() + ?.face + ?.format + .orEmpty() + _finishFlowEvent.send(BiometricReferenceCapture(referenceId, Modality.FACE, format, items)) } } diff --git a/face/infra/base-bio-sdk/src/main/java/com/simprints/face/infra/basebiosdk/matching/FaceMatcher.kt b/face/infra/base-bio-sdk/src/main/java/com/simprints/face/infra/basebiosdk/matching/FaceMatcher.kt index 78892c5adf..bfbc56fc07 100644 --- a/face/infra/base-bio-sdk/src/main/java/com/simprints/face/infra/basebiosdk/matching/FaceMatcher.kt +++ b/face/infra/base-bio-sdk/src/main/java/com/simprints/face/infra/basebiosdk/matching/FaceMatcher.kt @@ -1,10 +1,10 @@ package com.simprints.face.infra.basebiosdk.matching -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.sample.Identity abstract class FaceMatcher( - open val probeSamples: List, + open val probeReference: BiometricReferenceCapture, ) : AutoCloseable { /** * Get highest comparison score for matching candidate template against samples diff --git a/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/FaceBioSDK.kt b/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/FaceBioSDK.kt index a11b2bc478..7665d87356 100644 --- a/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/FaceBioSDK.kt +++ b/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/FaceBioSDK.kt @@ -1,6 +1,6 @@ package com.simprints.face.infra.biosdkresolver -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.face.infra.basebiosdk.detection.FaceDetector import com.simprints.face.infra.basebiosdk.initialization.FaceBioSdkInitializer import com.simprints.face.infra.basebiosdk.matching.FaceMatcher @@ -15,5 +15,5 @@ interface FaceBioSDK { fun matcherName(): String - fun createMatcher(probeSamples: List): FaceMatcher + fun createMatcher(probeReference: BiometricReferenceCapture): FaceMatcher } diff --git a/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/RocV1BioSdk.kt b/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/RocV1BioSdk.kt index 4b5de11830..52ab9e2858 100644 --- a/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/RocV1BioSdk.kt +++ b/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/RocV1BioSdk.kt @@ -1,6 +1,6 @@ package com.simprints.face.infra.biosdkresolver -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.face.infra.basebiosdk.matching.FaceMatcher import com.simprints.face.infra.rocv1.detection.RocV1Detector import com.simprints.face.infra.rocv1.detection.RocV1Detector.Companion.RANK_ONE_TEMPLATE_FORMAT_1_23 @@ -20,5 +20,5 @@ class RocV1BioSdk @Inject constructor( override fun matcherName(): String = "RANK_ONE" - override fun createMatcher(probeSamples: List): FaceMatcher = RocV1Matcher(probeSamples) + override fun createMatcher(probeReference: BiometricReferenceCapture): FaceMatcher = RocV1Matcher(probeReference) } diff --git a/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/RocV3BioSdk.kt b/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/RocV3BioSdk.kt index f3b000b023..5f618f9a3a 100644 --- a/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/RocV3BioSdk.kt +++ b/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/RocV3BioSdk.kt @@ -1,6 +1,6 @@ package com.simprints.face.infra.biosdkresolver -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.face.infra.basebiosdk.matching.FaceMatcher import com.simprints.face.infra.rocv3.detection.RocV3Detector import com.simprints.face.infra.rocv3.detection.RocV3Detector.Companion.RANK_ONE_TEMPLATE_FORMAT_3_1 @@ -20,5 +20,5 @@ class RocV3BioSdk @Inject constructor( override fun matcherName(): String = "RANK_ONE" - override fun createMatcher(probeSamples: List): FaceMatcher = RocV3Matcher(probeSamples) + override fun createMatcher(probeReference: BiometricReferenceCapture): FaceMatcher = RocV3Matcher(probeReference) } diff --git a/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/SimFaceBioSdk.kt b/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/SimFaceBioSdk.kt index fe4be76ae8..fcc564fbf1 100644 --- a/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/SimFaceBioSdk.kt +++ b/face/infra/bio-sdk-resolver/src/main/java/com/simprints/face/infra/biosdkresolver/SimFaceBioSdk.kt @@ -1,7 +1,7 @@ package com.simprints.face.infra.biosdkresolver import com.simprints.biometrics.simface.SimFace -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.face.infra.basebiosdk.matching.FaceMatcher import com.simprints.face.infra.simface.detection.SimFaceDetector import com.simprints.face.infra.simface.initialization.SimFaceInitializer @@ -21,5 +21,5 @@ class SimFaceBioSdk @Inject constructor( override fun matcherName(): String = "SIM_FACE" - override fun createMatcher(probeSamples: List): FaceMatcher = SimFaceMatcher(simFace, probeSamples) + override fun createMatcher(probeReference: BiometricReferenceCapture): FaceMatcher = SimFaceMatcher(simFace, probeReference) } diff --git a/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/RocV1BioSdkTest.kt b/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/RocV1BioSdkTest.kt index 8a42d5549f..4bdff76da4 100644 --- a/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/RocV1BioSdkTest.kt +++ b/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/RocV1BioSdkTest.kt @@ -1,22 +1,20 @@ package com.simprints.face.infra.biosdkresolver - import com.google.common.truth.Truth.* import io.mockk.* import org.junit.Test class RocV1BioSdkTest { - - private lateinit var rocV1BioSdk: RocV1BioSdk @Test fun createMatcher() { rocV1BioSdk = RocV1BioSdk(mockk(), mockk()) - val matcher = rocV1BioSdk.createMatcher(emptyList()) + val matcher = rocV1BioSdk.createMatcher( + mockk { every { templates } returns emptyList() }, + ) assertThat(matcher).isNotNull() } - } diff --git a/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/RocV3BioSdkTest.kt b/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/RocV3BioSdkTest.kt index 43fdc8d41c..a93a4b3149 100644 --- a/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/RocV3BioSdkTest.kt +++ b/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/RocV3BioSdkTest.kt @@ -11,7 +11,9 @@ class RocV3BioSdkTest { fun createMatcher() { rocV3BioSdk = RocV3BioSdk(mockk(), mockk()) - val matcher = rocV3BioSdk.createMatcher(emptyList()) + val matcher = rocV3BioSdk.createMatcher( + mockk { every { templates } returns emptyList() }, + ) assertThat(matcher).isNotNull() } diff --git a/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/SimFaceSdkTest.kt b/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/SimFaceSdkTest.kt index 2c4cb3022f..fdb954bcdb 100644 --- a/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/SimFaceSdkTest.kt +++ b/face/infra/bio-sdk-resolver/src/test/java/com/simprints/face/infra/biosdkresolver/SimFaceSdkTest.kt @@ -18,7 +18,7 @@ class SimFaceSdkTest { simFace = mockk(relaxed = true), ) - val matcher = bioSdk.createMatcher(emptyList()) + val matcher = bioSdk.createMatcher(mockk()) Truth.assertThat(matcher).isNotNull() } diff --git a/face/infra/roc-v1/src/main/java/com/simprints/face/infra/rocv1/matching/RocV1Matcher.kt b/face/infra/roc-v1/src/main/java/com/simprints/face/infra/rocv1/matching/RocV1Matcher.kt index 5979018813..66f078f839 100644 --- a/face/infra/roc-v1/src/main/java/com/simprints/face/infra/rocv1/matching/RocV1Matcher.kt +++ b/face/infra/roc-v1/src/main/java/com/simprints/face/infra/rocv1/matching/RocV1Matcher.kt @@ -1,7 +1,7 @@ package com.simprints.face.infra.rocv1.matching import com.simprints.core.ExcludedFromGeneratedTestCoverageReports -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.sample.Identity import com.simprints.face.infra.basebiosdk.matching.FaceMatcher import io.rankone.rocsdk.embedded.SWIGTYPE_p_unsigned_char @@ -12,19 +12,20 @@ import io.rankone.rocsdk.embedded.rocConstants.ROC_FAST_FV_SIZE reason = "This function uses roc class that has native functions and can't be mocked", ) class RocV1Matcher( - override val probeSamples: List, -) : FaceMatcher(probeSamples) { - var probeTemplates: List = probeSamples.mapIndexed { i, probe -> - val probeTemplate: SWIGTYPE_p_unsigned_char = - roc.new_uint8_t_array(ROC_FAST_FV_SIZE.toInt()) - roc.memmove(roc.roc_cast(probeTemplate), probe.template) - probeTemplate - } + override val probeReference: BiometricReferenceCapture, +) : FaceMatcher(probeReference) { + var nativeProbeTemplates: List = probeReference.templates + .map { it.template } + .map { probe -> + val probeTemplate: SWIGTYPE_p_unsigned_char = roc.new_uint8_t_array(ROC_FAST_FV_SIZE.toInt()) + roc.memmove(roc.roc_cast(probeTemplate), probe) + probeTemplate + } - override suspend fun getHighestComparisonScoreForCandidate(candidate: Identity): Float = probeTemplates + override suspend fun getHighestComparisonScoreForCandidate(candidate: Identity): Float = nativeProbeTemplates .flatMap { probeTemplate -> candidate.samples.map { face -> - getSimilarityScoreForCandidate(probeTemplate, face.template) + getSimilarityScoreForCandidate(probeTemplate, face.template.template) } }.max() @@ -47,6 +48,6 @@ class RocV1Matcher( } override fun close() { - probeTemplates.forEach { roc.delete_uint8_t_array(it) } + nativeProbeTemplates.forEach { roc.delete_uint8_t_array(it) } } } diff --git a/face/infra/roc-v1/src/test/java/com/simprints/infra/rocwrapper/matching/RocV1MatcherTest.kt b/face/infra/roc-v1/src/test/java/com/simprints/infra/rocwrapper/matching/RocV1MatcherTest.kt index 4fe85a6425..8e2665e016 100644 --- a/face/infra/roc-v1/src/test/java/com/simprints/infra/rocwrapper/matching/RocV1MatcherTest.kt +++ b/face/infra/roc-v1/src/test/java/com/simprints/infra/rocwrapper/matching/RocV1MatcherTest.kt @@ -2,12 +2,14 @@ package com.simprints.infra.rocwrapper.matching import com.google.common.truth.* import com.simprints.face.infra.rocv1.matching.RocV1Matcher +import io.mockk.every +import io.mockk.mockk import org.junit.Test class RocV1MatcherTest { // Dummy test to generate jacoco reports. @Test fun getMatcherName() { - Truth.assertThat(RocV1Matcher(emptyList())).isNotNull() + Truth.assertThat(RocV1Matcher(mockk { every { templates } returns emptyList() })).isNotNull() } } diff --git a/face/infra/roc-v3/src/main/java/com/simprints/face/infra/rocv3/matching/RocV3Matcher.kt b/face/infra/roc-v3/src/main/java/com/simprints/face/infra/rocv3/matching/RocV3Matcher.kt index 9bdbaec3b6..3bd3894acd 100644 --- a/face/infra/roc-v3/src/main/java/com/simprints/face/infra/rocv3/matching/RocV3Matcher.kt +++ b/face/infra/roc-v3/src/main/java/com/simprints/face/infra/rocv3/matching/RocV3Matcher.kt @@ -4,7 +4,7 @@ import ai.roc.rocsdk.embedded.SWIGTYPE_p_unsigned_char import ai.roc.rocsdk.embedded.roc import ai.roc.rocsdk.embedded.rocConstants.ROC_FACE_FAST_FV_SIZE import com.simprints.core.ExcludedFromGeneratedTestCoverageReports -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.sample.Identity import com.simprints.face.infra.basebiosdk.matching.FaceMatcher @@ -12,19 +12,20 @@ import com.simprints.face.infra.basebiosdk.matching.FaceMatcher reason = "This function uses roc class that has native functions and can't be mocked", ) class RocV3Matcher( - override val probeSamples: List, -) : FaceMatcher(probeSamples) { - var probeTemplates: List = probeSamples.mapIndexed { i, probe -> - val probeTemplate: SWIGTYPE_p_unsigned_char = - roc.new_uint8_t_array(ROC_FACE_FAST_FV_SIZE.toInt()) - roc.memmove(roc.roc_cast(probeTemplate), probe.template) - probeTemplate - } + override val probeReference: BiometricReferenceCapture, +) : FaceMatcher(probeReference) { + var nativeProbeTemplates: List = probeReference.templates + .map { it.template } + .map { probe -> + val probeTemplate: SWIGTYPE_p_unsigned_char = roc.new_uint8_t_array(ROC_FACE_FAST_FV_SIZE.toInt()) + roc.memmove(roc.roc_cast(probeTemplate), probe) + probeTemplate + } - override suspend fun getHighestComparisonScoreForCandidate(candidate: Identity): Float = probeTemplates + override suspend fun getHighestComparisonScoreForCandidate(candidate: Identity): Float = nativeProbeTemplates .flatMap { probeTemplate -> candidate.samples.map { face -> - getSimilarityScoreForCandidate(probeTemplate, face.template) + getSimilarityScoreForCandidate(probeTemplate, face.template.template) } }.max() @@ -47,6 +48,6 @@ class RocV3Matcher( } override fun close() { - probeTemplates.forEach { roc.delete_uint8_t_array(it) } + nativeProbeTemplates.forEach { roc.delete_uint8_t_array(it) } } } diff --git a/face/infra/roc-v3/src/test/java/com/simprints/infra/rocwrapper/matching/RocV3MatcherTest.kt b/face/infra/roc-v3/src/test/java/com/simprints/infra/rocwrapper/matching/RocV3MatcherTest.kt index bc2424efb2..652013f10e 100644 --- a/face/infra/roc-v3/src/test/java/com/simprints/infra/rocwrapper/matching/RocV3MatcherTest.kt +++ b/face/infra/roc-v3/src/test/java/com/simprints/infra/rocwrapper/matching/RocV3MatcherTest.kt @@ -2,12 +2,14 @@ package com.simprints.infra.rocwrapper.matching import com.google.common.truth.Truth import com.simprints.face.infra.rocv3.matching.RocV3Matcher +import io.mockk.every +import io.mockk.mockk import org.junit.Test // Dummy test to generate jacoco reports. class RocV3MatcherTest { @Test fun getMatcherName() { - Truth.assertThat(RocV3Matcher(emptyList())).isNotNull() + Truth.assertThat(RocV3Matcher(mockk { every { templates } returns emptyList() })).isNotNull() } } diff --git a/face/infra/simface/src/main/java/com/simprints/face/infra/simface/matching/SimFaceMatcher.kt b/face/infra/simface/src/main/java/com/simprints/face/infra/simface/matching/SimFaceMatcher.kt index 8e7a4db345..13819c143b 100644 --- a/face/infra/simface/src/main/java/com/simprints/face/infra/simface/matching/SimFaceMatcher.kt +++ b/face/infra/simface/src/main/java/com/simprints/face/infra/simface/matching/SimFaceMatcher.kt @@ -1,20 +1,20 @@ package com.simprints.face.infra.simface.matching import com.simprints.biometrics.simface.SimFace -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.sample.Identity import com.simprints.face.infra.basebiosdk.matching.FaceMatcher class SimFaceMatcher( private val simFace: SimFace, - override val probeSamples: List, -) : FaceMatcher(probeSamples) { - private val probeTemplates = probeSamples.map { it.template } - - override suspend fun getHighestComparisonScoreForCandidate(candidate: Identity): Float = probeTemplates + override val probeReference: BiometricReferenceCapture, +) : FaceMatcher(probeReference) { + override suspend fun getHighestComparisonScoreForCandidate(candidate: Identity): Float = probeReference + .templates + .map { it.template } .flatMap { probeTemplate -> candidate.samples.map { face -> - val baseScore = simFace.verificationScore(probeTemplate, face.template) + val baseScore = simFace.verificationScore(probeTemplate, face.template.template) // TODO: remove the adjustment after we find out why the returned range is biased towards [0.5;1] (baseScore - 0.5).coerceAtLeast(0.0).toFloat() * 200f } diff --git a/face/infra/simface/src/test/java/com/simprints/face/infra/simface/matching/SimFaceMatcherTest.kt b/face/infra/simface/src/test/java/com/simprints/face/infra/simface/matching/SimFaceMatcherTest.kt index 22409cce7c..b6ca7d6c4c 100644 --- a/face/infra/simface/src/test/java/com/simprints/face/infra/simface/matching/SimFaceMatcherTest.kt +++ b/face/infra/simface/src/test/java/com/simprints/face/infra/simface/matching/SimFaceMatcherTest.kt @@ -3,7 +3,8 @@ package com.simprints.face.infra.simface.matching import com.google.common.truth.Truth.* import com.simprints.biometrics.simface.SimFace import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture import com.simprints.core.domain.sample.Identity import com.simprints.core.domain.sample.Sample import io.mockk.* @@ -14,7 +15,7 @@ import org.junit.Test class SimFaceMatcherTest { @Test fun getMatcherName() { - assertThat(SimFaceMatcher(mockk(relaxed = true), emptyList())).isNotNull() + assertThat(SimFaceMatcher(mockk(relaxed = true), mockk { })).isNotNull() } @Test @@ -44,14 +45,14 @@ class SimFaceMatcherTest { } val matcher = SimFaceMatcher( simFace = simFace, - probeSamples = listOf( - CaptureSample( - captureEventId = "id", - modality = Modality.FACE, - format = "ROC", - template = byteArrayOf(1), - ), - ), + probeReference = mockk { + every { templates } returns listOf( + BiometricTemplateCapture( + captureEventId = "captureId", + template = byteArrayOf(1), + ), + ) + }, ) val result = matcher.getHighestComparisonScoreForCandidate( candidate = Identity( @@ -60,7 +61,9 @@ class SimFaceMatcherTest { Sample( referenceId = "id", modality = Modality.FACE, - template = byteArrayOf(1), + template = BiometricTemplate( + template = byteArrayOf(1), + ), format = "ROC", ), ), @@ -77,14 +80,14 @@ class SimFaceMatcherTest { } val matcher = SimFaceMatcher( simFace = simFace, - probeSamples = listOf( - CaptureSample( - captureEventId = "id", - modality = Modality.FACE, - format = "ROC", - template = byteArrayOf(1), - ), - ), + probeReference = mockk { + every { templates } returns listOf( + BiometricTemplateCapture( + captureEventId = "captureId", + template = byteArrayOf(1), + ), + ) + }, ) val result = matcher.getHighestComparisonScoreForCandidate( candidate = Identity( @@ -93,7 +96,9 @@ class SimFaceMatcherTest { Sample( referenceId = "id", modality = Modality.FACE, - template = byteArrayOf(1), + template = BiometricTemplate( + template = byteArrayOf(1), + ), format = "ROC", ), ), diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionItemAdapter.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionItemAdapter.kt index b06511e5b0..ef240de6e0 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionItemAdapter.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionItemAdapter.kt @@ -4,7 +4,7 @@ import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.feature.dashboard.databinding.HeaderSdkNameBinding import com.simprints.feature.dashboard.databinding.ItemFingerSelectionBinding import com.simprints.infra.resources.R as IDR @@ -89,18 +89,18 @@ internal class FingerSelectionItemAdapter( } } -fun SampleIdentifier.toString(context: Context) = context.getString( +fun TemplateIdentifier.toString(context: Context) = context.getString( when (this) { - SampleIdentifier.LEFT_THUMB -> IDR.string.fingerprint_capture_finger_l_1 - SampleIdentifier.LEFT_INDEX_FINGER -> IDR.string.fingerprint_capture_finger_l_2 - SampleIdentifier.LEFT_3RD_FINGER -> IDR.string.fingerprint_capture_finger_l_3 - SampleIdentifier.LEFT_4TH_FINGER -> IDR.string.fingerprint_capture_finger_l_4 - SampleIdentifier.LEFT_5TH_FINGER -> IDR.string.fingerprint_capture_finger_l_5 - SampleIdentifier.RIGHT_THUMB -> IDR.string.fingerprint_capture_finger_r_1 - SampleIdentifier.RIGHT_INDEX_FINGER -> IDR.string.fingerprint_capture_finger_r_2 - SampleIdentifier.RIGHT_3RD_FINGER -> IDR.string.fingerprint_capture_finger_r_3 - SampleIdentifier.RIGHT_4TH_FINGER -> IDR.string.fingerprint_capture_finger_r_4 - SampleIdentifier.RIGHT_5TH_FINGER -> IDR.string.fingerprint_capture_finger_r_5 - SampleIdentifier.NONE -> throw IllegalArgumentException("Incorrect sample identifier") + TemplateIdentifier.LEFT_THUMB -> IDR.string.fingerprint_capture_finger_l_1 + TemplateIdentifier.LEFT_INDEX_FINGER -> IDR.string.fingerprint_capture_finger_l_2 + TemplateIdentifier.LEFT_3RD_FINGER -> IDR.string.fingerprint_capture_finger_l_3 + TemplateIdentifier.LEFT_4TH_FINGER -> IDR.string.fingerprint_capture_finger_l_4 + TemplateIdentifier.LEFT_5TH_FINGER -> IDR.string.fingerprint_capture_finger_l_5 + TemplateIdentifier.RIGHT_THUMB -> IDR.string.fingerprint_capture_finger_r_1 + TemplateIdentifier.RIGHT_INDEX_FINGER -> IDR.string.fingerprint_capture_finger_r_2 + TemplateIdentifier.RIGHT_3RD_FINGER -> IDR.string.fingerprint_capture_finger_r_3 + TemplateIdentifier.RIGHT_4TH_FINGER -> IDR.string.fingerprint_capture_finger_r_4 + TemplateIdentifier.RIGHT_5TH_FINGER -> IDR.string.fingerprint_capture_finger_r_5 + TemplateIdentifier.NONE -> throw IllegalArgumentException("Incorrect sample identifier") }, ) diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt index 9c643942f5..838d1f4db7 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.config.sync.ConfigManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch @@ -31,7 +31,7 @@ internal class FingerSelectionViewModel @Inject constructor( } } - private fun List.toFingerSelectionItems(): List { + private fun List.toFingerSelectionItems(): List { val result = mutableListOf() this.forEach { finger -> val alreadyExistingFingerSelection = result.firstOrNull { fingerSelectionItem -> @@ -54,6 +54,6 @@ data class FingerSelectionSection( ) data class FingerSelectionItem( - var finger: SampleIdentifier, + var finger: TemplateIdentifier, var quantity: Int, ) diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionFragmentTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionFragmentTest.kt index 8c16f1aa92..e95a186477 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionFragmentTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionFragmentTest.kt @@ -6,7 +6,7 @@ import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.* import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.feature.dashboard.R import com.simprints.testtools.hilt.launchFragmentInHiltContainer import dagger.hilt.android.testing.BindValue @@ -43,9 +43,9 @@ class FingerSelectionFragmentTest { FingerSelectionSection( sdkName = SIM_MATCHER_NAME, items = listOf( - FingerSelectionItem(SampleIdentifier.LEFT_THUMB, 1), - FingerSelectionItem(SampleIdentifier.RIGHT_THUMB, 2), - FingerSelectionItem(SampleIdentifier.LEFT_INDEX_FINGER, 3), + FingerSelectionItem(TemplateIdentifier.LEFT_THUMB, 1), + FingerSelectionItem(TemplateIdentifier.RIGHT_THUMB, 2), + FingerSelectionItem(TemplateIdentifier.LEFT_INDEX_FINGER, 3), ), ), ), diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt index 8afc217e58..459420054b 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt @@ -2,7 +2,7 @@ package com.simprints.feature.dashboard.settings.fingerselection import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -26,10 +26,10 @@ class FingerSelectionViewModelTest { @Test fun start_loadsSingleSdkFingerStatesCorrectly() { every { fingerprintConfiguration.secugenSimMatcher?.fingersToCapture } returns listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_THUMB, - SampleIdentifier.RIGHT_THUMB, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_THUMB, + TemplateIdentifier.RIGHT_THUMB, ) every { fingerprintConfiguration.nec } returns null @@ -42,8 +42,8 @@ class FingerSelectionViewModelTest { assertThat(fingerSelections?.first()?.items) .containsExactlyElementsIn( listOf( - FingerSelectionItem(SampleIdentifier.LEFT_THUMB, 2), - FingerSelectionItem(SampleIdentifier.RIGHT_THUMB, 2), + FingerSelectionItem(TemplateIdentifier.LEFT_THUMB, 2), + FingerSelectionItem(TemplateIdentifier.RIGHT_THUMB, 2), ), ).inOrder() } @@ -51,18 +51,18 @@ class FingerSelectionViewModelTest { @Test fun start_loadsTwoSdksFingerStatesCorrectly() { every { fingerprintConfiguration.secugenSimMatcher?.fingersToCapture } returns listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_THUMB, - SampleIdentifier.RIGHT_THUMB, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_THUMB, + TemplateIdentifier.RIGHT_THUMB, ) every { fingerprintConfiguration.nec?.fingersToCapture } returns listOf( - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_INDEX_FINGER, - SampleIdentifier.RIGHT_INDEX_FINGER, - SampleIdentifier.RIGHT_INDEX_FINGER, - SampleIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.RIGHT_INDEX_FINGER, ) viewModel.start() @@ -74,8 +74,8 @@ class FingerSelectionViewModelTest { assertThat(fingerSelections?.first()?.items) .containsExactlyElementsIn( listOf( - FingerSelectionItem(SampleIdentifier.LEFT_THUMB, 1), - FingerSelectionItem(SampleIdentifier.RIGHT_THUMB, 2), + FingerSelectionItem(TemplateIdentifier.LEFT_THUMB, 1), + FingerSelectionItem(TemplateIdentifier.RIGHT_THUMB, 2), ), ).inOrder() assertThat(fingerSelections?.get(1)?.sdkName).isEqualTo("NEC") @@ -83,8 +83,8 @@ class FingerSelectionViewModelTest { assertThat(fingerSelections?.get(1)?.items) .containsExactlyElementsIn( listOf( - FingerSelectionItem(SampleIdentifier.LEFT_INDEX_FINGER, 3), - FingerSelectionItem(SampleIdentifier.RIGHT_INDEX_FINGER, 4), + FingerSelectionItem(TemplateIdentifier.LEFT_INDEX_FINGER, 3), + FingerSelectionItem(TemplateIdentifier.RIGHT_INDEX_FINGER, 4), ), ).inOrder() } @@ -92,36 +92,36 @@ class FingerSelectionViewModelTest { @Test fun scatteredFingers_areAggregated() { every { fingerprintConfiguration.secugenSimMatcher?.fingersToCapture } returns listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_THUMB, - SampleIdentifier.RIGHT_INDEX_FINGER, - SampleIdentifier.LEFT_3RD_FINGER, - SampleIdentifier.LEFT_3RD_FINGER, - SampleIdentifier.LEFT_4TH_FINGER, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_5TH_FINGER, - SampleIdentifier.LEFT_5TH_FINGER, - SampleIdentifier.LEFT_3RD_FINGER, - SampleIdentifier.LEFT_4TH_FINGER, - SampleIdentifier.RIGHT_5TH_FINGER, - SampleIdentifier.RIGHT_5TH_FINGER, - SampleIdentifier.LEFT_5TH_FINGER, - SampleIdentifier.RIGHT_4TH_FINGER, - SampleIdentifier.LEFT_4TH_FINGER, - SampleIdentifier.RIGHT_3RD_FINGER, - SampleIdentifier.RIGHT_4TH_FINGER, - SampleIdentifier.RIGHT_5TH_FINGER, - SampleIdentifier.LEFT_5TH_FINGER, - SampleIdentifier.RIGHT_INDEX_FINGER, - SampleIdentifier.RIGHT_4TH_FINGER, - SampleIdentifier.LEFT_4TH_FINGER, - SampleIdentifier.LEFT_5TH_FINGER, - SampleIdentifier.RIGHT_3RD_FINGER, - SampleIdentifier.LEFT_5TH_FINGER, - SampleIdentifier.RIGHT_4TH_FINGER, - SampleIdentifier.RIGHT_5TH_FINGER, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_3RD_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_THUMB, + TemplateIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_4TH_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_5TH_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_4TH_FINGER, + TemplateIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_5TH_FINGER, + TemplateIdentifier.RIGHT_4TH_FINGER, + TemplateIdentifier.LEFT_4TH_FINGER, + TemplateIdentifier.RIGHT_3RD_FINGER, + TemplateIdentifier.RIGHT_4TH_FINGER, + TemplateIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_5TH_FINGER, + TemplateIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.RIGHT_4TH_FINGER, + TemplateIdentifier.LEFT_4TH_FINGER, + TemplateIdentifier.LEFT_5TH_FINGER, + TemplateIdentifier.RIGHT_3RD_FINGER, + TemplateIdentifier.LEFT_5TH_FINGER, + TemplateIdentifier.RIGHT_4TH_FINGER, + TemplateIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_3RD_FINGER, ) every { fingerprintConfiguration.nec } returns null @@ -134,16 +134,16 @@ class FingerSelectionViewModelTest { assertThat(fingerSelections?.first()?.items) .containsExactlyElementsIn( listOf( - FingerSelectionItem(SampleIdentifier.LEFT_THUMB, 1), - FingerSelectionItem(SampleIdentifier.RIGHT_THUMB, 1), - FingerSelectionItem(SampleIdentifier.RIGHT_INDEX_FINGER, 2), - FingerSelectionItem(SampleIdentifier.LEFT_3RD_FINGER, 3), - FingerSelectionItem(SampleIdentifier.LEFT_4TH_FINGER, 4), - FingerSelectionItem(SampleIdentifier.LEFT_INDEX_FINGER, 2), - FingerSelectionItem(SampleIdentifier.RIGHT_5TH_FINGER, 5), - FingerSelectionItem(SampleIdentifier.LEFT_5TH_FINGER, 5), - FingerSelectionItem(SampleIdentifier.RIGHT_4TH_FINGER, 4), - FingerSelectionItem(SampleIdentifier.RIGHT_3RD_FINGER, 3), + FingerSelectionItem(TemplateIdentifier.LEFT_THUMB, 1), + FingerSelectionItem(TemplateIdentifier.RIGHT_THUMB, 1), + FingerSelectionItem(TemplateIdentifier.RIGHT_INDEX_FINGER, 2), + FingerSelectionItem(TemplateIdentifier.LEFT_3RD_FINGER, 3), + FingerSelectionItem(TemplateIdentifier.LEFT_4TH_FINGER, 4), + FingerSelectionItem(TemplateIdentifier.LEFT_INDEX_FINGER, 2), + FingerSelectionItem(TemplateIdentifier.RIGHT_5TH_FINGER, 5), + FingerSelectionItem(TemplateIdentifier.LEFT_5TH_FINGER, 5), + FingerSelectionItem(TemplateIdentifier.RIGHT_4TH_FINGER, 4), + FingerSelectionItem(TemplateIdentifier.RIGHT_3RD_FINGER, 3), ), ).inOrder() } diff --git a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/EnrolLastBiometricParams.kt b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/EnrolLastBiometricParams.kt index 17f4d9bb17..da8e11aec8 100644 --- a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/EnrolLastBiometricParams.kt +++ b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/EnrolLastBiometricParams.kt @@ -3,8 +3,8 @@ package com.simprints.feature.enrollast import androidx.annotation.Keep import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.core.domain.common.ModalitySdkType -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.step.StepParams import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential @@ -27,13 +27,12 @@ sealed class EnrolLastBiometricStepResult : StepParams { @Keep data class CaptureResult( - val referenceId: String, - val results: List, + val result: BiometricReferenceCapture, ) : EnrolLastBiometricStepResult() @Keep data class MatchResult( - val results: List, + val results: List, val sdk: ModalitySdkType, ) : EnrolLastBiometricStepResult() } diff --git a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/usecase/BuildSubjectUseCase.kt b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/usecase/BuildSubjectUseCase.kt index 2fc46b034f..a9d3238fdd 100644 --- a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/usecase/BuildSubjectUseCase.kt +++ b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/usecase/BuildSubjectUseCase.kt @@ -1,6 +1,7 @@ package com.simprints.feature.enrollast.screen.usecase -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Sample import com.simprints.core.tools.time.TimeHelper import com.simprints.feature.enrollast.EnrolLastBiometricParams @@ -29,7 +30,7 @@ internal class BuildSubjectUseCase @Inject constructor( } val captureResult = params.steps .filterIsInstance() - .flatMap { result -> result.results.map { toSample(result.referenceId, it) } } + .flatMap { result -> result.result.toSamples() } return subjectFactory.buildSubject( subjectId = subjectId, @@ -47,14 +48,15 @@ internal class BuildSubjectUseCase @Inject constructor( subjectId: String, ) = credential?.toExternalCredential(subjectId) - private fun toSample( - referenceId: String, - result: CaptureSample, - ) = Sample( - identifier = result.identifier, - template = result.template, - format = result.format, - referenceId = referenceId, - modality = result.modality, - ) + private fun BiometricReferenceCapture.toSamples() = templates.map { templateCapture -> + Sample( + template = BiometricTemplate( + identifier = templateCapture.identifier, + template = templateCapture.template, + ), + format = format, + referenceId = referenceId, + modality = modality, + ) + } } diff --git a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/usecase/CheckForDuplicateEnrolmentsUseCase.kt b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/usecase/CheckForDuplicateEnrolmentsUseCase.kt index 119e66be3f..ea631e1c3e 100644 --- a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/usecase/CheckForDuplicateEnrolmentsUseCase.kt +++ b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/usecase/CheckForDuplicateEnrolmentsUseCase.kt @@ -31,7 +31,9 @@ internal class CheckForDuplicateEnrolmentsUseCase @Inject constructor() { EnrolLastState.ErrorType.DUPLICATE_ENROLMENTS } - else -> null + else -> { + null + } } } @@ -48,7 +50,7 @@ internal class CheckForDuplicateEnrolmentsUseCase @Inject constructor() { ?.high ?.toFloat() ?: Float.MAX_VALUE - result.results.any { it.confidence >= threshold } + result.results.any { it.comparisonScore >= threshold } } private class MissingMatchResultException : IllegalStateException("No match response in duplicate check.") diff --git a/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/usecase/BuildSubjectUseCaseTest.kt b/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/usecase/BuildSubjectUseCaseTest.kt index 91f1ce72da..b0f5f39a46 100644 --- a/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/usecase/BuildSubjectUseCaseTest.kt +++ b/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/usecase/BuildSubjectUseCaseTest.kt @@ -3,8 +3,9 @@ package com.simprints.feature.enrollast.screen.usecase import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.TimeHelper @@ -68,16 +69,24 @@ class BuildSubjectUseCaseTest { @Test fun `maps first available fingerprint capture step results`() { val result = useCase( - createParams( + params = createParams( steps = listOf( EnrolLastBiometricStepResult.MatchResult(emptyList(), mockk()), EnrolLastBiometricStepResult.CaptureResult( - REFERENCE_ID, - listOf(mockFingerprintResults(SampleIdentifier.RIGHT_THUMB)), + BiometricReferenceCapture( + referenceId = REFERENCE_ID, + modality = Modality.FINGERPRINT, + format = "ISO_19794_2", + templates = listOf(mockFingerprintResults(TemplateIdentifier.RIGHT_THUMB)), + ), ), EnrolLastBiometricStepResult.CaptureResult( - REFERENCE_ID, - listOf(mockFingerprintResults(SampleIdentifier.LEFT_THUMB)), + BiometricReferenceCapture( + referenceId = REFERENCE_ID, + modality = Modality.FINGERPRINT, + format = "ISO_19794_2", + templates = listOf(mockFingerprintResults(TemplateIdentifier.LEFT_THUMB)), + ), ), ), scannedCredential = scannedCredential, @@ -86,7 +95,11 @@ class BuildSubjectUseCaseTest { ) assertThat(result.samples).isNotEmpty() - assertThat(result.samples.first().identifier).isEqualTo(SampleIdentifier.RIGHT_THUMB) + assertThat( + result.samples + .first() + .template.identifier, + ).isEqualTo(TemplateIdentifier.RIGHT_THUMB) } @Test @@ -95,18 +108,22 @@ class BuildSubjectUseCaseTest { createParams( steps = listOf( EnrolLastBiometricStepResult.CaptureResult( - REFERENCE_ID, - listOf( - mockFingerprintResults(SampleIdentifier.RIGHT_5TH_FINGER), - mockFingerprintResults(SampleIdentifier.RIGHT_4TH_FINGER), - mockFingerprintResults(SampleIdentifier.RIGHT_3RD_FINGER), - mockFingerprintResults(SampleIdentifier.RIGHT_INDEX_FINGER), - mockFingerprintResults(SampleIdentifier.RIGHT_THUMB), - mockFingerprintResults(SampleIdentifier.LEFT_THUMB), - mockFingerprintResults(SampleIdentifier.LEFT_INDEX_FINGER), - mockFingerprintResults(SampleIdentifier.LEFT_3RD_FINGER), - mockFingerprintResults(SampleIdentifier.LEFT_4TH_FINGER), - mockFingerprintResults(SampleIdentifier.LEFT_5TH_FINGER), + BiometricReferenceCapture( + referenceId = REFERENCE_ID, + modality = Modality.FINGERPRINT, + format = "ISO_19794_2", + templates = listOf( + mockFingerprintResults(TemplateIdentifier.RIGHT_5TH_FINGER), + mockFingerprintResults(TemplateIdentifier.RIGHT_4TH_FINGER), + mockFingerprintResults(TemplateIdentifier.RIGHT_3RD_FINGER), + mockFingerprintResults(TemplateIdentifier.RIGHT_INDEX_FINGER), + mockFingerprintResults(TemplateIdentifier.RIGHT_THUMB), + mockFingerprintResults(TemplateIdentifier.LEFT_THUMB), + mockFingerprintResults(TemplateIdentifier.LEFT_INDEX_FINGER), + mockFingerprintResults(TemplateIdentifier.LEFT_3RD_FINGER), + mockFingerprintResults(TemplateIdentifier.LEFT_4TH_FINGER), + mockFingerprintResults(TemplateIdentifier.LEFT_5TH_FINGER), + ), ), ), ), @@ -125,8 +142,22 @@ class BuildSubjectUseCaseTest { params = createParams( listOf( EnrolLastBiometricStepResult.MatchResult(emptyList(), mockk()), - EnrolLastBiometricStepResult.CaptureResult(REFERENCE_ID, listOf(mockFaceResults("first"))), - EnrolLastBiometricStepResult.CaptureResult(REFERENCE_ID, listOf(mockFaceResults("second"))), + EnrolLastBiometricStepResult.CaptureResult( + BiometricReferenceCapture( + referenceId = REFERENCE_ID, + modality = Modality.FACE, + format = "first", + templates = listOf(mockFaceResults()), + ), + ), + EnrolLastBiometricStepResult.CaptureResult( + BiometricReferenceCapture( + referenceId = REFERENCE_ID, + modality = Modality.FACE, + format = "second", + templates = listOf(mockFaceResults()), + ), + ), ), scannedCredential = scannedCredential, ), @@ -178,19 +209,15 @@ class BuildSubjectUseCaseTest { scannedCredential = scannedCredential, ) - private fun mockFingerprintResults(finger: SampleIdentifier) = CaptureSample( + private fun mockFingerprintResults(finger: TemplateIdentifier) = BiometricTemplateCapture( captureEventId = "eventId", identifier = finger, template = byteArrayOf(), - format = "ISO_19794_2", - modality = Modality.FINGERPRINT, ) - private fun mockFaceResults(format: String) = CaptureSample( + private fun mockFaceResults() = BiometricTemplateCapture( captureEventId = "eventId", template = byteArrayOf(), - format = format, - modality = Modality.FACE, ) companion object { diff --git a/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/usecase/CheckDuplicateEnrolmentsErrorsUseCaseTest.kt b/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/usecase/CheckDuplicateEnrolmentsErrorsUseCaseTest.kt index 2aa18828c5..05ee0fc28a 100644 --- a/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/usecase/CheckDuplicateEnrolmentsErrorsUseCaseTest.kt +++ b/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/usecase/CheckDuplicateEnrolmentsErrorsUseCaseTest.kt @@ -1,7 +1,7 @@ package com.simprints.feature.enrollast.screen.usecase import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.feature.enrollast.EnrolLastBiometricStepResult import com.simprints.feature.enrollast.screen.EnrolLastState import com.simprints.infra.config.store.models.DecisionPolicy @@ -144,7 +144,7 @@ class CheckDuplicateEnrolmentsErrorsUseCaseTest { } } - private fun matchResult(confidence: Float) = MatchComparisonResult("subjectId", confidence) + private fun matchResult(confidence: Float) = ComparisonResult("subjectId", confidence) companion object { private const val LOW_CONFIDENCE = 50f diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/ExternalCredentialContract.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/ExternalCredentialContract.kt index d32383efb6..68f1a4f3b8 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/ExternalCredentialContract.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/ExternalCredentialContract.kt @@ -4,7 +4,8 @@ import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.feature.externalcredential.model.ExternalCredentialParams @ExcludedFromGeneratedTestCoverageReports("Navigation class") @@ -15,13 +16,11 @@ object ExternalCredentialContract { subjectId: String?, flowType: FlowType, ageGroup: AgeGroup?, - probeReferenceId: String? = null, - samples: Map> = emptyMap(), + probeReferences: List = emptyList(), ) = ExternalCredentialParams( subjectId = subjectId, flowType = flowType, ageGroup = ageGroup, - probeReferenceId = probeReferenceId, - samples = samples, + probeReferences = probeReferences, ) } diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/model/CredentialMatch.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/model/CredentialMatch.kt index 1580892ff4..9ceaafa932 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/model/CredentialMatch.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/model/CredentialMatch.kt @@ -3,7 +3,7 @@ package com.simprints.feature.externalcredential.model import androidx.annotation.Keep import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.core.domain.common.ModalitySdkType -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.step.StepResult import com.simprints.core.domain.tokenization.TokenizableString @@ -11,9 +11,9 @@ import com.simprints.core.domain.tokenization.TokenizableString @ExcludedFromGeneratedTestCoverageReports("Data class") data class CredentialMatch( val credential: TokenizableString.Tokenized, - val matchResult: MatchComparisonResult, + val comparisonResult: ComparisonResult, val verificationThreshold: Float, val bioSdk: ModalitySdkType, ) : StepResult { - val isVerificationSuccessful = matchResult.confidence >= verificationThreshold + val isVerificationSuccessful = comparisonResult.comparisonScore >= verificationThreshold } diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/model/ExternalCredentialParams.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/model/ExternalCredentialParams.kt index 85db7e24c1..72dd5865ec 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/model/ExternalCredentialParams.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/model/ExternalCredentialParams.kt @@ -4,8 +4,7 @@ import androidx.annotation.Keep import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.FlowType -import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.step.StepParams @Keep @@ -14,6 +13,5 @@ data class ExternalCredentialParams( val subjectId: String?, val flowType: FlowType, val ageGroup: AgeGroup?, - val probeReferenceId: String?, - val samples: Map>, + val probeReferences: List, ) : StepParams diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/usecase/CreateMatchParamsUseCase.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/usecase/CreateMatchParamsUseCase.kt index 13413bde66..98462f66d3 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/usecase/CreateMatchParamsUseCase.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/usecase/CreateMatchParamsUseCase.kt @@ -2,8 +2,7 @@ package com.simprints.feature.externalcredential.screens.search.usecase import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.FlowType -import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.getSdkListForAgeGroup import com.simprints.infra.enrolment.records.repository.domain.models.BiometricDataSource @@ -15,20 +14,19 @@ internal class CreateMatchParamsUseCase @Inject constructor() { operator fun invoke( candidateSubjectId: String, flowType: FlowType, - probeReferenceId: String?, projectConfiguration: ProjectConfiguration, - samples: Map>, + probeReferences: List, ageGroup: AgeGroup?, - ): List = projectConfiguration.general.matchingModalities - .map { modality -> - val modalityProbes = samples[modality].orEmpty() - projectConfiguration.getSdkListForAgeGroup(modality, ageGroup).map { + ): List = probeReferences + .filter { it.modality in projectConfiguration.general.matchingModalities } + .associateWith { projectConfiguration.getSdkListForAgeGroup(it.modality, ageGroup) } + .map { (probeReference, sdksPerModality) -> + sdksPerModality.map { MatchParams( - probeReferenceId = probeReferenceId.orEmpty(), flowType = flowType, queryForCandidates = SubjectQuery(subjectId = candidateSubjectId), bioSdk = it, - probeSamples = modalityProbes, + probeReference = probeReference, biometricDataSource = BiometricDataSource.Simprints, // [MS-1167] No CoSync in initial MF-ID implementation ) } diff --git a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/usecase/MatchCandidatesUseCase.kt b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/usecase/MatchCandidatesUseCase.kt index 6aba463c74..52b9424e8b 100644 --- a/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/usecase/MatchCandidatesUseCase.kt +++ b/feature/external-credential/src/main/java/com/simprints/feature/externalcredential/screens/search/usecase/MatchCandidatesUseCase.kt @@ -30,9 +30,8 @@ internal class MatchCandidatesUseCase @Inject constructor( val matchParams = createMatchParamsUseCase( candidateSubjectId = candidate.subjectId, flowType = externalCredentialParams.flowType, - probeReferenceId = externalCredentialParams.probeReferenceId, projectConfiguration = projectConfig, - samples = externalCredentialParams.samples, + probeReferences = externalCredentialParams.probeReferences, ageGroup = externalCredentialParams.ageGroup, ) matchParams @@ -49,7 +48,7 @@ internal class MatchCandidatesUseCase @Inject constructor( lastMatchSuccess?.comparisonResults?.map { result -> CredentialMatch( credential = credential, - matchResult = result, + comparisonResult = result, verificationThreshold = matchThreshold, bioSdk = matchParam.bioSdk, ) diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModelTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModelTest.kt index 05ef90863b..8243ddeec9 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModelTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/controller/ExternalCredentialViewModelTest.kt @@ -1,7 +1,7 @@ package com.simprints.feature.externalcredential.screens.controller import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import com.google.common.truth.Truth.assertThat +import com.google.common.truth.Truth.* import com.jraska.livedata.test import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.externalcredential.ExternalCredentialType @@ -17,12 +17,8 @@ import com.simprints.feature.externalcredential.usecase.ExternalCredentialEventT import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.event.domain.models.ExternalCredentialSelectionEvent import com.simprints.testtools.common.coroutines.TestCoroutineRule -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule @@ -227,7 +223,6 @@ internal class ExternalCredentialViewModelTest { subjectId = subjectId, flowType = flowType, ageGroup = null, - probeReferenceId = null, - samples = emptyMap(), + probeReferences = emptyList(), ) } diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/usecase/CreateMatchParamsUseCaseTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/usecase/CreateMatchParamsUseCaseTest.kt index 26b051d547..ee1cc3dbfe 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/usecase/CreateMatchParamsUseCaseTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/usecase/CreateMatchParamsUseCaseTest.kt @@ -4,7 +4,7 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.GeneralConfiguration @@ -25,10 +25,10 @@ internal class CreateMatchParamsUseCaseTest { private val ageGroup = AgeGroup(25, 30) @MockK - private lateinit var faceSample: CaptureSample + private lateinit var faceCapture: BiometricReferenceCapture @MockK - private lateinit var fingerprintSample: CaptureSample + private lateinit var fingerprintCapture: BiometricReferenceCapture @MockK private lateinit var generalConfiguration: GeneralConfiguration @@ -40,6 +40,10 @@ internal class CreateMatchParamsUseCaseTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) mockkStatic("com.simprints.infra.config.store.models.ProjectConfigurationKt") + + every { faceCapture.modality } returns Modality.FACE + every { fingerprintCapture.modality } returns Modality.FINGERPRINT + every { projectConfiguration.general } returns generalConfiguration } @@ -54,19 +58,17 @@ internal class CreateMatchParamsUseCaseTest { val result = useCase( candidateSubjectId = subjectId, flowType = flowType, - probeReferenceId = probeReferenceId, projectConfiguration = projectConfiguration, - samples = mapOf(Modality.FACE to listOf(faceSample)), + probeReferences = listOf(faceCapture), ageGroup = ageGroup, ) assertThat(result).hasSize(2) result.forEach { matchParams -> - assertThat(matchParams.probeReferenceId).isEqualTo(probeReferenceId) assertThat(matchParams.flowType).isEqualTo(flowType) assertThat(matchParams.queryForCandidates.subjectId).isEqualTo(subjectId) assertThat(matchParams.biometricDataSource).isEqualTo(BiometricDataSource.Simprints) - assertThat(matchParams.probeSamples).containsExactly(faceSample) + assertThat(matchParams.probeReference).isEqualTo(faceCapture) assertThat(matchParams.bioSdk).isNotNull() } assertThat(result[0].bioSdk).isEqualTo(FaceConfiguration.BioSdk.RANK_ONE) @@ -84,19 +86,17 @@ internal class CreateMatchParamsUseCaseTest { val result = useCase( candidateSubjectId = subjectId, flowType = flowType, - probeReferenceId = probeReferenceId, projectConfiguration = projectConfiguration, - samples = mapOf(Modality.FINGERPRINT to listOf(fingerprintSample)), + probeReferences = listOf(fingerprintCapture), ageGroup = ageGroup, ) assertThat(result).hasSize(2) result.forEach { matchParams -> - assertThat(matchParams.probeReferenceId).isEqualTo(probeReferenceId) assertThat(matchParams.flowType).isEqualTo(flowType) assertThat(matchParams.queryForCandidates.subjectId).isEqualTo(subjectId) assertThat(matchParams.biometricDataSource).isEqualTo(BiometricDataSource.Simprints) - assertThat(matchParams.probeSamples).containsExactly(fingerprintSample) + assertThat(matchParams.probeReference).isEqualTo(fingerprintCapture) assertThat(matchParams.bioSdk).isNotNull() } assertThat(result[0].bioSdk).isEqualTo(FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER) @@ -119,12 +119,8 @@ internal class CreateMatchParamsUseCaseTest { val result = useCase( candidateSubjectId = subjectId, flowType = flowType, - probeReferenceId = probeReferenceId, projectConfiguration = projectConfiguration, - samples = mapOf( - Modality.FINGERPRINT to listOf(fingerprintSample), - Modality.FACE to listOf(faceSample), - ), + probeReferences = listOf(fingerprintCapture, faceCapture), ageGroup = ageGroup, ) @@ -133,12 +129,12 @@ internal class CreateMatchParamsUseCaseTest { val faceMatch = result.find { it.bioSdk is FaceConfiguration.BioSdk } assertThat(faceMatch).isNotNull() assertThat(faceMatch?.bioSdk).isEqualTo(FaceConfiguration.BioSdk.RANK_ONE) - assertThat(faceMatch?.probeSamples).containsExactly(faceSample) + assertThat(faceMatch?.probeReference).isEqualTo(faceCapture) val fingerprintMatch = result.find { it.bioSdk is FingerprintConfiguration.BioSdk } assertThat(fingerprintMatch).isNotNull() assertThat(fingerprintMatch?.bioSdk).isEqualTo(FingerprintConfiguration.BioSdk.NEC) - assertThat(fingerprintMatch?.probeSamples).containsExactly(fingerprintSample) + assertThat(fingerprintMatch?.probeReference).isEqualTo(fingerprintCapture) } @Test @@ -151,9 +147,8 @@ internal class CreateMatchParamsUseCaseTest { val result = useCase( candidateSubjectId = subjectId, flowType = flowType, - probeReferenceId = probeReferenceId, projectConfiguration = projectConfiguration, - samples = mapOf(Modality.FACE to listOf(faceSample)), + probeReferences = listOf(faceCapture), ageGroup = null, ) @@ -167,12 +162,8 @@ internal class CreateMatchParamsUseCaseTest { val result = useCase( candidateSubjectId = subjectId, flowType = flowType, - probeReferenceId = probeReferenceId, projectConfiguration = projectConfiguration, - samples = mapOf( - Modality.FINGERPRINT to listOf(fingerprintSample), - Modality.FACE to listOf(faceSample), - ), + probeReferences = listOf(fingerprintCapture, faceCapture), ageGroup = ageGroup, ) @@ -187,22 +178,20 @@ internal class CreateMatchParamsUseCaseTest { ) every { generalConfiguration.matchingModalities } returns listOf(Modality.FACE) - val faceSamples = listOf(faceSample, mockk(relaxed = true)) + val faceSamples = listOf( + faceCapture, + mockk { every { modality } returns Modality.FACE }, + ) val result = useCase( candidateSubjectId = subjectId, flowType = flowType, - probeReferenceId = probeReferenceId, projectConfiguration = projectConfiguration, - samples = mapOf( - Modality.FACE to faceSamples, - ), + probeReferences = faceSamples, ageGroup = ageGroup, ) - assertThat(result).hasSize(2) - result.forEach { matchParams -> - assertThat(matchParams.probeSamples).hasSize(2) - } + // 2 captures * 2 sdks + assertThat(result).hasSize(4) } } diff --git a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/usecase/MatchCandidatesUseCaseTest.kt b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/usecase/MatchCandidatesUseCaseTest.kt index 68b9f80e6b..16fd1085ec 100644 --- a/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/usecase/MatchCandidatesUseCaseTest.kt +++ b/feature/external-credential/src/test/java/com/simprints/feature/externalcredential/screens/search/usecase/MatchCandidatesUseCaseTest.kt @@ -3,9 +3,8 @@ package com.simprints.feature.externalcredential.screens.search.usecase import com.google.common.truth.Truth.* import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.FlowType -import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.feature.externalcredential.model.ExternalCredentialParams import com.simprints.infra.config.store.models.FaceConfiguration @@ -62,16 +61,16 @@ internal class MatchCandidatesUseCaseTest { private lateinit var fingerprintSdkConfig: FingerprintConfiguration.FingerprintSdkConfiguration @MockK - private lateinit var matchResultItem: MatchComparisonResult + private lateinit var matchResultItem: ComparisonResult @MockK private lateinit var matchParams: MatchParams @MockK - private lateinit var faceSample: CaptureSample + private lateinit var faceCapture: BiometricReferenceCapture @MockK - private lateinit var fingerprintSample: CaptureSample + private lateinit var fingerprintCapture: BiometricReferenceCapture @MockK private lateinit var ageGroup: AgeGroup @@ -94,21 +93,16 @@ internal class MatchCandidatesUseCaseTest { ) every { subject.subjectId } returns subjectId - every { externalCredentialParams.probeReferenceId } returns probeReferenceId every { externalCredentialParams.flowType } returns FlowType.VERIFY - every { externalCredentialParams.samples } returns mapOf( - Modality.FACE to listOf(faceSample), - Modality.FINGERPRINT to listOf(fingerprintSample), - ) + every { externalCredentialParams.probeReferences } returns listOf(faceCapture, fingerprintCapture) every { externalCredentialParams.ageGroup } returns ageGroup coEvery { createMatchParamsUseCase( candidateSubjectId = any(), flowType = any(), - probeReferenceId = any(), projectConfiguration = any(), - samples = any(), + probeReferences = any(), ageGroup = any(), ) } returns listOf(matchParams) @@ -125,10 +119,10 @@ internal class MatchCandidatesUseCaseTest { private fun initMatchParams(isFace: Boolean) { if (isFace) { - every { matchParams.probeSamples } returns listOf(faceSample) + every { matchParams.probeReference } returns faceCapture every { matchParams.bioSdk } returns FaceConfiguration.BioSdk.RANK_ONE } else { - every { matchParams.probeSamples } returns listOf(fingerprintSample) + every { matchParams.probeReference } returns fingerprintCapture every { matchParams.bioSdk } returns FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER } } @@ -146,7 +140,7 @@ internal class MatchCandidatesUseCaseTest { assertThat(result).hasSize(1) assertThat(result[0].credential).isEqualTo(credential) - assertThat(result[0].matchResult).isEqualTo(matchResultItem) + assertThat(result[0].comparisonResult).isEqualTo(matchResultItem) assertThat(result[0].verificationThreshold).isEqualTo(verificationMatchThreshold) assertThat(result[0].bioSdk).isEqualTo(FaceConfiguration.BioSdk.RANK_ONE) } @@ -164,7 +158,7 @@ internal class MatchCandidatesUseCaseTest { assertThat(result).hasSize(1) assertThat(result[0].credential).isEqualTo(credential) - assertThat(result[0].matchResult).isEqualTo(matchResultItem) + assertThat(result[0].comparisonResult).isEqualTo(matchResultItem) assertThat(result[0].verificationThreshold).isEqualTo(verificationMatchThreshold) assertThat(result[0].bioSdk).isEqualTo(FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER) } diff --git a/feature/matcher/src/main/java/com/simprints/matcher/MatchContract.kt b/feature/matcher/src/main/java/com/simprints/matcher/MatchContract.kt index 8ded5aeb1b..844eaa9c04 100644 --- a/feature/matcher/src/main/java/com/simprints/matcher/MatchContract.kt +++ b/feature/matcher/src/main/java/com/simprints/matcher/MatchContract.kt @@ -2,7 +2,7 @@ package com.simprints.matcher import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.ModalitySdkType -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.infra.enrolment.records.repository.domain.models.BiometricDataSource import com.simprints.infra.enrolment.records.repository.domain.models.SubjectQuery import com.simprints.infra.matching.MatchParams @@ -11,16 +11,14 @@ object MatchContract { val DESTINATION = R.id.matcherFragment fun getParams( - referenceId: String = "", - probeSamples: List = emptyList(), + probeReference: BiometricReferenceCapture, bioSdk: ModalitySdkType, flowType: FlowType, subjectQuery: SubjectQuery, biometricDataSource: BiometricDataSource, ) = MatchParams( - probeReferenceId = referenceId, bioSdk = bioSdk, - probeSamples = probeSamples, + probeReference = probeReference, flowType = flowType, queryForCandidates = subjectQuery, biometricDataSource = biometricDataSource, diff --git a/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt b/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt index 71c77c06ab..4aab9d06f8 100644 --- a/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt +++ b/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.core.livedata.send import com.simprints.core.tools.time.TimeHelper @@ -106,14 +106,14 @@ internal class MatchViewModel @Inject constructor( private fun setMatchState( candidatesMatched: Int, - results: List, + results: List, decisionPolicy: DecisionPolicy, ) { - val veryGoodMatches = results.count { decisionPolicy.high <= it.confidence } + val veryGoodMatches = results.count { decisionPolicy.high <= it.comparisonScore } val goodMatches = - results.count { decisionPolicy.medium <= it.confidence && it.confidence < decisionPolicy.high } + results.count { decisionPolicy.medium <= it.comparisonScore && it.comparisonScore < decisionPolicy.high } val fairMatches = - results.count { decisionPolicy.low <= it.confidence && it.confidence < decisionPolicy.medium } + results.count { decisionPolicy.low <= it.comparisonScore && it.comparisonScore < decisionPolicy.medium } _matchState.postValue( MatchState.Finished( diff --git a/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt b/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt index 9fa8cde69e..15cd6a0b2b 100644 --- a/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt +++ b/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt @@ -5,9 +5,10 @@ import com.google.common.truth.Truth.* import com.jraska.livedata.test import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.MatchComparisonResult -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.infra.config.store.models.DecisionPolicy @@ -82,7 +83,7 @@ internal class MatchViewModelTest { @Test fun `when setup is called, then view model becomes initialized`() = runTest { val responseItems = listOf( - MatchComparisonResult("1", 90f), + ComparisonResult("1", 90f), ) coEvery { faceMatcherUseCase.invoke(any(), any()) } returns flow { @@ -104,8 +105,12 @@ internal class MatchViewModelTest { viewModel.matchState.test() viewModel.setupMatch( MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf(getFaceSample()), + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "ROCv1", + templates = listOf(getFaceCapture()), + ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, flowType = FlowType.ENROL, queryForCandidates = mockk {}, @@ -134,13 +139,13 @@ internal class MatchViewModelTest { } returns DecisionPolicy(20, 35, 50) val responseItems = listOf( - MatchComparisonResult("1", 90f), - MatchComparisonResult("1", 80f), - MatchComparisonResult("1", 55f), - MatchComparisonResult("1", 40f), - MatchComparisonResult("1", 36f), - MatchComparisonResult("1", 20f), - MatchComparisonResult("1", 10f), + ComparisonResult("1", 90f), + ComparisonResult("1", 80f), + ComparisonResult("1", 55f), + ComparisonResult("1", 40f), + ComparisonResult("1", 36f), + ComparisonResult("1", 20f), + ComparisonResult("1", 10f), ) val batches = listOf( MatchBatchInfo( @@ -176,8 +181,12 @@ internal class MatchViewModelTest { val states = viewModel.matchState.test() viewModel.setupMatch( MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf(getFaceSample()), + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "ROCv1", + templates = listOf(getFaceCapture()), + ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, flowType = FlowType.ENROL, queryForCandidates = mockk {}, @@ -223,13 +232,13 @@ internal class MatchViewModelTest { } returns DecisionPolicy(200, 350, 500) val responseItems = listOf( - MatchComparisonResult("1", 900f), - MatchComparisonResult("1", 800f), - MatchComparisonResult("1", 550f), - MatchComparisonResult("1", 400f), - MatchComparisonResult("1", 360f), - MatchComparisonResult("1", 200f), - MatchComparisonResult("1", 100f), + ComparisonResult("1", 900f), + ComparisonResult("1", 800f), + ComparisonResult("1", 550f), + ComparisonResult("1", 400f), + ComparisonResult("1", 360f), + ComparisonResult("1", 200f), + ComparisonResult("1", 100f), ) val batches = listOf( MatchBatchInfo( @@ -267,8 +276,12 @@ internal class MatchViewModelTest { viewModel.setupMatch( MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf(getFingerprintSample()), + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "Secugen", + templates = listOf(getFingerprintTemplate()), + ), bioSdk = SECUGEN_SIM_MATCHER, flowType = FlowType.ENROL, queryForCandidates = mockk {}, @@ -314,8 +327,8 @@ internal class MatchViewModelTest { } returns null val responseItems = listOf( - MatchComparisonResult("1", 90f), - MatchComparisonResult("1", 10f), + ComparisonResult("1", 90f), + ComparisonResult("1", 10f), ) coEvery { faceMatcherUseCase.invoke(any(), any()) } returns flow { emit(MatcherUseCase.MatcherState.LoadingStarted(responseItems.size)) @@ -332,8 +345,12 @@ internal class MatchViewModelTest { val states = viewModel.matchState.test() viewModel.setupMatch( MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf(getFaceSample()), + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "ROC", + templates = listOf(getFaceCapture()), + ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, flowType = FlowType.ENROL, queryForCandidates = mockk {}, @@ -360,7 +377,7 @@ internal class MatchViewModelTest { emit(MatcherUseCase.MatcherState.CandidateLoaded) emit( MatcherUseCase.MatcherState.Success( - comparisonResults = listOf(MatchComparisonResult("1", 90f)), + comparisonResults = listOf(ComparisonResult("1", 90f)), totalCandidates = 1, matcherName = MATCHER_NAME, matchBatches = emptyList(), @@ -371,8 +388,12 @@ internal class MatchViewModelTest { val states = viewModel.matchState.test() val matchParams = MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf(getFaceSample()), + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "ROC", + templates = listOf(getFaceCapture()), + ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, flowType = FlowType.ENROL, queryForCandidates = mockk {}, @@ -391,19 +412,15 @@ internal class MatchViewModelTest { assertThat(states.valueHistory()).hasSize(4) } - private fun getFaceSample(): CaptureSample = CaptureSample( + private fun getFaceCapture(): BiometricTemplateCapture = BiometricTemplateCapture( captureEventId = UUID.randomUUID().toString(), - modality = Modality.FACE, template = Random.nextBytes(20), - format = "format", ) - private fun getFingerprintSample(): CaptureSample = CaptureSample( + private fun getFingerprintTemplate(): BiometricTemplateCapture = BiometricTemplateCapture( captureEventId = UUID.randomUUID().toString(), - modality = Modality.FINGERPRINT, template = Random.nextBytes(20), - format = "format", - identifier = SampleIdentifier.LEFT_3RD_FINGER, + identifier = TemplateIdentifier.LEFT_3RD_FINGER, ) companion object { diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt index 291f9ae6dd..b15d6ccc3e 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt @@ -8,8 +8,8 @@ import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.module.SimpleModule import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.response.AppErrorReason -import com.simprints.core.domain.sample.CaptureIdentity import com.simprints.core.domain.step.StepResult import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.serialization.TokenizationClassNameDeserializer @@ -256,7 +256,7 @@ internal class OrchestratorViewModel @Inject constructor( currentStep: Step, result: Serializable, ) { - if (currentStep.id == StepId.FACE_CAPTURE && result is CaptureIdentity) { + if (currentStep.id == StepId.FACE_CAPTURE && result is BiometricReferenceCapture) { val captureParams = currentStep.params?.let { it as? FaceCaptureParams } val matchingStep = steps.firstOrNull { step -> if (step.id != StepId.FACE_MATCHER) { @@ -270,14 +270,14 @@ internal class OrchestratorViewModel @Inject constructor( if (matchingStep != null) { val newPayload = matchingStep.params ?.let { it as? MatchStepStubPayload } - ?.toFaceStepArgs(result.referenceId, result.samples) + ?.toFaceStepArgs(result) if (newPayload != null) { matchingStep.params = newPayload } } } - if (currentStep.id == StepId.FINGERPRINT_CAPTURE && result is CaptureIdentity) { + if (currentStep.id == StepId.FINGERPRINT_CAPTURE && result is BiometricReferenceCapture) { val captureParams = currentStep.params?.let { it as? FingerprintCaptureParams } // Find the matching step for the same fingerprint SDK as there may be multiple match steps val matchingStep = steps.firstOrNull { step -> @@ -292,7 +292,7 @@ internal class OrchestratorViewModel @Inject constructor( if (matchingStep != null) { val newPayload = matchingStep.params ?.let { it as? MatchStepStubPayload } - ?.toFingerprintStepArgs(result.referenceId, result.samples) + ?.toFingerprintStepArgs(result) if (newPayload != null) { matchingStep.params = newPayload @@ -309,26 +309,11 @@ internal class OrchestratorViewModel @Inject constructor( result: StepResult, ) { if (currentStep.id !in listOf(StepId.FACE_CAPTURE, StepId.FINGERPRINT_CAPTURE)) return + if (result !is BiometricReferenceCapture) return + val step = steps.firstOrNull { it.id == StepId.EXTERNAL_CREDENTIAL } ?: return val params = step.params as? ExternalCredentialParams ?: return - val updatedParams = when { - currentStep.id == StepId.FACE_CAPTURE && result is CaptureIdentity -> { - params.copy( - probeReferenceId = result.referenceId, - samples = params.samples + (Modality.FACE to result.samples), - ) - } - - currentStep.id == StepId.FINGERPRINT_CAPTURE && result is CaptureIdentity -> { - params.copy( - probeReferenceId = result.referenceId, - samples = params.samples + (Modality.FINGERPRINT to result.samples), - ) - } - - else -> params - } - step.params = updatedParams + step.params = params.copy(probeReferences = params.probeReferences + listOf(result)) } fun setActionRequestFromJson(json: String) { diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/steps/MatchStepStubPayload.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/steps/MatchStepStubPayload.kt index 2698aa32f3..01418db726 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/steps/MatchStepStubPayload.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/steps/MatchStepStubPayload.kt @@ -2,11 +2,10 @@ package com.simprints.feature.orchestrator.steps import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.ModalitySdkType -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.step.StepParams import com.simprints.infra.enrolment.records.repository.domain.models.BiometricDataSource import com.simprints.infra.enrolment.records.repository.domain.models.SubjectQuery -import com.simprints.infra.matching.MatchParams import com.simprints.matcher.MatchContract /** @@ -21,24 +20,16 @@ internal data class MatchStepStubPayload( val biometricDataSource: BiometricDataSource, val bioSdk: ModalitySdkType, ) : StepParams { - fun toFaceStepArgs( - referenceId: String, - samples: List, - ) = MatchContract.getParams( - referenceId = referenceId, - probeSamples = samples, + fun toFaceStepArgs(probeReference: BiometricReferenceCapture) = MatchContract.getParams( + probeReference = probeReference, bioSdk = bioSdk, flowType = flowType, subjectQuery = subjectQuery, biometricDataSource = biometricDataSource, ) - fun toFingerprintStepArgs( - referenceId: String, - samples: List, - ) = MatchContract.getParams( - referenceId = referenceId, - probeSamples = samples, + fun toFingerprintStepArgs(probeReference: BiometricReferenceCapture) = MatchContract.getParams( + probeReference = probeReference, bioSdk = bioSdk, flowType = flowType, subjectQuery = subjectQuery, diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/steps/Step.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/steps/Step.kt index 3051833d3e..fc3a14bacd 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/steps/Step.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/steps/Step.kt @@ -5,9 +5,10 @@ import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonSubTypes import com.fasterxml.jackson.annotation.JsonTypeInfo import com.simprints.core.domain.common.AgeGroup -import com.simprints.core.domain.sample.CaptureIdentity -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.step.StepParams import com.simprints.core.domain.step.StepResult import com.simprints.face.capture.FaceCaptureParams @@ -59,9 +60,10 @@ import java.io.Serializable JsonSubTypes.Type(value = ExternalCredentialSearchResult::class, name = "ExternalCredentialSearchResult"), JsonSubTypes.Type(value = CredentialMatch::class, name = " CredentialMatch"), // Common data types - JsonSubTypes.Type(value = CaptureIdentity::class, name = "CaptureIdentity"), - JsonSubTypes.Type(value = CaptureSample::class, name = "CaptureSample"), - JsonSubTypes.Type(value = MatchComparisonResult::class, name = "MatchComparisonResult"), + JsonSubTypes.Type(value = BiometricReferenceCapture::class, name = "BiometricReferenceCapture"), + JsonSubTypes.Type(value = BiometricTemplateCapture::class, name = "BiometricTemplateCapture"), + JsonSubTypes.Type(value = BiometricTemplate::class, name = "BiometricTemplate"), + JsonSubTypes.Type(value = ComparisonResult::class, name = "ComparisonResult"), ) abstract class StepResultMixin : StepResult @@ -95,8 +97,10 @@ abstract class StepResultMixin : StepResult ), JsonSubTypes.Type(value = ExternalCredentialParams::class, name = "ExternalCredentialParams"), // Additional types that are used in top-level params - JsonSubTypes.Type(value = CaptureSample::class, name = "CaptureSample"), - JsonSubTypes.Type(value = MatchComparisonResult::class, name = "MatchComparisonResult"), + JsonSubTypes.Type(value = BiometricReferenceCapture::class, name = "BiometricReferenceCapture"), + JsonSubTypes.Type(value = BiometricTemplateCapture::class, name = "BiometricTemplateCapture"), + JsonSubTypes.Type(value = BiometricTemplate::class, name = "BiometricTemplate"), + JsonSubTypes.Type(value = ComparisonResult::class, name = "ComparisonResult"), JsonSubTypes.Type(value = BiometricDataSource::class, name = "BiometricDataSource"), JsonSubTypes.Type(value = BiometricDataSource.CommCare::class, name = "BiometricDataSource.CommCare"), JsonSubTypes.Type(value = BiometricDataSource.Simprints::class, name = "BiometricDataSource.Simprints"), diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/MapStepsForLastBiometricEnrolUseCase.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/MapStepsForLastBiometricEnrolUseCase.kt index 986164d220..52ab03c1eb 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/MapStepsForLastBiometricEnrolUseCase.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/MapStepsForLastBiometricEnrolUseCase.kt @@ -1,7 +1,7 @@ package com.simprints.feature.orchestrator.usecases -import com.simprints.core.domain.sample.CaptureIdentity -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.feature.enrollast.EnrolLastBiometricResult import com.simprints.feature.enrollast.EnrolLastBiometricStepResult import com.simprints.infra.matching.MatchResult @@ -12,17 +12,12 @@ import javax.inject.Inject internal class MapStepsForLastBiometricEnrolUseCase @Inject constructor() { operator fun invoke(results: List) = results.mapNotNull { result -> when (result) { - is EnrolLastBiometricResult -> EnrolLastBiometricStepResult.EnrolLastBiometricsResult( - result.newSubjectId, - ) + is EnrolLastBiometricResult -> EnrolLastBiometricStepResult.EnrolLastBiometricsResult(result.newSubjectId) - is CaptureIdentity -> EnrolLastBiometricStepResult.CaptureResult( - result.referenceId, - result.samples, - ) + is BiometricReferenceCapture -> EnrolLastBiometricStepResult.CaptureResult(result) is MatchResult -> EnrolLastBiometricStepResult.MatchResult( - result.results.map { MatchComparisonResult(it.subjectId, it.confidence) }, + result.results.map { ComparisonResult(it.subjectId, it.comparisonScore) }, result.sdk, ) diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateEnrolResponseUseCase.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateEnrolResponseUseCase.kt index 7ec8ae7237..d3f96aed6b 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateEnrolResponseUseCase.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateEnrolResponseUseCase.kt @@ -1,7 +1,7 @@ package com.simprints.feature.orchestrator.usecases.response +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.response.AppErrorReason -import com.simprints.core.domain.sample.CaptureIdentity import com.simprints.feature.externalcredential.ExternalCredentialSearchResult import com.simprints.feature.externalcredential.screens.search.model.toExternalCredential import com.simprints.infra.config.store.models.Project @@ -34,7 +34,7 @@ internal class CreateEnrolResponseUseCase @Inject constructor( projectId = request.projectId, attendantId = request.userId, moduleId = request.moduleId, - captures = results.filterIsInstance(), + captures = results.filterIsInstance(), externalCredential = externalCredential, ) enrolSubject(subject, project) diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateIdentifyResponseUseCase.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateIdentifyResponseUseCase.kt index 6170bdf803..4c6c0ad621 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateIdentifyResponseUseCase.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateIdentifyResponseUseCase.kt @@ -70,9 +70,9 @@ internal class CreateIdentifyResponseUseCase @Inject constructor( credentialSearchResult.matchResults.mapNotNull { credentialMatchResult -> val sdk = credentialMatchResult.bioSdk val policy = projectConfiguration.getModalitySdkConfig(sdk)?.decisionPolicy ?: return@mapNotNull null - val matchResult = credentialMatchResult.matchResult + val matchResult = credentialMatchResult.comparisonResult - sdk to AppMatchResult(matchResult.subjectId, matchResult.confidence, policy, true) + sdk to AppMatchResult(matchResult.subjectId, matchResult.comparisonScore, policy, true) } }.groupDescendingResultsBySdk() @@ -88,7 +88,7 @@ internal class CreateIdentifyResponseUseCase @Inject constructor( ?: return@flatMap emptyList() matchResult.results.map { - matchResult.sdk to AppMatchResult(it.subjectId, it.confidence, policy, false) + matchResult.sdk to AppMatchResult(it.subjectId, it.comparisonScore, policy, false) } }.groupDescendingResultsBySdk() diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateVerifyResponseUseCase.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateVerifyResponseUseCase.kt index ba6bc1ea25..cdf32e0549 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateVerifyResponseUseCase.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/CreateVerifyResponseUseCase.kt @@ -32,10 +32,10 @@ internal class CreateVerifyResponseUseCase @Inject constructor() { .filterIsInstance() .mapNotNull { matchResult -> projectConfiguration.getModalitySdkConfig(matchResult.sdk)?.let { sdkConfiguration -> - matchResult.results.maxByOrNull { it.confidence }?.let { + matchResult.results.maxByOrNull { it.comparisonScore }?.let { AppMatchResult( guid = it.subjectId, - confidenceScore = it.confidence, + confidenceScore = it.comparisonScore, decisionPolicy = sdkConfiguration.decisionPolicy, verificationMatchThreshold = sdkConfiguration.verificationMatchThreshold, isCredentialMatch = false, diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/IsNewEnrolmentUseCase.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/IsNewEnrolmentUseCase.kt index 674f501ff9..615b977d02 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/IsNewEnrolmentUseCase.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/usecases/response/IsNewEnrolmentUseCase.kt @@ -48,5 +48,5 @@ internal class IsNewEnrolmentUseCase @Inject constructor() { ?.decisionPolicy ?.medium ?.toFloat() - ?.let { threshold -> matchResult.results.isNotEmpty() && matchResult.results.all { it.confidence < threshold } } != false + ?.let { threshold -> matchResult.results.isNotEmpty() && matchResult.results.all { it.comparisonScore < threshold } } != false } diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt index fcf17fc263..e849a8a2cf 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt @@ -7,10 +7,10 @@ import com.jraska.livedata.test import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.response.AppErrorReason -import com.simprints.core.domain.sample.CaptureIdentity -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.step.StepParams import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.feature.consent.ConsentResult @@ -229,7 +229,7 @@ internal class OrchestratorViewModelTest { coEvery { mapRefusalOrErrorResult(any(), any()) } returns null viewModel.handleAction(mockk()) - viewModel.handleResult(CaptureIdentity("", Modality.FACE, emptyList())) + viewModel.handleResult(BiometricReferenceCapture("", Modality.FACE, "format", emptyList())) viewModel.currentStep.test().value().peekContent()?.let { step -> assertThat(step.id).isEqualTo(StepId.FACE_MATCHER) @@ -253,7 +253,7 @@ internal class OrchestratorViewModelTest { coEvery { mapRefusalOrErrorResult(any(), any()) } returns null viewModel.handleAction(mockk()) - viewModel.handleResult(CaptureIdentity("", Modality.FINGERPRINT, emptyList())) + viewModel.handleResult(BiometricReferenceCapture("", Modality.FINGERPRINT, "format", emptyList())) viewModel.currentStep.test().value().peekContent()?.let { step -> assertThat(step.id).isEqualTo(StepId.FINGERPRINT_MATCHER) @@ -300,32 +300,27 @@ internal class OrchestratorViewModelTest { ) coEvery { mapRefusalOrErrorResult(any(), any()) } returns null val format = "SimMatcher" - val sample1 = CaptureSample( + val capture1 = BiometricTemplateCapture( captureEventId = GUID1, - modality = Modality.FINGERPRINT, - identifier = SampleIdentifier.LEFT_INDEX_FINGER, + identifier = TemplateIdentifier.LEFT_INDEX_FINGER, template = ByteArray(0), - format = format, ) - val sample2 = CaptureSample( + val capture2 = BiometricTemplateCapture( captureEventId = GUID2, - modality = Modality.FINGERPRINT, - identifier = SampleIdentifier.LEFT_THUMB, + identifier = TemplateIdentifier.LEFT_THUMB, template = ByteArray(0), - format = format, ) viewModel.handleAction(mockk()) - viewModel.handleResult(CaptureIdentity("", Modality.FINGERPRINT, listOf(sample1, sample2))) + viewModel.handleResult(BiometricReferenceCapture("", Modality.FINGERPRINT, format, listOf(capture1, capture2))) viewModel.currentStep.test().value().peekContent()?.let { step -> assertThat(step.id).isEqualTo(StepId.FINGERPRINT_MATCHER) val params = step.params?.let { it as? MatchParams } assertThat(params).isNotNull() assertThat(params?.bioSdk).isEqualTo(SECUGEN_SIM_MATCHER) - assertThat(params?.probeSamples?.size).isEqualTo(2) - assertThat(params?.probeSamples?.get(0)?.format).isEqualTo(format) - assertThat(params?.probeSamples?.get(1)?.format).isEqualTo(format) + assertThat(params?.probeReference?.templates?.size).isEqualTo(2) + assertThat(params?.probeReference?.format).isEqualTo(format) } } @@ -422,7 +417,7 @@ internal class OrchestratorViewModelTest { ) viewModel.handleAction(mockk()) - viewModel.handleResult(CaptureIdentity("", Modality.FINGERPRINT, emptyList())) + viewModel.handleResult(BiometricReferenceCapture("", Modality.FINGERPRINT, "format", emptyList())) viewModel.currentStep.test().value().peekContent()?.let { step -> assertThat(step.params?.let { it as? EnrolLastBiometricParams }?.steps).containsExactly(mockEnrolLastStep) @@ -432,30 +427,26 @@ internal class OrchestratorViewModelTest { @Test fun `Updates external credential step payload with fingerprint samples when receiving fingerprint capture result`() = runTest { val fingerprintReferenceId = "fingerprintReferenceId" - val fingerId1 = SampleIdentifier.LEFT_INDEX_FINGER - val fingerId2 = SampleIdentifier.RIGHT_THUMB + val fingerId1 = TemplateIdentifier.LEFT_INDEX_FINGER + val fingerId2 = TemplateIdentifier.RIGHT_THUMB val template1 = ByteArray(10) val template2 = ByteArray(20) val format1 = "format1" val format2 = "format2" - val fingerprintSample1 = CaptureSample( + val fingerprintCapture1 = BiometricTemplateCapture( captureEventId = GUID1, - modality = Modality.FINGERPRINT, identifier = fingerId1, template = template1, - format = format1, ) - val fingerprintSample2 = CaptureSample( + val fingerprintCapture2 = BiometricTemplateCapture( captureEventId = GUID2, - modality = Modality.FINGERPRINT, identifier = fingerId2, template = template2, - format = format2, ) val externalCredentialParams = mockk(relaxed = true) { - every { copy(probeReferenceId = any(), samples = any()) } returns this + every { copy(probeReferences = any()) } returns this } coEvery { stepsBuilder.build(any(), any(), any(), any()) } returns listOf( @@ -466,18 +457,25 @@ internal class OrchestratorViewModelTest { viewModel.handleAction(mockk()) viewModel.handleResult( - CaptureIdentity(fingerprintReferenceId, Modality.FINGERPRINT, listOf(fingerprintSample1, fingerprintSample2)), + BiometricReferenceCapture( + fingerprintReferenceId, + Modality.FINGERPRINT, + format1, + listOf(fingerprintCapture1, fingerprintCapture2), + ), ) - val expectedFingerprintSamples = listOf( - CaptureSample(GUID1, Modality.FINGERPRINT, format1, template1, fingerId1), - CaptureSample(GUID2, Modality.FINGERPRINT, format2, template2, fingerId2), - ) + val expectedFingerprintReference = + BiometricReferenceCapture( + fingerprintReferenceId, + Modality.FINGERPRINT, + format1, + listOf(fingerprintCapture1, fingerprintCapture2), + ) verify { externalCredentialParams.copy( - probeReferenceId = fingerprintReferenceId, - samples = mapOf(Modality.FINGERPRINT to expectedFingerprintSamples), + probeReferences = listOf(expectedFingerprintReference), ) } } diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/cache/OrchestratorCacheIntegrationTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/cache/OrchestratorCacheIntegrationTest.kt index 93436264d1..c5c7091d81 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/cache/OrchestratorCacheIntegrationTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/cache/OrchestratorCacheIntegrationTest.kt @@ -7,11 +7,11 @@ import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredentialType +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.response.AppErrorReason -import com.simprints.core.domain.sample.CaptureIdentity -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.MatchComparisonResult -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw @@ -126,23 +126,25 @@ class OrchestratorCacheIntegrationTest { moduleId = TokenizableString.Raw("value"), steps = listOf( EnrolLastBiometricStepResult.CaptureResult( - "referenceId", - listOf( - CaptureSample( - captureEventId = GUID1, - identifier = SampleIdentifier.LEFT_THUMB, - template = byteArrayOf(1, 2, 3), - modality = Modality.FINGERPRINT, - format = "format", + BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = GUID1, + identifier = TemplateIdentifier.LEFT_THUMB, + template = byteArrayOf(1, 2, 3), + ), ), ), ), EnrolLastBiometricStepResult.MatchResult( - listOf(MatchComparisonResult("subjectId", 0.5f)), + listOf(ComparisonResult("subjectId", 0.5f)), FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), EnrolLastBiometricStepResult.MatchResult( - listOf(MatchComparisonResult("subjectId", 0.5f)), + listOf(ComparisonResult("subjectId", 0.5f)), FaceConfiguration.BioSdk.RANK_ONE, ), EnrolLastBiometricStepResult.EnrolLastBiometricsResult("subjectId"), @@ -184,24 +186,28 @@ class OrchestratorCacheIntegrationTest { subjectId = "subjectId", flowType = FlowType.IDENTIFY, ageGroup = AgeGroup(1, 2), - probeReferenceId = "referenceId", - samples = mapOf( - Modality.FACE to listOf( - CaptureSample( - captureEventId = GUID1, - identifier = SampleIdentifier.LEFT_THUMB, - template = byteArrayOf(1, 2, 3), - modality = Modality.FACE, - format = "format", + probeReferences = listOf( + BiometricReferenceCapture( + referenceId = "referenceId1", + modality = Modality.FINGERPRINT, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "captureEvent1", + identifier = TemplateIdentifier.LEFT_THUMB, + template = byteArrayOf(1, 2, 3), + ), ), ), - Modality.FINGERPRINT to listOf( - CaptureSample( - captureEventId = GUID1, - identifier = SampleIdentifier.LEFT_THUMB, - template = byteArrayOf(1, 2, 3), - modality = Modality.FINGERPRINT, - format = "format", + BiometricReferenceCapture( + referenceId = "referenceId1", + modality = Modality.FACE, + format = "format2", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "captureEvent2", + template = byteArrayOf(2, 3, 4), + ), ), ), ), @@ -223,7 +229,7 @@ class OrchestratorCacheIntegrationTest { matchResults = listOf( CredentialMatch( credential = "credential".asTokenizableEncrypted(), - matchResult = MatchComparisonResult("subjectId", 0.5f), + comparisonResult = ComparisonResult("subjectId", 0.5f), verificationThreshold = 55f, bioSdk = FaceConfiguration.BioSdk.RANK_ONE, ), @@ -250,20 +256,19 @@ class OrchestratorCacheIntegrationTest { destinationId = 4, params = FingerprintCaptureParams( flowType = FlowType.ENROL, - fingerprintsToCapture = listOf(SampleIdentifier.LEFT_4TH_FINGER), + fingerprintsToCapture = listOf(TemplateIdentifier.LEFT_4TH_FINGER), fingerprintSDK = FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), status = StepStatus.COMPLETED, - result = CaptureIdentity( + result = BiometricReferenceCapture( "", modality = Modality.FINGERPRINT, - samples = listOf( - CaptureSample( + format = "format", + templates = listOf( + BiometricTemplateCapture( captureEventId = GUID1, - identifier = SampleIdentifier.LEFT_THUMB, + identifier = TemplateIdentifier.LEFT_THUMB, template = byteArrayOf(1, 2, 3), - modality = Modality.FINGERPRINT, - format = "format", ), ), ), @@ -273,24 +278,26 @@ class OrchestratorCacheIntegrationTest { navigationActionId = 3, destinationId = 4, params = MatchParams( - probeReferenceId = GUID1, flowType = FlowType.IDENTIFY, queryForCandidates = SubjectQuery(), biometricDataSource = BiometricDataSource.CommCare("name"), bioSdk = FingerprintConfiguration.BioSdk.NEC, - probeSamples = listOf( - CaptureSample( - captureEventId = GUID1, - identifier = SampleIdentifier.LEFT_THUMB, - template = byteArrayOf(1, 2, 3), - modality = Modality.FINGERPRINT, - format = "format", + probeReference = BiometricReferenceCapture( + referenceId = GUID1, + modality = Modality.FINGERPRINT, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "captureEvent1", + identifier = TemplateIdentifier.LEFT_THUMB, + template = byteArrayOf(1, 2, 3), + ), ), ), ), status = StepStatus.COMPLETED, result = MatchResult( - listOf(MatchComparisonResult("subjectId", 0.5f)), + listOf(ComparisonResult("subjectId", 0.5f)), FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), ), @@ -314,16 +321,14 @@ class OrchestratorCacheIntegrationTest { destinationId = 6, params = FaceCaptureParams(3, FaceConfiguration.BioSdk.RANK_ONE), status = StepStatus.COMPLETED, - result = CaptureIdentity( + result = BiometricReferenceCapture( "", modality = Modality.FACE, - samples = listOf( - CaptureSample( + format = "ROC", + templates = listOf( + BiometricTemplateCapture( captureEventId = GUID1, - identifier = SampleIdentifier.LEFT_THUMB, template = byteArrayOf(1, 2, 3), - modality = Modality.FACE, - format = "ROC", ), ), ), @@ -333,24 +338,25 @@ class OrchestratorCacheIntegrationTest { navigationActionId = 3, destinationId = 4, params = MatchParams( - probeReferenceId = GUID1, flowType = FlowType.IDENTIFY, queryForCandidates = SubjectQuery(), biometricDataSource = BiometricDataSource.Simprints, bioSdk = FaceConfiguration.BioSdk.RANK_ONE, - probeSamples = listOf( - CaptureSample( - captureEventId = GUID1, - identifier = SampleIdentifier.LEFT_THUMB, - template = byteArrayOf(1, 2, 3), - modality = Modality.FACE, - format = "format", + probeReference = BiometricReferenceCapture( + referenceId = GUID1, + modality = Modality.FACE, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "captureEvent1", + template = byteArrayOf(1, 2, 3), + ), ), ), ), status = StepStatus.COMPLETED, result = MatchResult( - listOf(MatchComparisonResult("subjectId", 0.5f)), + listOf(ComparisonResult("subjectId", 0.5f)), FaceConfiguration.BioSdk.RANK_ONE, ), ), diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/MapRefusalOrErrorResultUseCaseTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/MapRefusalOrErrorResultUseCaseTest.kt index 18606bf17b..95921449d9 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/MapRefusalOrErrorResultUseCaseTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/MapRefusalOrErrorResultUseCaseTest.kt @@ -3,7 +3,7 @@ package com.simprints.feature.orchestrator.usecases import com.google.common.truth.Truth.* import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureIdentity +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.feature.alert.AlertResult import com.simprints.feature.exitform.ExitFormOption import com.simprints.feature.exitform.ExitFormResult @@ -62,7 +62,7 @@ class MapRefusalOrErrorResultUseCaseTest { listOf( FetchSubjectResult(found = true), SetupResult(isSuccess = true), - CaptureIdentity("", modality = Modality.FACE, emptyList()), + BiometricReferenceCapture("", modality = Modality.FACE, "format", emptyList()), ).forEach { result -> assertThat(useCase(result, mockk())).isNull() } } diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/MapStepsForLastBiometricEnrolUseCaseTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/MapStepsForLastBiometricEnrolUseCaseTest.kt index 0e0a2fb096..3d3d87b7e0 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/MapStepsForLastBiometricEnrolUseCaseTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/MapStepsForLastBiometricEnrolUseCaseTest.kt @@ -2,14 +2,13 @@ package com.simprints.feature.orchestrator.usecases import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureIdentity -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.feature.enrollast.EnrolLastBiometricResult import com.simprints.feature.enrollast.EnrolLastBiometricStepResult import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.events.sampledata.SampleDefaults.GUID1 import com.simprints.infra.matching.MatchResult import org.junit.Before import org.junit.Test @@ -45,17 +44,16 @@ internal class MapStepsForLastBiometricEnrolUseCaseTest { } @Test - fun `maps face CaptureIdentity correctly`() { + fun `maps face BiometricReferenceCapture correctly`() { val result = useCase( listOf( - CaptureIdentity( + BiometricReferenceCapture( "referenceId", modality = Modality.FACE, - samples = listOf( - CaptureSample( - captureEventId = GUID1, - modality = Modality.FACE, - format = "format", + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "captureId", template = byteArrayOf(), ), ), @@ -65,13 +63,15 @@ internal class MapStepsForLastBiometricEnrolUseCaseTest { assertThat(result.first()).isEqualTo( EnrolLastBiometricStepResult.CaptureResult( - referenceId = "referenceId", - results = listOf( - CaptureSample( - captureEventId = "captureId", - template = byteArrayOf(), - format = "format", - modality = Modality.FACE, + result = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "captureId", + template = byteArrayOf(), + ), ), ), ), @@ -95,16 +95,15 @@ internal class MapStepsForLastBiometricEnrolUseCaseTest { fun `maps fingerprint CaptureIdentity correctly`() { val result = useCase( listOf( - CaptureIdentity( + BiometricReferenceCapture( "referenceId", modality = Modality.FINGERPRINT, - samples = listOf( - CaptureSample( - captureEventId = GUID1, - modality = Modality.FINGERPRINT, - format = "format", + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "captureId", template = byteArrayOf(), - identifier = SampleIdentifier.RIGHT_THUMB, + identifier = TemplateIdentifier.RIGHT_THUMB, ), ), ), @@ -113,14 +112,16 @@ internal class MapStepsForLastBiometricEnrolUseCaseTest { assertThat(result.first()).isEqualTo( EnrolLastBiometricStepResult.CaptureResult( - referenceId = "referenceId", - results = listOf( - CaptureSample( - captureEventId = "captureId", - template = byteArrayOf(), - format = "format", - identifier = SampleIdentifier.RIGHT_THUMB, - modality = Modality.FINGERPRINT, + result = BiometricReferenceCapture( + "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "captureId", + template = byteArrayOf(), + identifier = TemplateIdentifier.RIGHT_THUMB, + ), ), ), ), diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateEnrolResponseUseCaseTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateEnrolResponseUseCaseTest.kt index 320fec47de..b6d51b6414 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateEnrolResponseUseCaseTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateEnrolResponseUseCaseTest.kt @@ -3,7 +3,7 @@ package com.simprints.feature.orchestrator.usecases.response import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.CaptureIdentity +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.feature.externalcredential.ExternalCredentialSearchResult @@ -68,8 +68,8 @@ internal class CreateEnrolResponseUseCaseTest { useCase( request = action, results = listOf( - CaptureIdentity("", Modality.FINGERPRINT, emptyList()), - CaptureIdentity("", Modality.FACE, emptyList()), + BiometricReferenceCapture("", Modality.FINGERPRINT, "", emptyList()), + BiometricReferenceCapture("", Modality.FACE, "", emptyList()), mockk(), ), project = project, @@ -120,7 +120,7 @@ internal class CreateEnrolResponseUseCaseTest { useCase( request = action, results = listOf( - CaptureIdentity("", Modality.FINGERPRINT, emptyList()), + BiometricReferenceCapture("", Modality.FINGERPRINT, "", emptyList()), credentialSearchResult, ), project = project, diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateIdentifyResponseUseCaseTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateIdentifyResponseUseCaseTest.kt index 649c14d63a..3ec5ae57cf 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateIdentifyResponseUseCaseTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateIdentifyResponseUseCaseTest.kt @@ -1,7 +1,7 @@ package com.simprints.feature.orchestrator.usecases.response import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.feature.externalcredential.ExternalCredentialSearchResult import com.simprints.feature.externalcredential.model.CredentialMatch import com.simprints.infra.config.store.models.DecisionPolicy @@ -207,16 +207,16 @@ class CreateIdentifyResponseUseCaseTest { val faceMatches = listOf( mockk { every { verificationThreshold } returns 0.0f - every { matchResult } returns MatchComparisonResult( + every { comparisonResult } returns ComparisonResult( subjectId = faceSmallConfidence, - confidence = smallConfidence, + comparisonScore = smallConfidence, ) every { bioSdk } returns FaceConfiguration.BioSdk.RANK_ONE }, mockk { - every { matchResult } returns MatchComparisonResult( + every { comparisonResult } returns ComparisonResult( subjectId = faceBigConfidence, - confidence = bigConfidence, + comparisonScore = bigConfidence, ) every { bioSdk } returns FaceConfiguration.BioSdk.RANK_ONE }, @@ -224,9 +224,9 @@ class CreateIdentifyResponseUseCaseTest { val fingerprintMatches = listOf( mockk { - every { matchResult } returns MatchComparisonResult( + every { comparisonResult } returns ComparisonResult( subjectId = "fingerprintSubjectId", - confidence = 90f, + comparisonScore = 90f, ) every { bioSdk } returns FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER }, @@ -260,16 +260,16 @@ class CreateIdentifyResponseUseCaseTest { val fingerprintMatches = listOf( mockk { every { verificationThreshold } returns 0.0f - every { matchResult } returns MatchComparisonResult( + every { comparisonResult } returns ComparisonResult( subjectId = fingerprintSmallConfidence, - confidence = smallConfidence, + comparisonScore = smallConfidence, ) every { bioSdk } returns FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER }, mockk { - every { matchResult } returns MatchComparisonResult( + every { comparisonResult } returns ComparisonResult( subjectId = fingerprintBigConfidence, - confidence = bigConfidence, + comparisonScore = bigConfidence, ) every { bioSdk } returns FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER }, @@ -277,9 +277,9 @@ class CreateIdentifyResponseUseCaseTest { val faceMatches = listOf( mockk { - every { matchResult } returns MatchComparisonResult( + every { comparisonResult } returns ComparisonResult( subjectId = "faceSubjectId", - confidence = 90f, + comparisonScore = 90f, ) every { bioSdk } returns FaceConfiguration.BioSdk.RANK_ONE }, @@ -314,9 +314,9 @@ class CreateIdentifyResponseUseCaseTest { val credentialFaceMatches = listOf( mockk { - every { matchResult } returns MatchComparisonResult( + every { comparisonResult } returns ComparisonResult( subjectId = sharedGuid, - confidence = credentialConfidence, + comparisonScore = credentialConfidence, ) every { bioSdk } returns FaceConfiguration.BioSdk.RANK_ONE }, @@ -335,7 +335,7 @@ class CreateIdentifyResponseUseCaseTest { every { matchResults } returns credentialFaceMatches }, MatchResult( - listOf(MatchComparisonResult(subjectId = sharedGuid, confidence = faceConfidence)), + listOf(ComparisonResult(subjectId = sharedGuid, comparisonScore = faceConfidence)), FaceConfiguration.BioSdk.RANK_ONE, ), ), @@ -355,9 +355,9 @@ class CreateIdentifyResponseUseCaseTest { val credentialFingerprintMatches = listOf( mockk { every { verificationThreshold } returns 0.0f - every { matchResult } returns MatchComparisonResult( + every { comparisonResult } returns ComparisonResult( subjectId = sharedGuid, - confidence = credentialConfidence, + comparisonScore = credentialConfidence, ) every { bioSdk } returns FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER }, @@ -376,7 +376,7 @@ class CreateIdentifyResponseUseCaseTest { every { matchResults } returns credentialFingerprintMatches }, MatchResult( - listOf(MatchComparisonResult(subjectId = sharedGuid, confidence = fingerprintConfidence)), + listOf(ComparisonResult(subjectId = sharedGuid, comparisonScore = fingerprintConfidence)), FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), ), @@ -388,12 +388,12 @@ class CreateIdentifyResponseUseCaseTest { } private fun createFaceMatchResult(vararg confidences: Float): Serializable = MatchResult( - confidences.mapIndexed { i, confidence -> MatchComparisonResult(subjectId = "$i", confidence = confidence) }, + confidences.mapIndexed { i, confidence -> ComparisonResult(subjectId = "$i", comparisonScore = confidence) }, FaceConfiguration.BioSdk.RANK_ONE, ) private fun createFingerprintMatchResult(vararg confidences: Float): Serializable = MatchResult( - confidences.mapIndexed { i, confidence -> MatchComparisonResult(subjectId = "$i", confidence = confidence) }, + confidences.mapIndexed { i, confidence -> ComparisonResult(subjectId = "$i", comparisonScore = confidence) }, FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ) } diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateVerifyResponseUseCaseTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateVerifyResponseUseCaseTest.kt index 15d982fd83..53da0345d5 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateVerifyResponseUseCaseTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/CreateVerifyResponseUseCaseTest.kt @@ -1,7 +1,7 @@ package com.simprints.feature.orchestrator.usecases.response import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.infra.config.store.models.DecisionPolicy import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration @@ -248,12 +248,12 @@ class CreateVerifyResponseUseCaseTest { } private fun createFingerprintMatchResult(vararg confidences: Float): Serializable = MatchResult( - confidences.map { MatchComparisonResult(subjectId = "1", confidence = it) }, + confidences.map { ComparisonResult(subjectId = "1", comparisonScore = it) }, FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ) private fun createFaceMatchResult(vararg confidences: Float): Serializable = MatchResult( - confidences.map { MatchComparisonResult(subjectId = "1", confidence = it) }, + confidences.map { ComparisonResult(subjectId = "1", comparisonScore = it) }, FaceConfiguration.BioSdk.RANK_ONE, ) } diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/IsNewEnrolmentUseCaseTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/IsNewEnrolmentUseCaseTest.kt index 50d74b0669..1b2249418f 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/IsNewEnrolmentUseCaseTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/response/IsNewEnrolmentUseCaseTest.kt @@ -1,7 +1,7 @@ package com.simprints.feature.orchestrator.usecases.response import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.feature.externalcredential.ExternalCredentialSearchResult import com.simprints.feature.externalcredential.model.CredentialMatch import com.simprints.infra.config.store.models.DecisionPolicy @@ -53,7 +53,7 @@ internal class IsNewEnrolmentUseCaseTest { projectConfiguration, listOf( MatchResult( - listOf(MatchComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), + listOf(ComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), ), @@ -70,7 +70,7 @@ internal class IsNewEnrolmentUseCaseTest { projectConfiguration, listOf( MatchResult( - listOf(MatchComparisonResult("", HIGHER_THAN_MEDIUM_SCORE)), + listOf(ComparisonResult("", HIGHER_THAN_MEDIUM_SCORE)), FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), ), @@ -85,7 +85,7 @@ internal class IsNewEnrolmentUseCaseTest { assertThat( useCase( projectConfiguration, - listOf(MatchResult(listOf(MatchComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE)), + listOf(MatchResult(listOf(ComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE)), ), ).isTrue() } @@ -97,7 +97,7 @@ internal class IsNewEnrolmentUseCaseTest { assertThat( useCase( projectConfiguration, - listOf(MatchResult(listOf(MatchComparisonResult("", HIGHER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE)), + listOf(MatchResult(listOf(ComparisonResult("", HIGHER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE)), ), ).isFalse() } @@ -111,10 +111,10 @@ internal class IsNewEnrolmentUseCaseTest { projectConfiguration, listOf( MatchResult( - listOf(MatchComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), + listOf(ComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), - MatchResult(listOf(MatchComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE), + MatchResult(listOf(ComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE), ), ), ).isTrue() @@ -129,10 +129,10 @@ internal class IsNewEnrolmentUseCaseTest { projectConfiguration, listOf( MatchResult( - listOf(MatchComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), + listOf(ComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), - MatchResult(listOf(MatchComparisonResult("", HIGHER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE), + MatchResult(listOf(ComparisonResult("", HIGHER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE), ), ), ).isFalse() @@ -147,10 +147,10 @@ internal class IsNewEnrolmentUseCaseTest { projectConfiguration, listOf( MatchResult( - listOf(MatchComparisonResult("", HIGHER_THAN_MEDIUM_SCORE)), + listOf(ComparisonResult("", HIGHER_THAN_MEDIUM_SCORE)), FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, ), - MatchResult(listOf(MatchComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE), + MatchResult(listOf(ComparisonResult("", LOWER_THAN_MEDIUM_SCORE)), FaceConfiguration.BioSdk.RANK_ONE), ), ), ).isFalse() @@ -162,9 +162,9 @@ internal class IsNewEnrolmentUseCaseTest { val credentialMatches = listOf( mockk { - every { matchResult } returns mockk { + every { comparisonResult } returns mockk { every { subjectId } returns "subjectId" - every { confidence } returns 50f + every { comparisonScore } returns 50f } every { bioSdk } returns FaceConfiguration.BioSdk.RANK_ONE }, diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/steps/BuildStepsUseCaseTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/steps/BuildStepsUseCaseTest.kt index 83098ec320..a4fb2cce35 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/steps/BuildStepsUseCaseTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/usecases/steps/BuildStepsUseCaseTest.kt @@ -4,7 +4,7 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential import com.simprints.feature.orchestrator.cache.OrchestratorCache import com.simprints.feature.orchestrator.exceptions.SubjectAgeNotSupportedException @@ -75,16 +75,16 @@ class BuildStepsUseCaseTest { ) every { secugenSimMatcher.fingersToCapture } returns listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_THUMB, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_THUMB, ) every { secugenSimMatcher.allowedAgeRange } returns AgeGroup(0, null) every { projectConfiguration.fingerprint?.secugenSimMatcher } returns secugenSimMatcher every { projectConfiguration.fingerprint?.getSdkConfiguration(SECUGEN_SIM_MATCHER) } returns secugenSimMatcher every { nec.fingersToCapture } returns listOf( - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_INDEX_FINGER, ) every { nec.allowedAgeRange } returns AgeGroup(0, null) every { projectConfiguration.fingerprint?.nec } returns nec diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/FingerprintCaptureContract.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/FingerprintCaptureContract.kt index e9ef9f00d7..b819dd0a4a 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/FingerprintCaptureContract.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/FingerprintCaptureContract.kt @@ -1,7 +1,7 @@ package com.simprints.fingerprint.capture import com.simprints.core.domain.common.FlowType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.config.store.models.FingerprintConfiguration object FingerprintCaptureContract { @@ -9,7 +9,7 @@ object FingerprintCaptureContract { fun getParams( flowType: FlowType, - fingers: List, + fingers: List, fingerprintSDK: FingerprintConfiguration.BioSdk, ) = FingerprintCaptureParams(flowType, fingers, fingerprintSDK) } diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/FingerprintCaptureParams.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/FingerprintCaptureParams.kt index 84f9f6e6e4..d8e4c8d45e 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/FingerprintCaptureParams.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/FingerprintCaptureParams.kt @@ -2,13 +2,13 @@ package com.simprints.fingerprint.capture import androidx.annotation.Keep import com.simprints.core.domain.common.FlowType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.step.StepParams import com.simprints.infra.config.store.models.FingerprintConfiguration @Keep data class FingerprintCaptureParams( val flowType: FlowType, - val fingerprintsToCapture: List, + val fingerprintsToCapture: List, val fingerprintSDK: FingerprintConfiguration.BioSdk, ) : StepParams diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/models/CaptureId.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/models/CaptureId.kt index c692dc0eb0..5c9af7e9b9 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/models/CaptureId.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/models/CaptureId.kt @@ -1,8 +1,8 @@ package com.simprints.fingerprint.capture.models -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier internal data class CaptureId( - val finger: SampleIdentifier, + val finger: TemplateIdentifier, val captureIndex: Int, ) diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/resources/FingerIdentifierResources.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/resources/FingerIdentifierResources.kt index ea989b61a1..8f9e7a088a 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/resources/FingerIdentifierResources.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/resources/FingerIdentifierResources.kt @@ -2,39 +2,39 @@ package com.simprints.fingerprint.capture.resources import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.fingerprint.capture.R import com.simprints.infra.uibase.annotations.ExcludedFromGeneratedTestCoverageReports import com.simprints.infra.resources.R as IDR @ExcludedFromGeneratedTestCoverageReports("UI code") @DrawableRes -internal fun SampleIdentifier.fingerDrawable(): Int = when (this) { - SampleIdentifier.RIGHT_5TH_FINGER -> R.drawable.hand_bb_r5_c4 - SampleIdentifier.RIGHT_4TH_FINGER -> R.drawable.hand_bb_r4_c4 - SampleIdentifier.RIGHT_3RD_FINGER -> R.drawable.hand_bb_r3_c4 - SampleIdentifier.RIGHT_INDEX_FINGER -> R.drawable.hand_bb_r2_c4 - SampleIdentifier.RIGHT_THUMB -> R.drawable.hand_bb_r1_c4 - SampleIdentifier.LEFT_THUMB -> R.drawable.hand_bb_l1_c4 - SampleIdentifier.LEFT_INDEX_FINGER -> R.drawable.hand_bb_l2_c4 - SampleIdentifier.LEFT_3RD_FINGER -> R.drawable.hand_bb_l3_c4 - SampleIdentifier.LEFT_4TH_FINGER -> R.drawable.hand_bb_l4_c4 - SampleIdentifier.LEFT_5TH_FINGER -> R.drawable.hand_bb_l5_c4 - SampleIdentifier.NONE -> throw IllegalArgumentException("Must be a finger sample identifier") +internal fun TemplateIdentifier.fingerDrawable(): Int = when (this) { + TemplateIdentifier.RIGHT_5TH_FINGER -> R.drawable.hand_bb_r5_c4 + TemplateIdentifier.RIGHT_4TH_FINGER -> R.drawable.hand_bb_r4_c4 + TemplateIdentifier.RIGHT_3RD_FINGER -> R.drawable.hand_bb_r3_c4 + TemplateIdentifier.RIGHT_INDEX_FINGER -> R.drawable.hand_bb_r2_c4 + TemplateIdentifier.RIGHT_THUMB -> R.drawable.hand_bb_r1_c4 + TemplateIdentifier.LEFT_THUMB -> R.drawable.hand_bb_l1_c4 + TemplateIdentifier.LEFT_INDEX_FINGER -> R.drawable.hand_bb_l2_c4 + TemplateIdentifier.LEFT_3RD_FINGER -> R.drawable.hand_bb_l3_c4 + TemplateIdentifier.LEFT_4TH_FINGER -> R.drawable.hand_bb_l4_c4 + TemplateIdentifier.LEFT_5TH_FINGER -> R.drawable.hand_bb_l5_c4 + TemplateIdentifier.NONE -> throw IllegalArgumentException("Must be a finger sample identifier") } @ExcludedFromGeneratedTestCoverageReports("UI code") @StringRes -internal fun SampleIdentifier.nameTextId(): Int = when (this) { - SampleIdentifier.RIGHT_5TH_FINGER -> IDR.string.fingerprint_capture_finger_r_5 - SampleIdentifier.RIGHT_4TH_FINGER -> IDR.string.fingerprint_capture_finger_r_4 - SampleIdentifier.RIGHT_3RD_FINGER -> IDR.string.fingerprint_capture_finger_r_3 - SampleIdentifier.RIGHT_INDEX_FINGER -> IDR.string.fingerprint_capture_finger_r_2 - SampleIdentifier.RIGHT_THUMB -> IDR.string.fingerprint_capture_finger_r_1 - SampleIdentifier.LEFT_THUMB -> IDR.string.fingerprint_capture_finger_l_1 - SampleIdentifier.LEFT_INDEX_FINGER -> IDR.string.fingerprint_capture_finger_l_2 - SampleIdentifier.LEFT_3RD_FINGER -> IDR.string.fingerprint_capture_finger_l_3 - SampleIdentifier.LEFT_4TH_FINGER -> IDR.string.fingerprint_capture_finger_l_4 - SampleIdentifier.LEFT_5TH_FINGER -> IDR.string.fingerprint_capture_finger_l_5 - SampleIdentifier.NONE -> throw IllegalArgumentException("Must be a finger sample identifier") +internal fun TemplateIdentifier.nameTextId(): Int = when (this) { + TemplateIdentifier.RIGHT_5TH_FINGER -> IDR.string.fingerprint_capture_finger_r_5 + TemplateIdentifier.RIGHT_4TH_FINGER -> IDR.string.fingerprint_capture_finger_r_4 + TemplateIdentifier.RIGHT_3RD_FINGER -> IDR.string.fingerprint_capture_finger_r_3 + TemplateIdentifier.RIGHT_INDEX_FINGER -> IDR.string.fingerprint_capture_finger_r_2 + TemplateIdentifier.RIGHT_THUMB -> IDR.string.fingerprint_capture_finger_r_1 + TemplateIdentifier.LEFT_THUMB -> IDR.string.fingerprint_capture_finger_l_1 + TemplateIdentifier.LEFT_INDEX_FINGER -> IDR.string.fingerprint_capture_finger_l_2 + TemplateIdentifier.LEFT_3RD_FINGER -> IDR.string.fingerprint_capture_finger_l_3 + TemplateIdentifier.LEFT_4TH_FINGER -> IDR.string.fingerprint_capture_finger_l_4 + TemplateIdentifier.LEFT_5TH_FINGER -> IDR.string.fingerprint_capture_finger_l_5 + TemplateIdentifier.NONE -> throw IllegalArgumentException("Must be a finger sample identifier") } diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt index 6dfd9df73e..8d6bd6c729 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt @@ -7,9 +7,9 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.ExternalScope import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureIdentity -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.livedata.LiveDataEvent import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.core.livedata.send @@ -135,12 +135,12 @@ internal class FingerprintCaptureViewModel @Inject constructor( get() = _invalidLicense private val _invalidLicense = MutableLiveData() - val finishWithFingerprints: LiveData> + val finishWithFingerprints: LiveData> get() = _finishWithFingerprints private val _finishWithFingerprints = - MutableLiveData>() + MutableLiveData>() - private lateinit var originalFingerprintsToCapture: List + private lateinit var originalFingerprintsToCapture: List private val captureEventIds: MutableMap = mutableMapOf() private var lastCaptureStartedAt: Timestamp = Timestamp(0L) private var hasStarted: Boolean = false @@ -166,7 +166,7 @@ internal class FingerprintCaptureViewModel @Inject constructor( } private fun start( - fingerprintsToCapture: List, + fingerprintsToCapture: List, fingerprintSdk: FingerprintConfiguration.BioSdk, ) { if (!hasStarted) { @@ -218,7 +218,9 @@ internal class FingerprintCaptureViewModel @Inject constructor( when (it.currentCaptureState()) { is CaptureState.ScanProcess.Scanning, is CaptureState.ScanProcess.TransferringImage, - -> pauseLiveFeedback() + -> { + pauseLiveFeedback() + } CaptureState.NotCollected, CaptureState.Skipped, @@ -273,7 +275,7 @@ internal class FingerprintCaptureViewModel @Inject constructor( } } - private fun setStartingState(fingerprintsToCapture: List) { + private fun setStartingState(fingerprintsToCapture: List) { val initialState = CollectFingerprintsState.EMPTY.copy( fingerStates = getStartState(fingerprintsToCapture), ) @@ -329,7 +331,10 @@ internal class FingerprintCaptureViewModel @Inject constructor( private fun toggleScanning() { when (state.currentCaptureState()) { - is CaptureState.ScanProcess.Scanning -> cancelScanning() + is CaptureState.ScanProcess.Scanning -> { + cancelScanning() + } + is CaptureState.ScanProcess.TransferringImage -> { // do nothing } @@ -337,7 +342,9 @@ internal class FingerprintCaptureViewModel @Inject constructor( is CaptureState.Skipped, is CaptureState.ScanProcess.NotDetected, is CaptureState.ScanProcess.Collected, - -> startScanning() + -> { + startScanning() + } } } @@ -512,7 +519,10 @@ internal class FingerprintCaptureViewModel @Inject constructor( private fun handleAutoAddFinger() = updateState { state -> when (val nextPriorityFingerId = getNextFingerToAdd(state.fingerStates.map { it.id })) { - null -> state + null -> { + state + } + else -> { val newFingerState = FingerState( id = nextPriorityFingerId, @@ -660,19 +670,18 @@ internal class FingerprintCaptureViewModel @Inject constructor( Simber.i("Finishing fingerprint capture", tag = FINGER_CAPTURE) val resultItems = collectedFingers.mapNotNull { (captureId, collectedFinger) -> captureEventIds[captureId]?.let { captureEventId -> - CaptureSample( + BiometricTemplateCapture( captureEventId = captureEventId, - identifier = captureId.finger, - modality = Modality.FINGERPRINT, - format = collectedFinger.scanResult.templateFormat, template = collectedFinger.scanResult.template, + identifier = captureId.finger, ) } } + val format = bioSdkWrapper.supportedTemplateFormat val biometricReferenceId = UUID.randomUUID().toString() addBiometricReferenceCreationEvents(biometricReferenceId, resultItems.map { it.captureEventId }) - _finishWithFingerprints.send(CaptureIdentity(biometricReferenceId, Modality.FINGERPRINT, resultItems)) + _finishWithFingerprints.send(BiometricReferenceCapture(biometricReferenceId, Modality.FINGERPRINT, format, resultItems)) } private suspend fun saveImageIfExists( @@ -695,7 +704,7 @@ internal class FingerprintCaptureViewModel @Inject constructor( } fun handleOnViewCreated( - fingerprintsToCapture: List, + fingerprintsToCapture: List, fingerprintSdk: FingerprintConfiguration.BioSdk, ) { updateState { diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/state/FingerState.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/state/FingerState.kt index bbaa99da4f..86873c42e5 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/state/FingerState.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/state/FingerState.kt @@ -1,9 +1,9 @@ package com.simprints.fingerprint.capture.state -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier internal data class FingerState( - val id: SampleIdentifier, + val id: TemplateIdentifier, val captures: List, val currentCaptureIndex: Int = 0, ) { diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/GetNextFingerToAddUseCase.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/GetNextFingerToAddUseCase.kt index a06d25152c..1fa925b8d5 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/GetNextFingerToAddUseCase.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/GetNextFingerToAddUseCase.kt @@ -1,24 +1,24 @@ package com.simprints.fingerprint.capture.usecase -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import javax.inject.Inject internal class GetNextFingerToAddUseCase @Inject constructor() { - operator fun invoke(existingFingers: List): SampleIdentifier? = + operator fun invoke(existingFingers: List): TemplateIdentifier? = DEFAULT_PRIORITY.minus(existingFingers.toSet()).firstOrNull() companion object { private val DEFAULT_PRIORITY = listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_THUMB, - SampleIdentifier.RIGHT_INDEX_FINGER, - SampleIdentifier.LEFT_3RD_FINGER, - SampleIdentifier.RIGHT_3RD_FINGER, - SampleIdentifier.LEFT_4TH_FINGER, - SampleIdentifier.RIGHT_4TH_FINGER, - SampleIdentifier.LEFT_5TH_FINGER, - SampleIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_THUMB, + TemplateIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.RIGHT_3RD_FINGER, + TemplateIdentifier.LEFT_4TH_FINGER, + TemplateIdentifier.RIGHT_4TH_FINGER, + TemplateIdentifier.LEFT_5TH_FINGER, + TemplateIdentifier.RIGHT_5TH_FINGER, ) } } diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/GetStartStateUseCase.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/GetStartStateUseCase.kt index f445419720..e644ff9cc1 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/GetStartStateUseCase.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/GetStartStateUseCase.kt @@ -1,12 +1,12 @@ package com.simprints.fingerprint.capture.usecase -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.fingerprint.capture.state.CaptureState import com.simprints.fingerprint.capture.state.FingerState import javax.inject.Inject internal class GetStartStateUseCase @Inject constructor() { - operator fun invoke(fingerprintsToCapture: List) = fingerprintsToCapture + operator fun invoke(fingerprintsToCapture: List) = fingerprintsToCapture .groupingBy { it } .eachCount() .map { (id, quantity) -> FingerState(id, List(quantity) { CaptureState.NotCollected }) } diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/SaveFingerprintSampleUseCase.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/SaveFingerprintSampleUseCase.kt index 792d2ca4b4..060514eef0 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/SaveFingerprintSampleUseCase.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/usecase/SaveFingerprintSampleUseCase.kt @@ -1,7 +1,7 @@ package com.simprints.fingerprint.capture.usecase import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.fingerprint.capture.extensions.deduceFileExtension import com.simprints.fingerprint.capture.extensions.toInt import com.simprints.fingerprint.capture.state.CaptureState @@ -21,7 +21,7 @@ internal class SaveFingerprintSampleUseCase @Inject constructor( ) { suspend operator fun invoke( vero2Configuration: Vero2Configuration, - finger: SampleIdentifier, + finger: TemplateIdentifier, captureEventId: String?, collectedFinger: CaptureState.ScanProcess.Collected, ) = if (collectedFinger.scanResult.image != null && captureEventId != null) { @@ -45,7 +45,7 @@ internal class SaveFingerprintSampleUseCase @Inject constructor( imageBytes: ByteArray, captureEventId: String, fileExtension: String, - finger: SampleIdentifier, + finger: TemplateIdentifier, dpi: Int, scannerId: String?, un20SerialNumber: String?, diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/confirmfingerprints/ConfirmFingerprintsDialog.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/confirmfingerprints/ConfirmFingerprintsDialog.kt index 6921c8b5fc..e5f1901f06 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/confirmfingerprints/ConfirmFingerprintsDialog.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/confirmfingerprints/ConfirmFingerprintsDialog.kt @@ -5,7 +5,7 @@ import android.content.Context import androidx.appcompat.app.AlertDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.simprints.core.ExcludedFromGeneratedTestCoverageReports -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.fingerprint.capture.resources.nameTextId import com.simprints.infra.resources.R as IDR @@ -38,7 +38,7 @@ internal class ConfirmFingerprintsDialog( }.toString() data class Item( - val finger: SampleIdentifier, + val finger: TemplateIdentifier, val numberOfSuccessfulScans: Int, val numberOfScans: Int, ) diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerFragment.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerFragment.kt index bfe89e809b..b6178b2d6d 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerFragment.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerFragment.kt @@ -8,7 +8,7 @@ import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.fingerprint.capture.R import com.simprints.fingerprint.capture.databinding.FragmentFingerBinding import com.simprints.fingerprint.capture.resources.directionTextColour @@ -30,7 +30,7 @@ internal class FingerFragment : Fragment(R.layout.fragment_finger) { private val binding by viewBinding(FragmentFingerBinding::bind) private val vm: FingerprintCaptureViewModel by viewModels(ownerProducer = { requireParentFragment() }) - private lateinit var fingerId: SampleIdentifier + private lateinit var fingerId: TemplateIdentifier private lateinit var timeoutBars: List @@ -40,7 +40,7 @@ internal class FingerFragment : Fragment(R.layout.fragment_finger) { ) { super.onViewCreated(view, savedInstanceState) - fingerId = SampleIdentifier.entries.toTypedArray()[ + fingerId = TemplateIdentifier.entries.toTypedArray()[ arguments?.getInt(FINGER_ID_BUNDLE_KEY) ?: throw IllegalArgumentException(), ] @@ -127,7 +127,10 @@ internal class FingerFragment : Fragment(R.layout.fragment_finger) { handleCancelled() } - is CaptureState.ScanProcess.Scanning -> startTimeoutBar() + is CaptureState.ScanProcess.Scanning -> { + startTimeoutBar() + } + is CaptureState.ScanProcess.TransferringImage -> { // Do nothing } @@ -136,10 +139,12 @@ internal class FingerFragment : Fragment(R.layout.fragment_finger) { handleCancelled() } - is CaptureState.ScanProcess.Collected -> if (fingerState.scanResult.isGoodScan()) { - handleCancelled() - } else { - handleCancelled() + is CaptureState.ScanProcess.Collected -> { + if (fingerState.scanResult.isGoodScan()) { + handleCancelled() + } else { + handleCancelled() + } } } } @@ -151,7 +156,7 @@ internal class FingerFragment : Fragment(R.layout.fragment_finger) { private const val PROGRESS_BAR_MARGIN = 4 - fun newInstance(fingerId: SampleIdentifier) = FingerFragment().also { + fun newInstance(fingerId: TemplateIdentifier) = FingerFragment().also { it.arguments = Bundle().apply { putInt(FINGER_ID_BUNDLE_KEY, fingerId.ordinal) } } } diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerPageAdapter.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerPageAdapter.kt index 0c534e9b12..c3fc6056da 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerPageAdapter.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerPageAdapter.kt @@ -2,13 +2,13 @@ package com.simprints.fingerprint.capture.views.fingerviewpager import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.uibase.annotations.ExcludedFromGeneratedTestCoverageReports @ExcludedFromGeneratedTestCoverageReports("UI code") internal class FingerPageAdapter( parent: Fragment, - private val activeFingers: MutableList, + private val activeFingers: MutableList, ) : FragmentStateAdapter(parent) { override fun createFragment(position: Int): Fragment = FingerFragment.newInstance(activeFingers[position]) @@ -18,7 +18,7 @@ internal class FingerPageAdapter( override fun getItemId(position: Int): Long = activeFingers[position].toItemId() - private fun SampleIdentifier.toItemId(): Long = this.ordinal.toLong() + private fun TemplateIdentifier.toItemId(): Long = this.ordinal.toLong() - private fun Long.itemIdToFingerIdentifier(): SampleIdentifier = SampleIdentifier.values()[this.toInt()] + private fun Long.itemIdToFingerIdentifier(): TemplateIdentifier = TemplateIdentifier.values()[this.toInt()] } diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerViewPagerManager.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerViewPagerManager.kt index a4d3e01be6..e1f64a127e 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerViewPagerManager.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/views/fingerviewpager/FingerViewPagerManager.kt @@ -7,14 +7,14 @@ import android.widget.LinearLayout import androidx.core.view.children import androidx.fragment.app.Fragment import androidx.viewpager2.widget.ViewPager2 -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.fingerprint.capture.resources.indicatorDrawableId import com.simprints.fingerprint.capture.state.FingerState import com.simprints.infra.uibase.annotations.ExcludedFromGeneratedTestCoverageReports @ExcludedFromGeneratedTestCoverageReports("UI code") internal class FingerViewPagerManager( - private val activeFingers: MutableList, + private val activeFingers: MutableList, private val parentFragment: Fragment, private val viewPager: ViewPager2, private val indicatorLayout: LinearLayout, diff --git a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt index aa95b1f67f..eb9dc9fb6d 100644 --- a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt +++ b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt @@ -2,7 +2,7 @@ package com.simprints.fingerprint.capture.screen import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.tools.time.TimeHelper import com.simprints.fingerprint.capture.screen.FingerprintCaptureViewModelTest.MockAcquireImageResult.OK import com.simprints.fingerprint.capture.screen.FingerprintCaptureViewModelTest.MockCaptureFingerprintResponse.BAD_SCAN @@ -515,11 +515,11 @@ class FingerprintCaptureViewModelTest { coVerify { addBiometricReferenceCreatedEvents.invoke(any(), any()) } vm.finishWithFingerprints.assertEventReceivedWithContentAssertions { actualFingerprints -> - assertThat(actualFingerprints?.samples).hasSize(FOUR_FINGERS_IDS.size) - assertThat(actualFingerprints?.samples?.map { it.identifier }).containsExactlyElementsIn( + assertThat(actualFingerprints?.templates).hasSize(FOUR_FINGERS_IDS.size) + assertThat(actualFingerprints?.templates?.map { it.identifier }).containsExactlyElementsIn( FOUR_FINGERS_IDS, ) - actualFingerprints?.samples?.forEach { + actualFingerprints?.templates?.forEach { assertThat(it.template).isEqualTo(TEMPLATE) } } @@ -573,11 +573,11 @@ class FingerprintCaptureViewModelTest { coVerify { addBiometricReferenceCreatedEvents.invoke(any(), any()) } vm.finishWithFingerprints.assertEventReceivedWithContentAssertions { actualFingerprints -> - assertThat(actualFingerprints?.samples).hasSize(TWO_FINGERS_IDS.size) - assertThat(actualFingerprints?.samples?.map { it.identifier }).containsExactlyElementsIn( + assertThat(actualFingerprints?.templates).hasSize(TWO_FINGERS_IDS.size) + assertThat(actualFingerprints?.templates?.map { it.identifier }).containsExactlyElementsIn( TWO_FINGERS_IDS, ) - actualFingerprints?.samples?.forEach { + actualFingerprints?.templates?.forEach { assertThat(it.template).isEqualTo(TEMPLATE) } } @@ -629,11 +629,11 @@ class FingerprintCaptureViewModelTest { coVerify { addBiometricReferenceCreatedEvents.invoke(any(), any()) } vm.finishWithFingerprints.assertEventReceivedWithContentAssertions { actualFingerprints -> - assertThat(actualFingerprints?.samples).hasSize(TWO_FINGERS_IDS.size) - assertThat(actualFingerprints?.samples?.map { it.identifier }).containsExactlyElementsIn( + assertThat(actualFingerprints?.templates).hasSize(TWO_FINGERS_IDS.size) + assertThat(actualFingerprints?.templates?.map { it.identifier }).containsExactlyElementsIn( TWO_FINGERS_IDS, ) - actualFingerprints?.samples?.forEach { + actualFingerprints?.templates?.forEach { assertThat(it.template).isEqualTo(TEMPLATE) } } @@ -842,13 +842,13 @@ class FingerprintCaptureViewModelTest { coVerify(exactly = 3) { saveFingerprintSampleUseCase.invoke(any(), any(), any(), any()) } vm.finishWithFingerprints.assertEventReceivedWithContentAssertions { actualFingerprints -> - assertThat(actualFingerprints?.samples).hasSize(3) - assertThat(actualFingerprints?.samples?.map { it.identifier }).containsExactly( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_THUMB, - SampleIdentifier.RIGHT_INDEX_FINGER, + assertThat(actualFingerprints?.templates).hasSize(3) + assertThat(actualFingerprints?.templates?.map { it.identifier }).containsExactly( + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_THUMB, + TemplateIdentifier.RIGHT_INDEX_FINGER, ) - actualFingerprints?.samples?.forEach { + actualFingerprints?.templates?.forEach { assertThat(it.template).isEqualTo(TEMPLATE) } } @@ -954,13 +954,13 @@ class FingerprintCaptureViewModelTest { vm.handleConfirmFingerprintsAndContinue() vm.finishWithFingerprints.assertEventReceivedWithContentAssertions { actualFingerprints -> - assertThat(actualFingerprints?.samples).hasSize(3) - assertThat(actualFingerprints?.samples?.map { it.identifier }).containsExactly( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_THUMB, - SampleIdentifier.RIGHT_INDEX_FINGER, + assertThat(actualFingerprints?.templates).hasSize(3) + assertThat(actualFingerprints?.templates?.map { it.identifier }).containsExactly( + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_THUMB, + TemplateIdentifier.RIGHT_INDEX_FINGER, ) - actualFingerprints?.samples?.forEach { + actualFingerprints?.templates?.forEach { assertThat(it.template).isEqualTo(TEMPLATE) } } @@ -1048,13 +1048,13 @@ class FingerprintCaptureViewModelTest { coVerify(exactly = 3) { saveFingerprintSampleUseCase.invoke(any(), any(), any(), any()) } vm.finishWithFingerprints.assertEventReceivedWithContentAssertions { actualFingerprints -> - assertThat(actualFingerprints?.samples).hasSize(3) - assertThat(actualFingerprints?.samples?.map { it.identifier }).containsExactly( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_THUMB, + assertThat(actualFingerprints?.templates).hasSize(3) + assertThat(actualFingerprints?.templates?.map { it.identifier }).containsExactly( + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_THUMB, ) - actualFingerprints?.samples?.forEach { + actualFingerprints?.templates?.forEach { assertThat(it.template).isEqualTo(TEMPLATE) } } @@ -1525,6 +1525,7 @@ class FingerprintCaptureViewModelTest { fun toCaptureFingerprintResponse(): Any = when (this) { GOOD_SCAN -> AcquireFingerprintTemplateResponse(TEMPLATE, TEMPLATE_FORMAT, GOOD_QUALITY) + DIFFERENT_GOOD_SCAN -> AcquireFingerprintTemplateResponse( DIFFERENT_TEMPLATE, TEMPLATE_FORMAT, @@ -1532,13 +1533,14 @@ class FingerprintCaptureViewModelTest { ) BAD_SCAN -> AcquireFingerprintTemplateResponse(TEMPLATE, TEMPLATE_FORMAT, BAD_QUALITY) + NO_FINGER_DETECTED -> NoFingerDetectedException("No finger detected") + DISCONNECTED -> ScannerDisconnectedException() + UNKNOWN_ERROR -> Error("Oops!") - NEVER_RETURNS -> { - // runBlocking { delay(Duration.INFINITE) } - Error("Nothing to return!") - } + + NEVER_RETURNS -> Error("Nothing to return!") } } @@ -1550,14 +1552,14 @@ class FingerprintCaptureViewModelTest { companion object { val TWO_FINGERS_IDS = listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER, ) val FOUR_FINGERS_IDS = listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_THUMB, - SampleIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_THUMB, + TemplateIdentifier.RIGHT_INDEX_FINGER, ) const val GOOD_QUALITY = 80 diff --git a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/AddCaptureEventsUseCaseTest.kt b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/AddCaptureEventsUseCaseTest.kt index fa1a5e40d5..f90c922b05 100644 --- a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/AddCaptureEventsUseCaseTest.kt +++ b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/AddCaptureEventsUseCaseTest.kt @@ -1,6 +1,6 @@ package com.simprints.fingerprint.capture.usecase -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.core.tools.utils.EncodingUtils @@ -43,7 +43,7 @@ internal class AddCaptureEventsUseCaseTest { fun `Saves only capture event when not collected state`() = runTest { useCase.invoke( Timestamp(1L), - FingerState(SampleIdentifier.LEFT_THUMB, listOf(CaptureState.NotCollected)), + FingerState(TemplateIdentifier.LEFT_THUMB, listOf(CaptureState.NotCollected)), 10, false, ) @@ -57,7 +57,7 @@ internal class AddCaptureEventsUseCaseTest { useCase.invoke( Timestamp(1L), FingerState( - SampleIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, listOf( CaptureState.ScanProcess.Collected( numberOfBadScans = 0, @@ -79,7 +79,7 @@ internal class AddCaptureEventsUseCaseTest { useCase.invoke( Timestamp(1L), FingerState( - SampleIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, listOf( CaptureState.ScanProcess.Collected( numberOfBadScans = 0, @@ -103,7 +103,7 @@ internal class AddCaptureEventsUseCaseTest { useCase.invoke( Timestamp(1L), FingerState( - SampleIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, listOf( CaptureState.ScanProcess.Collected( numberOfBadScans = 0, diff --git a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/GetNextFingerToAddUseCaseTest.kt b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/GetNextFingerToAddUseCaseTest.kt index da264b64d7..bf704c4dab 100644 --- a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/GetNextFingerToAddUseCaseTest.kt +++ b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/GetNextFingerToAddUseCaseTest.kt @@ -1,7 +1,7 @@ package com.simprints.fingerprint.capture.usecase import com.google.common.truth.Truth.assertThat -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import org.junit.Test class GetNextFingerToAddUseCaseTest { @@ -9,7 +9,7 @@ class GetNextFingerToAddUseCaseTest { @Test fun `Returns left thumb as first in priority`() { - assertThat(useCase(listOf())).isEqualTo(SampleIdentifier.LEFT_THUMB) + assertThat(useCase(listOf())).isEqualTo(TemplateIdentifier.LEFT_THUMB) } @Test @@ -17,10 +17,10 @@ class GetNextFingerToAddUseCaseTest { assertThat( useCase( listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER, ), ), - ).isEqualTo(SampleIdentifier.RIGHT_THUMB) + ).isEqualTo(TemplateIdentifier.RIGHT_THUMB) } } diff --git a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/GetStartStateUseCaseTest.kt b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/GetStartStateUseCaseTest.kt index 428783f073..34bda6baa1 100644 --- a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/GetStartStateUseCaseTest.kt +++ b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/GetStartStateUseCaseTest.kt @@ -1,7 +1,7 @@ package com.simprints.fingerprint.capture.usecase import com.google.common.truth.Truth.assertThat -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.fingerprint.capture.state.CaptureState import com.simprints.fingerprint.capture.state.FingerState import org.junit.Test @@ -14,16 +14,16 @@ internal class GetStartStateUseCaseTest { assertThat( getStartStateUseCase( listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_5TH_FINGER, - SampleIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, ), ), ).containsExactlyElementsIn( listOf( - FingerState(SampleIdentifier.LEFT_THUMB, listOf(CaptureState.NotCollected)), - FingerState(SampleIdentifier.RIGHT_5TH_FINGER, listOf(CaptureState.NotCollected)), - FingerState(SampleIdentifier.LEFT_INDEX_FINGER, listOf(CaptureState.NotCollected)), + FingerState(TemplateIdentifier.LEFT_THUMB, listOf(CaptureState.NotCollected)), + FingerState(TemplateIdentifier.RIGHT_5TH_FINGER, listOf(CaptureState.NotCollected)), + FingerState(TemplateIdentifier.LEFT_INDEX_FINGER, listOf(CaptureState.NotCollected)), ), ) } @@ -33,22 +33,22 @@ internal class GetStartStateUseCaseTest { assertThat( getStartStateUseCase( listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_5TH_FINGER, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, ), ), ).containsExactlyElementsIn( listOf( FingerState( - SampleIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, listOf(CaptureState.NotCollected, CaptureState.NotCollected, CaptureState.NotCollected), ), - FingerState(SampleIdentifier.RIGHT_5TH_FINGER, listOf(CaptureState.NotCollected)), - FingerState(SampleIdentifier.LEFT_INDEX_FINGER, listOf(CaptureState.NotCollected, CaptureState.NotCollected)), + FingerState(TemplateIdentifier.RIGHT_5TH_FINGER, listOf(CaptureState.NotCollected)), + FingerState(TemplateIdentifier.LEFT_INDEX_FINGER, listOf(CaptureState.NotCollected, CaptureState.NotCollected)), ), ) } @@ -58,22 +58,22 @@ internal class GetStartStateUseCaseTest { assertThat( getStartStateUseCase( listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.RIGHT_5TH_FINGER, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, ), ), ).containsExactlyElementsIn( listOf( FingerState( - SampleIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, listOf(CaptureState.NotCollected, CaptureState.NotCollected, CaptureState.NotCollected), ), - FingerState(SampleIdentifier.RIGHT_5TH_FINGER, listOf(CaptureState.NotCollected)), - FingerState(SampleIdentifier.LEFT_INDEX_FINGER, listOf(CaptureState.NotCollected, CaptureState.NotCollected)), + FingerState(TemplateIdentifier.RIGHT_5TH_FINGER, listOf(CaptureState.NotCollected)), + FingerState(TemplateIdentifier.LEFT_INDEX_FINGER, listOf(CaptureState.NotCollected, CaptureState.NotCollected)), ), ) } diff --git a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/SaveFingerprintSampleUseCaseTest.kt b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/SaveFingerprintSampleUseCaseTest.kt index eb1153e29d..7b6c46e183 100644 --- a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/SaveFingerprintSampleUseCaseTest.kt +++ b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/usecase/SaveFingerprintSampleUseCaseTest.kt @@ -2,7 +2,7 @@ package com.simprints.fingerprint.capture.usecase import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.fingerprint.capture.state.CaptureState import com.simprints.fingerprint.capture.state.ScanResult import com.simprints.fingerprint.infra.scanner.v2.scanner.ScannerInfo @@ -44,7 +44,7 @@ class SaveFingerprintSampleUseCaseTest { fun `Returns null if no scan image`() = runTest { val result = useCase.invoke( vero2Configuration, - SampleIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, "captureEventId", createCollectedStub(null), ) @@ -55,7 +55,7 @@ class SaveFingerprintSampleUseCaseTest { fun `Returns null if no capture event id`() = runTest { val result = useCase.invoke( vero2Configuration, - SampleIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, null, createCollectedStub(byteArrayOf()), ) @@ -67,7 +67,7 @@ class SaveFingerprintSampleUseCaseTest { val scannerId = "scannerId" val un20SerialNumber = "un20SerialNumber" val expectedMetadata = mapOf( - "finger" to SampleIdentifier.LEFT_3RD_FINGER.name, + "finger" to TemplateIdentifier.LEFT_3RD_FINGER.name, "dpi" to "1300", "scannerID" to scannerId, "un20SerialNumber" to un20SerialNumber, @@ -94,7 +94,7 @@ class SaveFingerprintSampleUseCaseTest { assertThat( useCase.invoke( vero2Configuration, - SampleIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, "captureEventId", createCollectedStub(byteArrayOf()), ), @@ -110,7 +110,7 @@ class SaveFingerprintSampleUseCaseTest { assertThat( useCase.invoke( vero2Configuration, - SampleIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, "captureEventId", createCollectedStub(byteArrayOf()), ), @@ -130,7 +130,7 @@ class SaveFingerprintSampleUseCaseTest { assertThat( useCase.invoke( vero2Configuration, - SampleIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, "captureEventId", createCollectedStub(byteArrayOf()), ), diff --git a/fingerprint/infra/base-bio-sdk/src/main/java/com/simprints/fingerprint/infra/basebiosdk/FingerprintBioSdk.kt b/fingerprint/infra/base-bio-sdk/src/main/java/com/simprints/fingerprint/infra/basebiosdk/FingerprintBioSdk.kt index 56226b4bf2..293f9e5545 100644 --- a/fingerprint/infra/base-bio-sdk/src/main/java/com/simprints/fingerprint/infra/basebiosdk/FingerprintBioSdk.kt +++ b/fingerprint/infra/base-bio-sdk/src/main/java/com/simprints/fingerprint/infra/basebiosdk/FingerprintBioSdk.kt @@ -1,6 +1,6 @@ package com.simprints.fingerprint.infra.basebiosdk -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.sample.Identity import com.simprints.fingerprint.infra.basebiosdk.acquisition.FingerprintImageProvider import com.simprints.fingerprint.infra.basebiosdk.acquisition.FingerprintTemplateProvider @@ -25,10 +25,10 @@ class FingerprintBioSdk, + probeReference: BiometricReferenceCapture, candidates: List, matchingSettings: MatcherSettings?, - ) = fingerprintMatcher.match(probe, candidates, matchingSettings) + ) = fingerprintMatcher.match(probeReference, candidates, matchingSettings) val supportedTemplateFormat: String get() = fingerprintMatcher.supportedTemplateFormat diff --git a/fingerprint/infra/base-bio-sdk/src/main/java/com/simprints/fingerprint/infra/basebiosdk/matching/FingerprintMatcher.kt b/fingerprint/infra/base-bio-sdk/src/main/java/com/simprints/fingerprint/infra/basebiosdk/matching/FingerprintMatcher.kt index 87bc9b697a..61ce7e04da 100644 --- a/fingerprint/infra/base-bio-sdk/src/main/java/com/simprints/fingerprint/infra/basebiosdk/matching/FingerprintMatcher.kt +++ b/fingerprint/infra/base-bio-sdk/src/main/java/com/simprints/fingerprint/infra/basebiosdk/matching/FingerprintMatcher.kt @@ -1,21 +1,21 @@ package com.simprints.fingerprint.infra.basebiosdk.matching -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult interface FingerprintMatcher { /** * Matches a [probe] against the given flow of [candidates] - * producing a flow of [MatchComparisonResult]. + * producing a flow of [ComparisonResult]. * * @throws IllegalArgumentException if the TemplateFormats of the supplied [probe] */ suspend fun match( - probe: List, + probeReference: BiometricReferenceCapture, candidates: List, settings: MatcherSettings?, - ): List + ): List val supportedTemplateFormat: String val matcherName: String diff --git a/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/BioSdkWrapper.kt b/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/BioSdkWrapper.kt index 1b044d0d22..912867eca5 100644 --- a/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/BioSdkWrapper.kt +++ b/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/BioSdkWrapper.kt @@ -1,8 +1,8 @@ package com.simprints.fingerprint.infra.biosdk -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult import com.simprints.fingerprint.infra.scanner.domain.fingerprint.AcquireFingerprintImageResponse import com.simprints.fingerprint.infra.scanner.domain.fingerprint.AcquireFingerprintTemplateResponse @@ -26,10 +26,10 @@ interface BioSdkWrapper { suspend fun initialize() suspend fun match( - probe: List, + probeReference: BiometricReferenceCapture, candidates: List, isCrossFingerMatchingEnabled: Boolean, - ): List + ): List suspend fun acquireFingerprintTemplate( capturingResolution: Int?, diff --git a/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/NECBioSdkWrapper.kt b/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/NECBioSdkWrapper.kt index 08f8f643a6..1ee27ed8c9 100644 --- a/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/NECBioSdkWrapper.kt +++ b/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/NECBioSdkWrapper.kt @@ -1,8 +1,8 @@ package com.simprints.fingerprint.infra.biosdk -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult import com.simprints.fingerprint.infra.basebiosdk.FingerprintBioSdk import com.simprints.fingerprint.infra.basebiosdk.acquisition.domain.TemplateResponse import com.simprints.fingerprint.infra.basebiosdk.acquisition.domain.toDomain @@ -35,10 +35,10 @@ class NECBioSdkWrapper @Inject constructor( override suspend fun initialize() = bioSdk.initialize() override suspend fun match( - probe: List, + probeReference: BiometricReferenceCapture, candidates: List, isCrossFingerMatchingEnabled: Boolean, - ): List = bioSdk.match(probe, candidates, NecMatchingSettings(isCrossFingerMatchingEnabled)) + ): List = bioSdk.match(probeReference, candidates, NecMatchingSettings(isCrossFingerMatchingEnabled)) override suspend fun acquireFingerprintTemplate( capturingResolution: Int?, diff --git a/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/SimprintsBioSdkWrapper.kt b/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/SimprintsBioSdkWrapper.kt index da205a1177..88977f6c51 100644 --- a/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/SimprintsBioSdkWrapper.kt +++ b/fingerprint/infra/bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdk/SimprintsBioSdkWrapper.kt @@ -1,6 +1,6 @@ package com.simprints.fingerprint.infra.biosdk -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.sample.Identity import com.simprints.fingerprint.infra.basebiosdk.FingerprintBioSdk import com.simprints.fingerprint.infra.basebiosdk.acquisition.domain.TemplateResponse @@ -36,10 +36,10 @@ class SimprintsBioSdkWrapper @Inject constructor( } override suspend fun match( - probe: List, + probeReference: BiometricReferenceCapture, candidates: List, isCrossFingerMatchingEnabled: Boolean, - ) = bioSdk.match(probe, candidates, SimAfisMatcherSettings(isCrossFingerMatchingEnabled)) + ) = bioSdk.match(probeReference, candidates, SimAfisMatcherSettings(isCrossFingerMatchingEnabled)) override suspend fun acquireFingerprintTemplate( capturingResolution: Int?, diff --git a/fingerprint/infra/bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdk/NECBioSdkWrapperTest.kt b/fingerprint/infra/bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdk/NECBioSdkWrapperTest.kt index cda1652cbe..e76072a0f3 100644 --- a/fingerprint/infra/bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdk/NECBioSdkWrapperTest.kt +++ b/fingerprint/infra/bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdk/NECBioSdkWrapperTest.kt @@ -1,7 +1,8 @@ package com.simprints.fingerprint.infra.biosdk import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Identity import com.simprints.fingerprint.infra.basebiosdk.FingerprintBioSdk import com.simprints.fingerprint.infra.basebiosdk.acquisition.domain.ImageResponse @@ -69,7 +70,7 @@ class NECBioSdkWrapperTest { @Test fun `calls match on bio sdk`() = runTest { // Given - val probe = listOf(mockk()) + val probe = mockk() val candidates = listOf(mockk()) val isCrossFingerMatchingEnabled = true val settings = NecMatchingSettings(isCrossFingerMatchingEnabled) diff --git a/fingerprint/infra/bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdk/SimprintsBioSdkWrapperTest.kt b/fingerprint/infra/bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdk/SimprintsBioSdkWrapperTest.kt index 586167658b..99a8386917 100644 --- a/fingerprint/infra/bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdk/SimprintsBioSdkWrapperTest.kt +++ b/fingerprint/infra/bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdk/SimprintsBioSdkWrapperTest.kt @@ -1,7 +1,8 @@ package com.simprints.fingerprint.infra.biosdk import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Identity import com.simprints.fingerprint.infra.basebiosdk.FingerprintBioSdk import com.simprints.fingerprint.infra.basebiosdk.acquisition.domain.ImageResponse @@ -63,7 +64,7 @@ class SimprintsBioSdkWrapperTest { @Test fun `Calls match on bio sdk`() = runTest { // Given - val probe = listOf(mockk()) + val probe = mockk() val candidates = listOf(mockk()) val isCrossFingerMatchingEnabled = true val settings = SimAfisMatcherSettings(isCrossFingerMatchingEnabled) diff --git a/fingerprint/infra/nec-bio-sdk/src/main/java/com/simprints/fingerprint/infra/necsdkimpl/matching/FingerprintMatcherImpl.kt b/fingerprint/infra/nec-bio-sdk/src/main/java/com/simprints/fingerprint/infra/necsdkimpl/matching/FingerprintMatcherImpl.kt index 5680a0f02a..0a41b4f532 100644 --- a/fingerprint/infra/nec-bio-sdk/src/main/java/com/simprints/fingerprint/infra/necsdkimpl/matching/FingerprintMatcherImpl.kt +++ b/fingerprint/infra/nec-bio-sdk/src/main/java/com/simprints/fingerprint/infra/necsdkimpl/matching/FingerprintMatcherImpl.kt @@ -1,10 +1,12 @@ package com.simprints.fingerprint.infra.necsdkimpl.matching -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.fingerprint.infra.basebiosdk.exceptions.BioSdkException import com.simprints.fingerprint.infra.basebiosdk.matching.FingerprintMatcher import com.simprints.fingerprint.infra.necsdkimpl.acquisition.template.NEC_TEMPLATE_FORMAT @@ -19,23 +21,25 @@ internal class FingerprintMatcherImpl @Inject constructor( override val matcherName: String = "NEC" override suspend fun match( - probe: List, + probeReference: BiometricReferenceCapture, candidates: List, settings: NecMatchingSettings?, - ): List { + ): List { // if probe template format is not supported by NEC matcher, return empty list - if (probe.templateFormatNotSupportedByNecMatcher()) { + if (probeReference.templateFormatNotSupportedByNecMatcher()) { return emptyList() } + val probeTemplates = probeReference.templates + return if (settings?.crossFingerComparison == true) { - crossFingerMatching(probe, candidates) + crossFingerMatching(probeTemplates, candidates) } else { - sameFingerMatching(probe, candidates) + sameFingerMatching(probeTemplates, candidates) } } private fun sameFingerMatching( - probe: List, + probe: List, candidates: List, ) = candidates.map { sameFingerMatching(probe, it) @@ -47,46 +51,46 @@ internal class FingerprintMatcherImpl @Inject constructor( * - Getting the matching score for each similar finger pairs using NEC SDK * - The overall score is the average of the individual finger match scores * - We ignore probe fingers that doesn't have matching candidate fingers - * @param probe + * @param probeTemplates * @param candidate * @return MatchResult */ private fun sameFingerMatching( - probe: List, + probeTemplates: List, candidate: Identity, - ): MatchComparisonResult { + ): ComparisonResult { var fingers = 0 // the number of fingers used in matching - val total = probe.sumOf { fingerprint -> - candidate.templateForFinger(fingerprint.identifier)?.let { candidateTemplate -> + val total = probeTemplates.sumOf { template -> + candidate.templateForFinger(template.identifier)?.let { candidateTemplate -> fingers++ - verify(fingerprint, candidateTemplate) + verify(template, candidateTemplate) } ?: 0.toDouble() } - return MatchComparisonResult(candidate.subjectId, getOverallScore(total, fingers)) + return ComparisonResult(candidate.subjectId, getOverallScore(total, fingers)) } private fun verify( - probe: CaptureSample, + probe: BiometricTemplateCapture, candidate: Sample, ) = try { nec .match( probe.toNecTemplate(), - candidate.toNecTemplate(), + candidate.template.toNecTemplate(), ).toDouble() } catch (e: Exception) { throw BioSdkException.TemplateMatchingException(e) } private fun crossFingerMatching( - probe: List, + probe: List, candidates: List, ) = candidates.map { crossFingerMatching(probe, it) } private fun crossFingerMatching( - probe: List, + probe: List, candidate: Identity, - ): MatchComparisonResult { + ): ComparisonResult { // Number of fingers used in matching val fingers = probe.size // Sum of maximum matching score for each finger @@ -96,14 +100,14 @@ internal class FingerprintMatcherImpl @Inject constructor( } } // Matching score = total/number of fingers - return MatchComparisonResult(candidate.subjectId, getOverallScore(total, fingers)) + return ComparisonResult(candidate.subjectId, getOverallScore(total, fingers)) } - private fun Identity.templateForFinger(fingerId: SampleIdentifier) = samples.find { it.identifier == fingerId } + private fun Identity.templateForFinger(fingerId: TemplateIdentifier) = samples.find { it.template.identifier == fingerId } - private fun CaptureSample.toNecTemplate() = NECTemplate(template, 0) // Quality score not used + private fun BiometricTemplate.toNecTemplate() = NECTemplate(template, 0) // Quality score not used - private fun Sample.toNecTemplate() = NECTemplate(template, 0) // Quality score not used + private fun BiometricTemplateCapture.toNecTemplate() = NECTemplate(template, 0) // Quality score not used private fun getOverallScore( total: Double, @@ -115,4 +119,4 @@ internal class FingerprintMatcherImpl @Inject constructor( } } -private fun List.templateFormatNotSupportedByNecMatcher(): Boolean = any { it.format != NEC_TEMPLATE_FORMAT } +private fun BiometricReferenceCapture.templateFormatNotSupportedByNecMatcher(): Boolean = format != NEC_TEMPLATE_FORMAT diff --git a/fingerprint/infra/nec-bio-sdk/src/test/java/com/simprints/fingerprint/infra/necsdkimpl/matching/FingerprintMatcherImplTest.kt b/fingerprint/infra/nec-bio-sdk/src/test/java/com/simprints/fingerprint/infra/necsdkimpl/matching/FingerprintMatcherImplTest.kt index 4f79c54341..3f1b5d27fc 100644 --- a/fingerprint/infra/nec-bio-sdk/src/test/java/com/simprints/fingerprint/infra/necsdkimpl/matching/FingerprintMatcherImplTest.kt +++ b/fingerprint/infra/nec-bio-sdk/src/test/java/com/simprints/fingerprint/infra/necsdkimpl/matching/FingerprintMatcherImplTest.kt @@ -2,10 +2,12 @@ package com.simprints.fingerprint.infra.necsdkimpl.matching import com.google.common.truth.* import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Identity import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.fingerprint.infra.basebiosdk.exceptions.BioSdkException import com.simprints.fingerprint.infra.necsdkimpl.acquisition.template.NEC_TEMPLATE_FORMAT import com.simprints.necwrapper.nec.NEC @@ -31,56 +33,56 @@ class FingerprintMatcherImplTest { fun `test match FingerprintIdentities with the same fingerprint IDs`() = runTest { // Given every { nec.match(any(), any(), any()) } returns 3 - val probe = generateProbe(SampleIdentifier.LEFT_THUMB, SampleIdentifier.RIGHT_THUMB) + val probe = generateProbe(TemplateIdentifier.LEFT_THUMB, TemplateIdentifier.RIGHT_THUMB) val candidates = listOf( - generateIdentity(SampleIdentifier.LEFT_THUMB, SampleIdentifier.RIGHT_THUMB), - generateIdentity(SampleIdentifier.LEFT_THUMB, SampleIdentifier.RIGHT_THUMB), - generateIdentity(SampleIdentifier.LEFT_THUMB, SampleIdentifier.RIGHT_THUMB), + generateIdentity(TemplateIdentifier.LEFT_THUMB, TemplateIdentifier.RIGHT_THUMB), + generateIdentity(TemplateIdentifier.LEFT_THUMB, TemplateIdentifier.RIGHT_THUMB), + generateIdentity(TemplateIdentifier.LEFT_THUMB, TemplateIdentifier.RIGHT_THUMB), ) // When val result = matcher.match(probe, candidates, NecMatchingSettings(false)) // Then Truth.assertThat(result.size).isEqualTo(3) - Truth.assertThat(result[0].confidence).isEqualTo(3) + Truth.assertThat(result[0].comparisonScore).isEqualTo(3) } @Test fun `test match FingerprintIdentities with different fingerprint IDs`() = runTest { // Given every { nec.match(any(), any(), any()) } returns 3 - val probe = generateProbe(SampleIdentifier.LEFT_INDEX_FINGER, SampleIdentifier.RIGHT_INDEX_FINGER) - val candidate = generateIdentity(SampleIdentifier.LEFT_THUMB, SampleIdentifier.RIGHT_THUMB) + val probe = generateProbe(TemplateIdentifier.LEFT_INDEX_FINGER, TemplateIdentifier.RIGHT_INDEX_FINGER) + val candidate = generateIdentity(TemplateIdentifier.LEFT_THUMB, TemplateIdentifier.RIGHT_THUMB) // When val result = matcher.match(probe, listOf(candidate), NecMatchingSettings(false)) // Then Truth.assertThat(result.size).isEqualTo(1) - Truth.assertThat(result[0].confidence).isEqualTo(0) + Truth.assertThat(result[0].comparisonScore).isEqualTo(0) } @Test fun `test match FingerprintIdentities with different fingerprint IDs and crossFingerComparison`() = runTest { // Given every { nec.match(any(), any(), any()) } returns 3 - val probe = generateProbe(SampleIdentifier.LEFT_INDEX_FINGER, SampleIdentifier.RIGHT_INDEX_FINGER) - val candidate = generateIdentity(SampleIdentifier.LEFT_THUMB, SampleIdentifier.RIGHT_THUMB) + val probe = generateProbe(TemplateIdentifier.LEFT_INDEX_FINGER, TemplateIdentifier.RIGHT_INDEX_FINGER) + val candidate = generateIdentity(TemplateIdentifier.LEFT_THUMB, TemplateIdentifier.RIGHT_THUMB) // When val result = matcher.match(probe, listOf(candidate), NecMatchingSettings(true)) // Then Truth.assertThat(result.size).isEqualTo(1) - Truth.assertThat(result[0].confidence).isEqualTo(3) + Truth.assertThat(result[0].comparisonScore).isEqualTo(3) } @Test fun `test match FingerprintIdentities with only one equal fingerprint IDs`() = runTest { // Given every { nec.match(any(), any(), any()) } returns 3 - val probe = generateProbe(SampleIdentifier.LEFT_INDEX_FINGER, SampleIdentifier.RIGHT_INDEX_FINGER) - val candidate = generateIdentity(SampleIdentifier.LEFT_INDEX_FINGER, SampleIdentifier.RIGHT_THUMB) + val probe = generateProbe(TemplateIdentifier.LEFT_INDEX_FINGER, TemplateIdentifier.RIGHT_INDEX_FINGER) + val candidate = generateIdentity(TemplateIdentifier.LEFT_INDEX_FINGER, TemplateIdentifier.RIGHT_THUMB) // When val result = matcher.match(probe, listOf(candidate), NecMatchingSettings(false)) // Then Truth.assertThat(result.size).isEqualTo(1) - Truth.assertThat(result[0].confidence).isEqualTo(3) + Truth.assertThat(result[0].comparisonScore).isEqualTo(3) } @Test(expected = BioSdkException.TemplateMatchingException::class) @@ -90,10 +92,10 @@ class FingerprintMatcherImplTest { nec.match(any(), any(), any()) } throws NEC.AttemptedToRunBeforeInitializedException() val probe = generateProbe( - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_INDEX_FINGER, ) - val candidate = generateIdentity(SampleIdentifier.LEFT_INDEX_FINGER, SampleIdentifier.RIGHT_THUMB) + val candidate = generateIdentity(TemplateIdentifier.LEFT_INDEX_FINGER, TemplateIdentifier.RIGHT_THUMB) // When matcher.match(probe, listOf(candidate), NecMatchingSettings(false)) } @@ -103,12 +105,12 @@ class FingerprintMatcherImplTest { // Given val probe = generateProbe( - SampleIdentifier.LEFT_INDEX_FINGER, - SampleIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.RIGHT_INDEX_FINGER, format = "Unsupported", ) val candidate = - generateIdentity(SampleIdentifier.LEFT_THUMB, SampleIdentifier.RIGHT_THUMB) + generateIdentity(TemplateIdentifier.LEFT_THUMB, TemplateIdentifier.RIGHT_THUMB) // When val result = matcher.match(probe, listOf(candidate), NecMatchingSettings(false)) // Then @@ -116,30 +118,35 @@ class FingerprintMatcherImplTest { } private fun generateProbe( - vararg fingers: SampleIdentifier, + vararg fingers: TemplateIdentifier, format: String = NEC_TEMPLATE_FORMAT, - ) = fingers.map { - CaptureSample( - captureEventId = it.name, - identifier = it, - modality = Modality.FINGERPRINT, - format = format, - template = ByteArray(0), - ) - } + ) = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = format, + templates = fingers.map { + BiometricTemplateCapture( + captureEventId = it.name, + template = ByteArray(0), + identifier = it, + ) + }, + ) private fun generateIdentity( - vararg fingers: SampleIdentifier, + vararg fingers: TemplateIdentifier, format: String = NEC_TEMPLATE_FORMAT, ) = Identity( subjectId = "id", samples = fingers.map { Sample( referenceId = it.name, - identifier = it, modality = Modality.FINGERPRINT, format = format, - template = ByteArray(0), + template = BiometricTemplate( + template = ByteArray(0), + identifier = it, + ), ) }, ) diff --git a/fingerprint/infra/simprints-bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdkimpl/matching/FingerprintMatcherImpl.kt b/fingerprint/infra/simprints-bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdkimpl/matching/FingerprintMatcherImpl.kt index 67ee2a925b..ca697ded7c 100644 --- a/fingerprint/infra/simprints-bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdkimpl/matching/FingerprintMatcherImpl.kt +++ b/fingerprint/infra/simprints-bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdkimpl/matching/FingerprintMatcherImpl.kt @@ -1,8 +1,8 @@ package com.simprints.fingerprint.infra.biosdkimpl.matching -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult import com.simprints.fingerprint.infra.basebiosdk.matching.FingerprintMatcher import com.simprints.fingerprint.infra.biosdkimpl.matching.SimAfisMatcher.Companion.SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT import javax.inject.Inject @@ -14,8 +14,12 @@ internal class FingerprintMatcherImpl @Inject constructor( override val matcherName: String = "SIM_AFIS" override suspend fun match( - probe: List, + probeReference: BiometricReferenceCapture, candidates: List, settings: SimAfisMatcherSettings?, - ): List = simAfisMatcher.match(probe, candidates, settings?.crossFingerComparison ?: false) + ): List = simAfisMatcher.match( + probeReference = probeReference, + candidates = candidates, + crossFingerComparison = settings?.crossFingerComparison ?: false, + ) } diff --git a/fingerprint/infra/simprints-bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdkimpl/matching/SimAfisMatcher.kt b/fingerprint/infra/simprints-bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdkimpl/matching/SimAfisMatcher.kt index 50264ac57e..8072e93dfb 100644 --- a/fingerprint/infra/simprints-bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdkimpl/matching/SimAfisMatcher.kt +++ b/fingerprint/infra/simprints-bio-sdk/src/main/java/com/simprints/fingerprint/infra/biosdkimpl/matching/SimAfisMatcher.kt @@ -1,11 +1,12 @@ package com.simprints.fingerprint.infra.biosdkimpl.matching import com.simprints.core.ExcludedFromGeneratedTestCoverageReports -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult -import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.fingerprint.infra.simafiswrapper.JNILibAfisInterface import com.simprints.fingerprint.infra.simafiswrapper.models.SimAfisFingerIdentifier import com.simprints.fingerprint.infra.simafiswrapper.models.SimAfisFingerprint @@ -26,25 +27,27 @@ internal class SimAfisMatcher @Inject constructor( private val jniLibAfis: JNILibAfisInterface, ) { fun match( - probe: List, + probeReference: BiometricReferenceCapture, candidates: List, crossFingerComparison: Boolean, - ): List { + ): List { // if probe template format is not supported by SimAfisMatcher, return empty list - if (probe.templateFormatNotSupportedBySimAfisMatcher()) { + if (probeReference.templateFormatNotSupportedBySimAfisMatcher()) { return emptyList() } + val probeTemplates = probeReference.templates + return if (crossFingerComparison) { - crossFingerMatch(probe, candidates) + crossFingerMatch(probeTemplates, candidates) } else { - match(probe, candidates) + match(probeTemplates, candidates) } } private fun match( - probe: List, + probe: List, candidates: List, - ): List { + ): List { val simAfisCandidates = candidates.map { it.toSimAfisPerson() } println("Matching ${simAfisCandidates.size} candidates using all ${jniLibAfis.getNbCores()} cores") @@ -56,36 +59,37 @@ internal class SimAfisMatcher @Inject constructor( ) return results.zip(simAfisCandidates).map { (score, candidate) -> - MatchComparisonResult(candidate.guid, score) + ComparisonResult(candidate.guid, score) } } - private fun Identity.toSimAfisPerson(): SimAfisPerson = SimAfisPerson(subjectId, samples.map { it.toSimAfisFingerprint() }) + private fun Identity.toSimAfisPerson(): SimAfisPerson = SimAfisPerson(subjectId, samples.map { it.template.toSimAfisFingerprint() }) - private fun Sample.toSimAfisFingerprint(): SimAfisFingerprint = SimAfisFingerprint(identifier.toSimAfisFingerIdentifier(), template) + private fun BiometricTemplate.toSimAfisFingerprint(): SimAfisFingerprint = + SimAfisFingerprint(identifier.toSimAfisFingerIdentifier(), template) - private fun List.toSimAfisPerson(): SimAfisPerson = SimAfisPerson("", map { it.toSimAfisFingerprint() }) + private fun List.toSimAfisPerson(): SimAfisPerson = SimAfisPerson("", map { it.toSimAfisFingerprint() }) - private fun CaptureSample.toSimAfisFingerprint(): SimAfisFingerprint = + private fun BiometricTemplateCapture.toSimAfisFingerprint(): SimAfisFingerprint = SimAfisFingerprint(identifier.toSimAfisFingerIdentifier(), template) @ExcludedFromGeneratedTestCoverageReports(reason = "This is just a mapping function") - private fun SampleIdentifier.toSimAfisFingerIdentifier(): SimAfisFingerIdentifier = when (this) { - SampleIdentifier.RIGHT_5TH_FINGER -> SimAfisFingerIdentifier.RIGHT_5TH_FINGER - SampleIdentifier.RIGHT_4TH_FINGER -> SimAfisFingerIdentifier.RIGHT_4TH_FINGER - SampleIdentifier.RIGHT_3RD_FINGER -> SimAfisFingerIdentifier.RIGHT_3RD_FINGER - SampleIdentifier.RIGHT_INDEX_FINGER -> SimAfisFingerIdentifier.RIGHT_INDEX_FINGER - SampleIdentifier.RIGHT_THUMB -> SimAfisFingerIdentifier.RIGHT_THUMB - SampleIdentifier.LEFT_THUMB -> SimAfisFingerIdentifier.LEFT_THUMB - SampleIdentifier.LEFT_INDEX_FINGER -> SimAfisFingerIdentifier.LEFT_INDEX_FINGER - SampleIdentifier.LEFT_3RD_FINGER -> SimAfisFingerIdentifier.LEFT_3RD_FINGER - SampleIdentifier.LEFT_4TH_FINGER -> SimAfisFingerIdentifier.LEFT_4TH_FINGER - SampleIdentifier.LEFT_5TH_FINGER -> SimAfisFingerIdentifier.LEFT_5TH_FINGER - SampleIdentifier.NONE -> throw IllegalArgumentException("Must be a finger sample identifier") + private fun TemplateIdentifier.toSimAfisFingerIdentifier(): SimAfisFingerIdentifier = when (this) { + TemplateIdentifier.RIGHT_5TH_FINGER -> SimAfisFingerIdentifier.RIGHT_5TH_FINGER + TemplateIdentifier.RIGHT_4TH_FINGER -> SimAfisFingerIdentifier.RIGHT_4TH_FINGER + TemplateIdentifier.RIGHT_3RD_FINGER -> SimAfisFingerIdentifier.RIGHT_3RD_FINGER + TemplateIdentifier.RIGHT_INDEX_FINGER -> SimAfisFingerIdentifier.RIGHT_INDEX_FINGER + TemplateIdentifier.RIGHT_THUMB -> SimAfisFingerIdentifier.RIGHT_THUMB + TemplateIdentifier.LEFT_THUMB -> SimAfisFingerIdentifier.LEFT_THUMB + TemplateIdentifier.LEFT_INDEX_FINGER -> SimAfisFingerIdentifier.LEFT_INDEX_FINGER + TemplateIdentifier.LEFT_3RD_FINGER -> SimAfisFingerIdentifier.LEFT_3RD_FINGER + TemplateIdentifier.LEFT_4TH_FINGER -> SimAfisFingerIdentifier.LEFT_4TH_FINGER + TemplateIdentifier.LEFT_5TH_FINGER -> SimAfisFingerIdentifier.LEFT_5TH_FINGER + TemplateIdentifier.NONE -> throw IllegalArgumentException("Must be a finger sample identifier") } private fun crossFingerMatch( - probe: List, + probe: List, candidates: List, ) = candidates.map { crossFingerMatching(probe, it, jniLibAfis) } @@ -98,14 +102,14 @@ internal class SimAfisMatcher @Inject constructor( * @return MatchResult */ private fun crossFingerMatching( - probe: List, + probe: List, candidate: Identity, jniLibAfis: JNILibAfisInterface, - ): MatchComparisonResult { - // Number of fingers used in matching - val fingers = probe.fingerprintsTemplates.size + ): ComparisonResult { + // Fingers used in matching + val fingers = probe.fingerprintsTemplates // Sum of maximum matching score for each finger - val total = probe.fingerprintsTemplates + val total = fingers .sumOf { probeTemplate -> candidate.fingerprintsTemplates .maxOf { candidateTemplate -> @@ -116,7 +120,7 @@ internal class SimAfisMatcher @Inject constructor( }.toDouble() } // Matching score = total/number of fingers - return MatchComparisonResult(candidate.subjectId, getOverallScore(total, fingers)) + return ComparisonResult(candidate.subjectId, getOverallScore(total, fingers.size)) } private fun getOverallScore( @@ -133,13 +137,13 @@ internal class SimAfisMatcher @Inject constructor( } } -val List.fingerprintsTemplates +val List.fingerprintsTemplates get() = map { it.template.toByteBuffer() } val Identity.fingerprintsTemplates - get() = samples.map { it.template.toByteBuffer() } + get() = samples.map { it.template.template.toByteBuffer() } private fun ByteArray.toByteBuffer(): ByteBuffer = ByteBuffer.allocateDirect(size).put(this) -fun List.templateFormatNotSupportedBySimAfisMatcher(): Boolean = - any { it.format != SimAfisMatcher.SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT } +fun BiometricReferenceCapture.templateFormatNotSupportedBySimAfisMatcher(): Boolean = + format != SimAfisMatcher.SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT diff --git a/fingerprint/infra/simprints-bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdkimpl/matching/FingerprintMatcherImplTest.kt b/fingerprint/infra/simprints-bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdkimpl/matching/FingerprintMatcherImplTest.kt index 6513abc896..c6192774d1 100644 --- a/fingerprint/infra/simprints-bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdkimpl/matching/FingerprintMatcherImplTest.kt +++ b/fingerprint/infra/simprints-bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdkimpl/matching/FingerprintMatcherImplTest.kt @@ -1,9 +1,9 @@ package com.simprints.fingerprint.infra.biosdkimpl.matching import com.google.common.truth.* -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult import io.mockk.* import kotlinx.coroutines.test.runTest import org.junit.Test @@ -15,11 +15,11 @@ class FingerprintMatcherImplTest { fun match() = runTest { // Given val matcher = FingerprintMatcherImpl(simAfisMatcher) - val probe = listOf(mockk()) + val probe = mockk() val candidates: List = mockk() val simAfisMatcherSettings = SimAfisMatcherSettings() simAfisMatcherSettings.crossFingerComparison = false - val matchResult: List = mockk() + val matchResult: List = mockk() every { simAfisMatcher.match(probe, candidates, false) } returns matchResult diff --git a/fingerprint/infra/simprints-bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdkimpl/matching/SimAfisMatcherTest.kt b/fingerprint/infra/simprints-bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdkimpl/matching/SimAfisMatcherTest.kt index 6469c01377..803d06b302 100644 --- a/fingerprint/infra/simprints-bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdkimpl/matching/SimAfisMatcherTest.kt +++ b/fingerprint/infra/simprints-bio-sdk/src/test/java/com/simprints/fingerprint/infra/biosdkimpl/matching/SimAfisMatcherTest.kt @@ -2,10 +2,12 @@ package com.simprints.fingerprint.infra.biosdkimpl.matching import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Identity import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.fingerprint.infra.scanner.v2.tools.primitives.byteArrayOf import com.simprints.fingerprint.infra.simafiswrapper.JNILibAfisInterface import io.mockk.* @@ -32,13 +34,16 @@ class SimAfisMatcherTest { fun `test same finger match`() = runTest { every { jniLibAfis.identify(any(), any(), 1) } returns floatArrayOf(1F) - val probes = listOf( - CaptureSample( - captureEventId = "referenceId", - identifier = SampleIdentifier.RIGHT_THUMB, - template = IsoFingerprintTemplateGenerator.generate(1), - format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, - modality = Modality.FINGERPRINT, + val probes = BiometricReferenceCapture( + referenceId = "referenceId", + format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, + modality = Modality.FINGERPRINT, + templates = listOf( + BiometricTemplateCapture( + captureEventId = "referenceId", + identifier = TemplateIdentifier.RIGHT_THUMB, + template = IsoFingerprintTemplateGenerator.generate(1), + ), ), ) val candidate = Identity( @@ -46,8 +51,10 @@ class SimAfisMatcherTest { listOf( Sample( referenceId = "referenceId", - identifier = SampleIdentifier.RIGHT_THUMB, - template = IsoFingerprintTemplateGenerator.generate(1), + template = BiometricTemplate( + template = IsoFingerprintTemplateGenerator.generate(1), + identifier = TemplateIdentifier.RIGHT_THUMB, + ), format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, modality = Modality.FINGERPRINT, ), @@ -57,19 +64,22 @@ class SimAfisMatcherTest { val result = simAfisMatcher.match(probes, listOf(candidate), false).last() // Then verify { jniLibAfis.identify(any(), any(), any()) } - assertThat(result.confidence).isEqualTo(1) + assertThat(result.comparisonScore).isEqualTo(1) } @Test fun `test matching probe with other template format ignore candidate`() = runTest { every { jniLibAfis.identify(any(), any(), 1) } returns floatArrayOf(1F) - val probes = listOf( - CaptureSample( - captureEventId = "referenceId", - identifier = SampleIdentifier.RIGHT_3RD_FINGER, - template = IsoFingerprintTemplateGenerator.generate(1), - format = "NEC_1", - modality = Modality.FINGERPRINT, + val probes = BiometricReferenceCapture( + referenceId = "referenceId", + format = "NEC_1", + modality = Modality.FINGERPRINT, + templates = listOf( + BiometricTemplateCapture( + captureEventId = "referenceId", + identifier = TemplateIdentifier.RIGHT_3RD_FINGER, + template = IsoFingerprintTemplateGenerator.generate(1), + ), ), ) val candidate = Identity( @@ -77,8 +87,10 @@ class SimAfisMatcherTest { listOf( Sample( referenceId = "referenceId", - identifier = SampleIdentifier.RIGHT_3RD_FINGER, - template = IsoFingerprintTemplateGenerator.generate(1), + template = BiometricTemplate( + template = IsoFingerprintTemplateGenerator.generate(1), + identifier = TemplateIdentifier.RIGHT_3RD_FINGER, + ), format = "NEC_1", modality = Modality.FINGERPRINT, ), @@ -96,20 +108,21 @@ class SimAfisMatcherTest { val template2 = byteArrayOf(2) val template3 = byteArrayOf(3) - val probe = listOf( - CaptureSample( - captureEventId = "referenceId", - identifier = SampleIdentifier.RIGHT_THUMB, - template = template1, - format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, - modality = Modality.FINGERPRINT, - ), - CaptureSample( - captureEventId = "referenceId", - identifier = SampleIdentifier.LEFT_THUMB, - template = template2, - format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, - modality = Modality.FINGERPRINT, + val probe = BiometricReferenceCapture( + referenceId = "referenceId", + format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, + modality = Modality.FINGERPRINT, + templates = listOf( + BiometricTemplateCapture( + captureEventId = "referenceId", + identifier = TemplateIdentifier.RIGHT_THUMB, + template = template1, + ), + BiometricTemplateCapture( + captureEventId = "referenceId", + identifier = TemplateIdentifier.LEFT_THUMB, + template = template2, + ), ), ) @@ -118,15 +131,19 @@ class SimAfisMatcherTest { samples = listOf( Sample( referenceId = "referenceId", - identifier = SampleIdentifier.LEFT_4TH_FINGER, - template = template2, + template = BiometricTemplate( + identifier = TemplateIdentifier.LEFT_4TH_FINGER, + template = template2, + ), format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, modality = Modality.FINGERPRINT, ), Sample( referenceId = "referenceId", - identifier = SampleIdentifier.LEFT_5TH_FINGER, - template = template1, + template = BiometricTemplate( + identifier = TemplateIdentifier.LEFT_5TH_FINGER, + template = template1, + ), format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, modality = Modality.FINGERPRINT, ), @@ -137,15 +154,19 @@ class SimAfisMatcherTest { samples = listOf( Sample( referenceId = "referenceId", - identifier = SampleIdentifier.RIGHT_3RD_FINGER, - template = template3, + template = BiometricTemplate( + identifier = TemplateIdentifier.RIGHT_3RD_FINGER, + template = template3, + ), format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, modality = Modality.FINGERPRINT, ), Sample( referenceId = "referenceId", - identifier = SampleIdentifier.RIGHT_5TH_FINGER, - template = template1, + template = BiometricTemplate( + identifier = TemplateIdentifier.RIGHT_5TH_FINGER, + template = template1, + ), format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, modality = Modality.FINGERPRINT, ), @@ -161,8 +182,8 @@ class SimAfisMatcherTest { listOf(candidate1, candidate2), true, ) - val maxScore = matchingResult.maxOf { it.confidence } - val minScore = matchingResult.minOf { it.confidence } + val maxScore = matchingResult.maxOf { it.comparisonScore } + val minScore = matchingResult.minOf { it.comparisonScore } // Then verify(exactly = 8) { jniLibAfis.verify(any(), any()) } assertThat(maxScore).isEqualTo(1) @@ -173,21 +194,30 @@ class SimAfisMatcherTest { fun `test crossFingerMatching zero fingers success`() { // Given every { jniLibAfis.verify(any(), any()) } returns 1F - val probes = listOf() + val probes = BiometricReferenceCapture( + referenceId = "referenceId", + format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, + modality = Modality.FINGERPRINT, + templates = emptyList(), + ) val candidate = Identity( "candidate", listOf( Sample( referenceId = "referenceId", - identifier = SampleIdentifier.LEFT_THUMB, - template = IsoFingerprintTemplateGenerator.generate(1), + template = BiometricTemplate( + identifier = TemplateIdentifier.LEFT_THUMB, + template = IsoFingerprintTemplateGenerator.generate(1), + ), format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, modality = Modality.FINGERPRINT, ), Sample( referenceId = "referenceId", - identifier = SampleIdentifier.LEFT_3RD_FINGER, - template = IsoFingerprintTemplateGenerator.generate(1), + template = BiometricTemplate( + identifier = TemplateIdentifier.LEFT_3RD_FINGER, + template = IsoFingerprintTemplateGenerator.generate(1), + ), format = SIMAFIS_MATCHER_SUPPORTED_TEMPLATE_FORMAT, modality = Modality.FINGERPRINT, ), @@ -198,7 +228,7 @@ class SimAfisMatcherTest { val result = simAfisMatcher.match(probes, listOf(candidate), true) // Then verify(exactly = 0) { jniLibAfis.verify(any(), any()) } - assertThat(result[0].confidence).isEqualTo(0) + assertThat(result[0].comparisonScore).isEqualTo(0) } companion object { diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/local/ConfigLocalDataSourceImpl.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/local/ConfigLocalDataSourceImpl.kt index 9c64dc6380..a6252abb56 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/local/ConfigLocalDataSourceImpl.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/local/ConfigLocalDataSourceImpl.kt @@ -2,7 +2,7 @@ package com.simprints.infra.config.store.local import androidx.datastore.core.DataStore import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.tools.utils.LanguageHelper import com.simprints.infra.config.store.AbsolutePath @@ -185,8 +185,8 @@ internal class ConfigLocalDataSourceImpl @Inject constructor( allowedSDKs = listOf(FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER), secugenSimMatcher = FingerprintConfiguration.FingerprintSdkConfiguration( fingersToCapture = listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER, ), decisionPolicy = DecisionPolicy( 0, @@ -247,7 +247,7 @@ internal class ConfigLocalDataSourceImpl @Inject constructor( ), ), custom = null, - multifactorId = null + multifactorId = null, ).toProto() val defaultDeviceConfiguration: ProtoDeviceConfiguration = DeviceConfiguration( language = "", diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/local/migrations/models/OldProjectConfig.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/local/migrations/models/OldProjectConfig.kt index 3b4fa1bb21..c552c4c0b0 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/local/migrations/models/OldProjectConfig.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/local/migrations/models/OldProjectConfig.kt @@ -3,7 +3,7 @@ package com.simprints.infra.config.store.local.migrations.models import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonProperty import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.json.JsonHelper import com.simprints.infra.config.store.models.ConsentConfiguration @@ -135,10 +135,10 @@ internal data class OldProjectConfig( secugenSimMatcher = FingerprintConfiguration.FingerprintSdkConfiguration( fingersToCapture = fingerprintsToCollect ?.split(",") - ?.map { SampleIdentifier.valueOf(it) } + ?.map { TemplateIdentifier.valueOf(it) } ?: listOf( - SampleIdentifier.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER, ), decisionPolicy = fingerprintConfidenceThresholds?.let { parseDecisionPolicy(it) } ?: DecisionPolicy(0, 0, 700), diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/local/models/Finger.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/local/models/Finger.kt index ba7f9311aa..8a5416e0d8 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/local/models/Finger.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/local/models/Finger.kt @@ -1,31 +1,31 @@ package com.simprints.infra.config.store.local.models -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier -internal fun SampleIdentifier.toProtoFinger(): ProtoFinger = when (this) { - SampleIdentifier.LEFT_THUMB -> ProtoFinger.LEFT_THUMB - SampleIdentifier.LEFT_INDEX_FINGER -> ProtoFinger.LEFT_INDEX_FINGER - SampleIdentifier.LEFT_3RD_FINGER -> ProtoFinger.LEFT_3RD_FINGER - SampleIdentifier.LEFT_4TH_FINGER -> ProtoFinger.LEFT_4TH_FINGER - SampleIdentifier.LEFT_5TH_FINGER -> ProtoFinger.LEFT_5TH_FINGER - SampleIdentifier.RIGHT_THUMB -> ProtoFinger.RIGHT_THUMB - SampleIdentifier.RIGHT_INDEX_FINGER -> ProtoFinger.RIGHT_INDEX_FINGER - SampleIdentifier.RIGHT_3RD_FINGER -> ProtoFinger.RIGHT_3RD_FINGER - SampleIdentifier.RIGHT_4TH_FINGER -> ProtoFinger.RIGHT_4TH_FINGER - SampleIdentifier.RIGHT_5TH_FINGER -> ProtoFinger.RIGHT_5TH_FINGER +internal fun TemplateIdentifier.toProtoFinger(): ProtoFinger = when (this) { + TemplateIdentifier.LEFT_THUMB -> ProtoFinger.LEFT_THUMB + TemplateIdentifier.LEFT_INDEX_FINGER -> ProtoFinger.LEFT_INDEX_FINGER + TemplateIdentifier.LEFT_3RD_FINGER -> ProtoFinger.LEFT_3RD_FINGER + TemplateIdentifier.LEFT_4TH_FINGER -> ProtoFinger.LEFT_4TH_FINGER + TemplateIdentifier.LEFT_5TH_FINGER -> ProtoFinger.LEFT_5TH_FINGER + TemplateIdentifier.RIGHT_THUMB -> ProtoFinger.RIGHT_THUMB + TemplateIdentifier.RIGHT_INDEX_FINGER -> ProtoFinger.RIGHT_INDEX_FINGER + TemplateIdentifier.RIGHT_3RD_FINGER -> ProtoFinger.RIGHT_3RD_FINGER + TemplateIdentifier.RIGHT_4TH_FINGER -> ProtoFinger.RIGHT_4TH_FINGER + TemplateIdentifier.RIGHT_5TH_FINGER -> ProtoFinger.RIGHT_5TH_FINGER else -> ProtoFinger.UNRECOGNIZED } -internal fun ProtoFinger.toDomain(): SampleIdentifier = when (this) { - ProtoFinger.UNRECOGNIZED -> SampleIdentifier.NONE - ProtoFinger.LEFT_THUMB -> SampleIdentifier.LEFT_THUMB - ProtoFinger.LEFT_INDEX_FINGER -> SampleIdentifier.LEFT_INDEX_FINGER - ProtoFinger.LEFT_3RD_FINGER -> SampleIdentifier.LEFT_3RD_FINGER - ProtoFinger.LEFT_4TH_FINGER -> SampleIdentifier.LEFT_4TH_FINGER - ProtoFinger.LEFT_5TH_FINGER -> SampleIdentifier.LEFT_5TH_FINGER - ProtoFinger.RIGHT_THUMB -> SampleIdentifier.RIGHT_THUMB - ProtoFinger.RIGHT_INDEX_FINGER -> SampleIdentifier.RIGHT_INDEX_FINGER - ProtoFinger.RIGHT_3RD_FINGER -> SampleIdentifier.RIGHT_3RD_FINGER - ProtoFinger.RIGHT_4TH_FINGER -> SampleIdentifier.RIGHT_4TH_FINGER - ProtoFinger.RIGHT_5TH_FINGER -> SampleIdentifier.RIGHT_5TH_FINGER +internal fun ProtoFinger.toDomain(): TemplateIdentifier = when (this) { + ProtoFinger.UNRECOGNIZED -> TemplateIdentifier.NONE + ProtoFinger.LEFT_THUMB -> TemplateIdentifier.LEFT_THUMB + ProtoFinger.LEFT_INDEX_FINGER -> TemplateIdentifier.LEFT_INDEX_FINGER + ProtoFinger.LEFT_3RD_FINGER -> TemplateIdentifier.LEFT_3RD_FINGER + ProtoFinger.LEFT_4TH_FINGER -> TemplateIdentifier.LEFT_4TH_FINGER + ProtoFinger.LEFT_5TH_FINGER -> TemplateIdentifier.LEFT_5TH_FINGER + ProtoFinger.RIGHT_THUMB -> TemplateIdentifier.RIGHT_THUMB + ProtoFinger.RIGHT_INDEX_FINGER -> TemplateIdentifier.RIGHT_INDEX_FINGER + ProtoFinger.RIGHT_3RD_FINGER -> TemplateIdentifier.RIGHT_3RD_FINGER + ProtoFinger.RIGHT_4TH_FINGER -> TemplateIdentifier.RIGHT_4TH_FINGER + ProtoFinger.RIGHT_5TH_FINGER -> TemplateIdentifier.RIGHT_5TH_FINGER } diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/models/FingerprintConfiguration.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/models/FingerprintConfiguration.kt index 81dbc7dbdc..908ab709b5 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/models/FingerprintConfiguration.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/models/FingerprintConfiguration.kt @@ -2,7 +2,7 @@ package com.simprints.infra.config.store.models import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.ModalitySdkType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier data class FingerprintConfiguration( val allowedScanners: List, @@ -12,7 +12,7 @@ data class FingerprintConfiguration( val nec: FingerprintSdkConfiguration?, ) { data class FingerprintSdkConfiguration( - val fingersToCapture: List, + val fingersToCapture: List, override val decisionPolicy: DecisionPolicy, val comparisonStrategyForVerification: FingerComparisonStrategy, val vero1: Vero1Configuration? = null, diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/remote/models/ApiFingerprintConfiguration.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/remote/models/ApiFingerprintConfiguration.kt index 42c13773f0..f045c6fc4d 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/remote/models/ApiFingerprintConfiguration.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/remote/models/ApiFingerprintConfiguration.kt @@ -2,7 +2,7 @@ package com.simprints.infra.config.store.remote.models import androidx.annotation.Keep import com.simprints.core.domain.common.AgeGroup -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.config.store.models.FingerprintConfiguration @Keep @@ -59,16 +59,16 @@ internal data class ApiFingerprintConfiguration( ; fun toDomain() = when (this) { - LEFT_THUMB -> SampleIdentifier.LEFT_THUMB - LEFT_INDEX_FINGER -> SampleIdentifier.LEFT_INDEX_FINGER - LEFT_3RD_FINGER -> SampleIdentifier.LEFT_3RD_FINGER - LEFT_4TH_FINGER -> SampleIdentifier.LEFT_4TH_FINGER - LEFT_5TH_FINGER -> SampleIdentifier.LEFT_5TH_FINGER - RIGHT_THUMB -> SampleIdentifier.RIGHT_THUMB - RIGHT_INDEX_FINGER -> SampleIdentifier.RIGHT_INDEX_FINGER - RIGHT_3RD_FINGER -> SampleIdentifier.RIGHT_3RD_FINGER - RIGHT_4TH_FINGER -> SampleIdentifier.RIGHT_4TH_FINGER - RIGHT_5TH_FINGER -> SampleIdentifier.RIGHT_5TH_FINGER + LEFT_THUMB -> TemplateIdentifier.LEFT_THUMB + LEFT_INDEX_FINGER -> TemplateIdentifier.LEFT_INDEX_FINGER + LEFT_3RD_FINGER -> TemplateIdentifier.LEFT_3RD_FINGER + LEFT_4TH_FINGER -> TemplateIdentifier.LEFT_4TH_FINGER + LEFT_5TH_FINGER -> TemplateIdentifier.LEFT_5TH_FINGER + RIGHT_THUMB -> TemplateIdentifier.RIGHT_THUMB + RIGHT_INDEX_FINGER -> TemplateIdentifier.RIGHT_INDEX_FINGER + RIGHT_3RD_FINGER -> TemplateIdentifier.RIGHT_3RD_FINGER + RIGHT_4TH_FINGER -> TemplateIdentifier.RIGHT_4TH_FINGER + RIGHT_5TH_FINGER -> TemplateIdentifier.RIGHT_5TH_FINGER } } diff --git a/infra/config-store/src/test/java/com/simprints/infra/config/store/local/models/FingerprintConfigurationTest.kt b/infra/config-store/src/test/java/com/simprints/infra/config/store/local/models/FingerprintConfigurationTest.kt index 614501df9a..c67efb5852 100644 --- a/infra/config-store/src/test/java/com/simprints/infra/config/store/local/models/FingerprintConfigurationTest.kt +++ b/infra/config-store/src/test/java/com/simprints/infra/config/store/local/models/FingerprintConfigurationTest.kt @@ -2,7 +2,7 @@ package com.simprints.infra.config.store.local.models import com.google.common.truth.Truth.* import com.simprints.core.domain.common.AgeGroup -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.testtools.fingerprintConfiguration import com.simprints.infra.config.store.testtools.protoFingerprintConfiguration @@ -44,16 +44,16 @@ class FingerprintConfigurationTest { @Test fun `should map correctly the Finger enums`() { val mapping = mapOf( - ProtoFinger.LEFT_THUMB to SampleIdentifier.LEFT_THUMB, - ProtoFinger.LEFT_INDEX_FINGER to SampleIdentifier.LEFT_INDEX_FINGER, - ProtoFinger.LEFT_3RD_FINGER to SampleIdentifier.LEFT_3RD_FINGER, - ProtoFinger.LEFT_4TH_FINGER to SampleIdentifier.LEFT_4TH_FINGER, - ProtoFinger.LEFT_5TH_FINGER to SampleIdentifier.LEFT_5TH_FINGER, - ProtoFinger.RIGHT_THUMB to SampleIdentifier.RIGHT_THUMB, - ProtoFinger.RIGHT_INDEX_FINGER to SampleIdentifier.RIGHT_INDEX_FINGER, - ProtoFinger.RIGHT_3RD_FINGER to SampleIdentifier.RIGHT_3RD_FINGER, - ProtoFinger.RIGHT_4TH_FINGER to SampleIdentifier.RIGHT_4TH_FINGER, - ProtoFinger.RIGHT_5TH_FINGER to SampleIdentifier.RIGHT_5TH_FINGER, + ProtoFinger.LEFT_THUMB to TemplateIdentifier.LEFT_THUMB, + ProtoFinger.LEFT_INDEX_FINGER to TemplateIdentifier.LEFT_INDEX_FINGER, + ProtoFinger.LEFT_3RD_FINGER to TemplateIdentifier.LEFT_3RD_FINGER, + ProtoFinger.LEFT_4TH_FINGER to TemplateIdentifier.LEFT_4TH_FINGER, + ProtoFinger.LEFT_5TH_FINGER to TemplateIdentifier.LEFT_5TH_FINGER, + ProtoFinger.RIGHT_THUMB to TemplateIdentifier.RIGHT_THUMB, + ProtoFinger.RIGHT_INDEX_FINGER to TemplateIdentifier.RIGHT_INDEX_FINGER, + ProtoFinger.RIGHT_3RD_FINGER to TemplateIdentifier.RIGHT_3RD_FINGER, + ProtoFinger.RIGHT_4TH_FINGER to TemplateIdentifier.RIGHT_4TH_FINGER, + ProtoFinger.RIGHT_5TH_FINGER to TemplateIdentifier.RIGHT_5TH_FINGER, ) mapping.forEach { diff --git a/infra/config-store/src/test/java/com/simprints/infra/config/store/models/FingerprintConfigurationTest.kt b/infra/config-store/src/test/java/com/simprints/infra/config/store/models/FingerprintConfigurationTest.kt index 0a3eef1a55..410226185c 100644 --- a/infra/config-store/src/test/java/com/simprints/infra/config/store/models/FingerprintConfigurationTest.kt +++ b/infra/config-store/src/test/java/com/simprints/infra/config/store/models/FingerprintConfigurationTest.kt @@ -1,7 +1,7 @@ package com.simprints.infra.config.store.models import com.google.common.truth.* -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import org.junit.Test class FingerprintConfigurationTest { @@ -12,7 +12,7 @@ class FingerprintConfigurationTest { allowedSDKs = listOf(FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER), displayHandIcons = true, secugenSimMatcher = FingerprintConfiguration.FingerprintSdkConfiguration( - fingersToCapture = listOf(SampleIdentifier.LEFT_THUMB), + fingersToCapture = listOf(TemplateIdentifier.LEFT_THUMB), decisionPolicy = DecisionPolicy(20, 50, 100), comparisonStrategyForVerification = FingerprintConfiguration.FingerComparisonStrategy.SAME_FINGER, vero1 = Vero1Configuration(60), @@ -34,7 +34,7 @@ class FingerprintConfigurationTest { displayHandIcons = true, secugenSimMatcher = null, nec = FingerprintConfiguration.FingerprintSdkConfiguration( - fingersToCapture = listOf(SampleIdentifier.LEFT_THUMB), + fingersToCapture = listOf(TemplateIdentifier.LEFT_THUMB), decisionPolicy = DecisionPolicy(20, 50, 100), comparisonStrategyForVerification = FingerprintConfiguration.FingerComparisonStrategy.SAME_FINGER, vero1 = Vero1Configuration(60), diff --git a/infra/config-store/src/test/java/com/simprints/infra/config/store/remote/models/ApiFingerprintConfigurationTest.kt b/infra/config-store/src/test/java/com/simprints/infra/config/store/remote/models/ApiFingerprintConfigurationTest.kt index d56b56e080..5f20e33724 100644 --- a/infra/config-store/src/test/java/com/simprints/infra/config/store/remote/models/ApiFingerprintConfigurationTest.kt +++ b/infra/config-store/src/test/java/com/simprints/infra/config/store/remote/models/ApiFingerprintConfigurationTest.kt @@ -2,7 +2,7 @@ package com.simprints.infra.config.store.remote.models import com.google.common.truth.Truth.* import com.simprints.core.domain.common.AgeGroup -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.MaxCaptureAttempts import com.simprints.infra.config.store.models.Vero1Configuration @@ -56,7 +56,7 @@ class ApiFingerprintConfigurationTest { listOf(FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER), true, FingerprintConfiguration.FingerprintSdkConfiguration( - fingersToCapture = listOf(SampleIdentifier.LEFT_3RD_FINGER), + fingersToCapture = listOf(TemplateIdentifier.LEFT_3RD_FINGER), decisionPolicy = decisionPolicy, comparisonStrategyForVerification = FingerprintConfiguration.FingerComparisonStrategy.SAME_FINGER, vero1 = null, @@ -94,7 +94,7 @@ class ApiFingerprintConfigurationTest { true, null, FingerprintConfiguration.FingerprintSdkConfiguration( - fingersToCapture = listOf(SampleIdentifier.LEFT_3RD_FINGER), + fingersToCapture = listOf(TemplateIdentifier.LEFT_3RD_FINGER), decisionPolicy = decisionPolicy, comparisonStrategyForVerification = FingerprintConfiguration.FingerComparisonStrategy.SAME_FINGER, vero1 = Vero1Configuration(10), @@ -111,16 +111,16 @@ class ApiFingerprintConfigurationTest { @Test fun `should map correctly the Finger enums`() { val mapping = mapOf( - ApiFingerprintConfiguration.ApiFinger.LEFT_THUMB to SampleIdentifier.LEFT_THUMB, - ApiFingerprintConfiguration.ApiFinger.LEFT_INDEX_FINGER to SampleIdentifier.LEFT_INDEX_FINGER, - ApiFingerprintConfiguration.ApiFinger.LEFT_3RD_FINGER to SampleIdentifier.LEFT_3RD_FINGER, - ApiFingerprintConfiguration.ApiFinger.LEFT_4TH_FINGER to SampleIdentifier.LEFT_4TH_FINGER, - ApiFingerprintConfiguration.ApiFinger.LEFT_5TH_FINGER to SampleIdentifier.LEFT_5TH_FINGER, - ApiFingerprintConfiguration.ApiFinger.RIGHT_THUMB to SampleIdentifier.RIGHT_THUMB, - ApiFingerprintConfiguration.ApiFinger.RIGHT_INDEX_FINGER to SampleIdentifier.RIGHT_INDEX_FINGER, - ApiFingerprintConfiguration.ApiFinger.RIGHT_3RD_FINGER to SampleIdentifier.RIGHT_3RD_FINGER, - ApiFingerprintConfiguration.ApiFinger.RIGHT_4TH_FINGER to SampleIdentifier.RIGHT_4TH_FINGER, - ApiFingerprintConfiguration.ApiFinger.RIGHT_5TH_FINGER to SampleIdentifier.RIGHT_5TH_FINGER, + ApiFingerprintConfiguration.ApiFinger.LEFT_THUMB to TemplateIdentifier.LEFT_THUMB, + ApiFingerprintConfiguration.ApiFinger.LEFT_INDEX_FINGER to TemplateIdentifier.LEFT_INDEX_FINGER, + ApiFingerprintConfiguration.ApiFinger.LEFT_3RD_FINGER to TemplateIdentifier.LEFT_3RD_FINGER, + ApiFingerprintConfiguration.ApiFinger.LEFT_4TH_FINGER to TemplateIdentifier.LEFT_4TH_FINGER, + ApiFingerprintConfiguration.ApiFinger.LEFT_5TH_FINGER to TemplateIdentifier.LEFT_5TH_FINGER, + ApiFingerprintConfiguration.ApiFinger.RIGHT_THUMB to TemplateIdentifier.RIGHT_THUMB, + ApiFingerprintConfiguration.ApiFinger.RIGHT_INDEX_FINGER to TemplateIdentifier.RIGHT_INDEX_FINGER, + ApiFingerprintConfiguration.ApiFinger.RIGHT_3RD_FINGER to TemplateIdentifier.RIGHT_3RD_FINGER, + ApiFingerprintConfiguration.ApiFinger.RIGHT_4TH_FINGER to TemplateIdentifier.RIGHT_4TH_FINGER, + ApiFingerprintConfiguration.ApiFinger.RIGHT_5TH_FINGER to TemplateIdentifier.RIGHT_5TH_FINGER, ) mapping.forEach { diff --git a/infra/config-store/src/test/java/com/simprints/infra/config/store/testtools/Models.kt b/infra/config-store/src/test/java/com/simprints/infra/config/store/testtools/Models.kt index c9521af088..b03c2a18ab 100644 --- a/infra/config-store/src/test/java/com/simprints/infra/config/store/testtools/Models.kt +++ b/infra/config-store/src/test/java/com/simprints/infra/config/store/testtools/Models.kt @@ -3,7 +3,7 @@ package com.simprints.infra.config.store.testtools import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.config.store.local.models.ProtoAllowedAgeRange import com.simprints.infra.config.store.local.models.ProtoConsentConfiguration @@ -269,7 +269,7 @@ internal val apiFingerprintConfiguration = ApiFingerprintConfiguration( ) internal val fingerprintSdkConfiguration = FingerprintConfiguration.FingerprintSdkConfiguration( - fingersToCapture = listOf(SampleIdentifier.LEFT_3RD_FINGER), + fingersToCapture = listOf(TemplateIdentifier.LEFT_3RD_FINGER), decisionPolicy = decisionPolicy, comparisonStrategyForVerification = FingerprintConfiguration.FingerComparisonStrategy.SAME_FINGER, vero1 = Vero1Configuration(qualityThreshold = 10), diff --git a/infra/core/src/main/java/com/simprints/core/domain/reference/BiometricReferenceCapture.kt b/infra/core/src/main/java/com/simprints/core/domain/reference/BiometricReferenceCapture.kt new file mode 100644 index 0000000000..26f74d647d --- /dev/null +++ b/infra/core/src/main/java/com/simprints/core/domain/reference/BiometricReferenceCapture.kt @@ -0,0 +1,19 @@ +package com.simprints.core.domain.reference + +import android.os.Parcelable +import androidx.annotation.Keep +import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.step.StepParams +import com.simprints.core.domain.step.StepResult +import kotlinx.parcelize.Parcelize + +@Keep +@Parcelize +data class BiometricReferenceCapture( + val referenceId: String, + val modality: Modality, + val format: String, + var templates: List, +) : StepResult, + StepParams, + Parcelable diff --git a/infra/core/src/main/java/com/simprints/core/domain/reference/BiometricTemplate.kt b/infra/core/src/main/java/com/simprints/core/domain/reference/BiometricTemplate.kt new file mode 100644 index 0000000000..39d138fbf9 --- /dev/null +++ b/infra/core/src/main/java/com/simprints/core/domain/reference/BiometricTemplate.kt @@ -0,0 +1,34 @@ +package com.simprints.core.domain.reference + +import android.os.Parcelable +import com.simprints.core.ExcludedFromGeneratedTestCoverageReports +import com.simprints.core.domain.step.StepParams +import com.simprints.core.domain.step.StepResult +import kotlinx.parcelize.Parcelize + +@Parcelize +@ExcludedFromGeneratedTestCoverageReports("Data class with generated code") +data class BiometricTemplate( + val template: ByteArray, + val identifier: TemplateIdentifier = TemplateIdentifier.NONE, +) : StepParams, + StepResult, + Parcelable { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as BiometricTemplate + + if (!template.contentEquals(other.template)) return false + if (identifier != other.identifier) return false + + return true + } + + override fun hashCode(): Int { + var result = template.contentHashCode() + result = 31 * result + identifier.hashCode() + return result + } +} diff --git a/infra/core/src/main/java/com/simprints/core/domain/sample/CaptureSample.kt b/infra/core/src/main/java/com/simprints/core/domain/reference/BiometricTemplateCapture.kt similarity index 61% rename from infra/core/src/main/java/com/simprints/core/domain/sample/CaptureSample.kt rename to infra/core/src/main/java/com/simprints/core/domain/reference/BiometricTemplateCapture.kt index 28b5d533ff..4e945e7965 100644 --- a/infra/core/src/main/java/com/simprints/core/domain/sample/CaptureSample.kt +++ b/infra/core/src/main/java/com/simprints/core/domain/reference/BiometricTemplateCapture.kt @@ -1,40 +1,35 @@ -package com.simprints.core.domain.sample +package com.simprints.core.domain.reference import android.os.Parcelable import com.simprints.core.ExcludedFromGeneratedTestCoverageReports -import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.step.StepParams import com.simprints.core.domain.step.StepResult import kotlinx.parcelize.Parcelize -import java.util.UUID @Parcelize @ExcludedFromGeneratedTestCoverageReports("Data class with generated code") -data class CaptureSample( +data class BiometricTemplateCapture( val captureEventId: String, - val modality: Modality, - val format: String, val template: ByteArray, - val identifier: SampleIdentifier = SampleIdentifier.NONE, -) : StepResult, - StepParams, + val identifier: TemplateIdentifier = TemplateIdentifier.NONE, +) : StepParams, + StepResult, Parcelable { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false - other as CaptureSample + other as BiometricTemplateCapture - if (identifier != other.identifier) return false if (!template.contentEquals(other.template)) return false + if (identifier != other.identifier) return false return true } override fun hashCode(): Int { - var result = identifier.hashCode() - result = 31 * result + template.contentHashCode() + var result = template.contentHashCode() + result = 31 * result + identifier.hashCode() return result } } diff --git a/infra/core/src/main/java/com/simprints/core/domain/sample/SampleIdentifier.kt b/infra/core/src/main/java/com/simprints/core/domain/reference/TemplateIdentifier.kt similarity index 84% rename from infra/core/src/main/java/com/simprints/core/domain/sample/SampleIdentifier.kt rename to infra/core/src/main/java/com/simprints/core/domain/reference/TemplateIdentifier.kt index 2082a60101..b4fe10ded4 100644 --- a/infra/core/src/main/java/com/simprints/core/domain/sample/SampleIdentifier.kt +++ b/infra/core/src/main/java/com/simprints/core/domain/reference/TemplateIdentifier.kt @@ -1,11 +1,11 @@ -package com.simprints.core.domain.sample +package com.simprints.core.domain.reference import androidx.annotation.Keep import com.simprints.core.ExcludedFromGeneratedTestCoverageReports @Keep @ExcludedFromGeneratedTestCoverageReports("Enum") -enum class SampleIdentifier { +enum class TemplateIdentifier { NONE, // Fingerprint specific identifiers diff --git a/infra/core/src/main/java/com/simprints/core/domain/sample/CaptureIdentity.kt b/infra/core/src/main/java/com/simprints/core/domain/sample/CaptureIdentity.kt deleted file mode 100644 index cc6ef358f8..0000000000 --- a/infra/core/src/main/java/com/simprints/core/domain/sample/CaptureIdentity.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.simprints.core.domain.sample - -import androidx.annotation.Keep -import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.step.StepResult - -@Keep -data class CaptureIdentity( - val referenceId: String, - val modality: Modality, - var samples: List, -) : StepResult diff --git a/infra/core/src/main/java/com/simprints/core/domain/sample/MatchComparisonResult.kt b/infra/core/src/main/java/com/simprints/core/domain/sample/ComparisonResult.kt similarity index 84% rename from infra/core/src/main/java/com/simprints/core/domain/sample/MatchComparisonResult.kt rename to infra/core/src/main/java/com/simprints/core/domain/sample/ComparisonResult.kt index 17964472a7..cce2f13fd5 100644 --- a/infra/core/src/main/java/com/simprints/core/domain/sample/MatchComparisonResult.kt +++ b/infra/core/src/main/java/com/simprints/core/domain/sample/ComparisonResult.kt @@ -8,9 +8,9 @@ import kotlinx.parcelize.Parcelize @Keep @Parcelize -data class MatchComparisonResult( +data class ComparisonResult( val subjectId: String, - val confidence: Float, + val comparisonScore: Float, ) : StepParams, StepResult, Parcelable diff --git a/infra/core/src/main/java/com/simprints/core/domain/sample/Sample.kt b/infra/core/src/main/java/com/simprints/core/domain/sample/Sample.kt index b6f54799dd..d5308eebdd 100644 --- a/infra/core/src/main/java/com/simprints/core/domain/sample/Sample.kt +++ b/infra/core/src/main/java/com/simprints/core/domain/sample/Sample.kt @@ -3,7 +3,7 @@ package com.simprints.core.domain.sample import android.os.Parcelable import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.BiometricTemplate import kotlinx.parcelize.Parcelize import java.util.UUID @@ -11,27 +11,21 @@ import java.util.UUID @ExcludedFromGeneratedTestCoverageReports("Data class with generated code") data class Sample( val id: String = UUID.randomUUID().toString(), - val identifier: SampleIdentifier = SampleIdentifier.NONE, val modality: Modality, val referenceId: String, val format: String, - val template: ByteArray, + val template: BiometricTemplate, ) : Parcelable { + // TODO: due to random IDs, direct comparison of data classes is broken + // this will be fixed in future refactoring of sample class override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as Sample - if (identifier != other.identifier) return false - if (!template.contentEquals(other.template)) return false - - return true + return template == other.template } - override fun hashCode(): Int { - var result = identifier.hashCode() - result = 31 * result + template.contentHashCode() - return result - } + override fun hashCode(): Int = template.hashCode() } diff --git a/infra/enrolment-records/repository/src/androidTest/kotlin/com/simprints/infra/enrolment/records/repository/local/RealmEnrolmentRecordLocalDataSourceIntegrationTest.kt b/infra/enrolment-records/repository/src/androidTest/kotlin/com/simprints/infra/enrolment/records/repository/local/RealmEnrolmentRecordLocalDataSourceIntegrationTest.kt index 7f4aa067a3..bea9b2fa78 100644 --- a/infra/enrolment-records/repository/src/androidTest/kotlin/com/simprints/infra/enrolment/records/repository/local/RealmEnrolmentRecordLocalDataSourceIntegrationTest.kt +++ b/infra/enrolment-records/repository/src/androidTest/kotlin/com/simprints/infra/enrolment/records/repository/local/RealmEnrolmentRecordLocalDataSourceIntegrationTest.kt @@ -5,8 +5,9 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.TimeHelper @@ -236,7 +237,9 @@ class RealmEnrolmentRecordLocalDataSourceIntegrationTest { val originalSubject = createTestSubject(subjectId) originalSubject.samples = listOf( Sample( - template = byteArrayOf(), + template = BiometricTemplate( + template = byteArrayOf(), + ), format = "ISO", referenceId = "ref1", modality = Modality.FACE, @@ -256,16 +259,20 @@ class RealmEnrolmentRecordLocalDataSourceIntegrationTest { subjectId, samplesToAdd = listOf( Sample( - template = byteArrayOf(1, 2, 3), + template = BiometricTemplate( + template = byteArrayOf(1, 2, 3), + ), format = "ISO", referenceId = "ref2", modality = Modality.FACE, ), Sample( - template = byteArrayOf(4, 5, 6), + template = BiometricTemplate( + template = byteArrayOf(4, 5, 6), + identifier = TemplateIdentifier.LEFT_THUMB, + ), format = "ISO", referenceId = "ref3", - identifier = SampleIdentifier.LEFT_THUMB, modality = Modality.FINGERPRINT, ), ), @@ -312,7 +319,9 @@ class RealmEnrolmentRecordLocalDataSourceIntegrationTest { createTestSubject(subjectId = UUID.randomUUID().toString()).apply { samples = listOf( Sample( - template = byteArrayOf(i.toByte()), + template = BiometricTemplate( + template = byteArrayOf(i.toByte()), + ), format = "ISO", referenceId = "ref$i", modality = Modality.FACE, @@ -359,10 +368,12 @@ class RealmEnrolmentRecordLocalDataSourceIntegrationTest { createTestSubject(subjectId = UUID.randomUUID().toString()).apply { samples = listOf( Sample( - template = byteArrayOf(i.toByte()), + template = BiometricTemplate( + template = byteArrayOf(i.toByte()), + identifier = TemplateIdentifier.LEFT_THUMB, + ), format = "ISO", referenceId = "ref$i", - identifier = SampleIdentifier.LEFT_THUMB, modality = Modality.FINGERPRINT, ), ) diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/commcare/CommCareIdentityDataSource.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/commcare/CommCareIdentityDataSource.kt index a6c0619363..cd27575a37 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/commcare/CommCareIdentityDataSource.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/commcare/CommCareIdentityDataSource.kt @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule import com.simprints.core.AvailableProcessors import com.simprints.core.DispatcherBG import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Identity import com.simprints.core.domain.sample.Sample import com.simprints.core.domain.tokenization.TokenizableString @@ -117,7 +118,9 @@ internal class CommCareIdentityDataSource @Inject constructor( null } else { Sample( - template = encoder.base64ToBytes(faceTemplate.template), + template = BiometricTemplate( + template = encoder.base64ToBytes(faceTemplate.template), + ), format = reference.format, referenceId = reference.id, modality = Modality.FACE, @@ -130,8 +133,10 @@ internal class CommCareIdentityDataSource @Inject constructor( null } else { Sample( - identifier = fingerprintTemplate.finger, - template = encoder.base64ToBytes(fingerprintTemplate.template), + template = BiometricTemplate( + identifier = fingerprintTemplate.finger, + template = encoder.base64ToBytes(fingerprintTemplate.template), + ), format = reference.format, referenceId = reference.id, modality = Modality.FINGERPRINT, diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/RoomEnrolmentRecordLocalDataSource.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/RoomEnrolmentRecordLocalDataSource.kt index e9af15d33c..0cf3de4f38 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/RoomEnrolmentRecordLocalDataSource.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/RoomEnrolmentRecordLocalDataSource.kt @@ -2,6 +2,7 @@ package com.simprints.infra.enrolment.records.repository.local import androidx.room.withTransaction import com.simprints.core.DispatcherIO +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Identity import com.simprints.core.domain.sample.Sample import com.simprints.core.tools.time.TimeHelper @@ -12,7 +13,7 @@ import com.simprints.infra.enrolment.records.repository.domain.models.BiometricD import com.simprints.infra.enrolment.records.repository.domain.models.IdentityBatch import com.simprints.infra.enrolment.records.repository.domain.models.SubjectAction import com.simprints.infra.enrolment.records.repository.domain.models.SubjectQuery -import com.simprints.infra.enrolment.records.repository.local.models.DbSampleIdentifier +import com.simprints.infra.enrolment.records.repository.local.models.DbTemplateIdentifier import com.simprints.infra.enrolment.records.repository.local.models.toDomain import com.simprints.infra.enrolment.records.repository.local.models.toRoomDb import com.simprints.infra.enrolment.records.room.store.BuildConfig.DB_ENCRYPTION @@ -101,8 +102,10 @@ internal class RoomEnrolmentRecordLocalDataSource @Inject constructor( samples = templates.map { sample -> Sample( id = sample.uuid, - template = sample.templateData, - identifier = DbSampleIdentifier.fromId(sample.identifier).toDomain(), + template = BiometricTemplate( + template = sample.templateData, + identifier = DbTemplateIdentifier.fromId(sample.identifier).toDomain(), + ), format = sample.format, referenceId = sample.referenceId, modality = DbModality.fromId(sample.modality).toDomain(), diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/DbSampleIdentifier.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/DbSampleIdentifier.kt deleted file mode 100644 index b0a4568542..0000000000 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/DbSampleIdentifier.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.simprints.infra.enrolment.records.repository.local.models - -import com.simprints.core.domain.sample.SampleIdentifier - -enum class DbSampleIdentifier( - val id: Int, -) { - RIGHT_5TH_FINGER(0), - RIGHT_4TH_FINGER(1), - RIGHT_3RD_FINGER(2), - RIGHT_INDEX_FINGER(3), - RIGHT_THUMB(4), - LEFT_THUMB(5), - LEFT_INDEX_FINGER(6), - LEFT_3RD_FINGER(7), - LEFT_4TH_FINGER(8), - LEFT_5TH_FINGER(9), - ; - - companion object Companion { - fun fromId(id: Int?) = DbSampleIdentifier.entries.firstOrNull { it.id == id } - } -} - -internal fun DbSampleIdentifier?.toDomain() = when (this) { - null -> SampleIdentifier.NONE - DbSampleIdentifier.RIGHT_5TH_FINGER -> SampleIdentifier.RIGHT_5TH_FINGER - DbSampleIdentifier.RIGHT_4TH_FINGER -> SampleIdentifier.RIGHT_4TH_FINGER - DbSampleIdentifier.RIGHT_3RD_FINGER -> SampleIdentifier.RIGHT_3RD_FINGER - DbSampleIdentifier.RIGHT_INDEX_FINGER -> SampleIdentifier.RIGHT_INDEX_FINGER - DbSampleIdentifier.RIGHT_THUMB -> SampleIdentifier.RIGHT_THUMB - DbSampleIdentifier.LEFT_THUMB -> SampleIdentifier.LEFT_THUMB - DbSampleIdentifier.LEFT_INDEX_FINGER -> SampleIdentifier.LEFT_INDEX_FINGER - DbSampleIdentifier.LEFT_3RD_FINGER -> SampleIdentifier.LEFT_3RD_FINGER - DbSampleIdentifier.LEFT_4TH_FINGER -> SampleIdentifier.LEFT_4TH_FINGER - DbSampleIdentifier.LEFT_5TH_FINGER -> SampleIdentifier.LEFT_5TH_FINGER -} - -internal fun SampleIdentifier.fromDomain() = when (this) { - SampleIdentifier.NONE -> null - SampleIdentifier.RIGHT_5TH_FINGER -> DbSampleIdentifier.RIGHT_5TH_FINGER - SampleIdentifier.RIGHT_4TH_FINGER -> DbSampleIdentifier.RIGHT_4TH_FINGER - SampleIdentifier.RIGHT_3RD_FINGER -> DbSampleIdentifier.RIGHT_3RD_FINGER - SampleIdentifier.RIGHT_INDEX_FINGER -> DbSampleIdentifier.RIGHT_INDEX_FINGER - SampleIdentifier.RIGHT_THUMB -> DbSampleIdentifier.RIGHT_THUMB - SampleIdentifier.LEFT_THUMB -> DbSampleIdentifier.LEFT_THUMB - SampleIdentifier.LEFT_INDEX_FINGER -> DbSampleIdentifier.LEFT_INDEX_FINGER - SampleIdentifier.LEFT_3RD_FINGER -> DbSampleIdentifier.LEFT_3RD_FINGER - SampleIdentifier.LEFT_4TH_FINGER -> DbSampleIdentifier.LEFT_4TH_FINGER - SampleIdentifier.LEFT_5TH_FINGER -> DbSampleIdentifier.LEFT_5TH_FINGER -} diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/DbTemplateIdentifier.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/DbTemplateIdentifier.kt new file mode 100644 index 0000000000..88f0acd4ab --- /dev/null +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/DbTemplateIdentifier.kt @@ -0,0 +1,51 @@ +package com.simprints.infra.enrolment.records.repository.local.models + +import com.simprints.core.domain.reference.TemplateIdentifier + +enum class DbTemplateIdentifier( + val id: Int, +) { + RIGHT_5TH_FINGER(0), + RIGHT_4TH_FINGER(1), + RIGHT_3RD_FINGER(2), + RIGHT_INDEX_FINGER(3), + RIGHT_THUMB(4), + LEFT_THUMB(5), + LEFT_INDEX_FINGER(6), + LEFT_3RD_FINGER(7), + LEFT_4TH_FINGER(8), + LEFT_5TH_FINGER(9), + ; + + companion object Companion { + fun fromId(id: Int?) = DbTemplateIdentifier.entries.firstOrNull { it.id == id } + } +} + +internal fun DbTemplateIdentifier?.toDomain() = when (this) { + null -> TemplateIdentifier.NONE + DbTemplateIdentifier.RIGHT_5TH_FINGER -> TemplateIdentifier.RIGHT_5TH_FINGER + DbTemplateIdentifier.RIGHT_4TH_FINGER -> TemplateIdentifier.RIGHT_4TH_FINGER + DbTemplateIdentifier.RIGHT_3RD_FINGER -> TemplateIdentifier.RIGHT_3RD_FINGER + DbTemplateIdentifier.RIGHT_INDEX_FINGER -> TemplateIdentifier.RIGHT_INDEX_FINGER + DbTemplateIdentifier.RIGHT_THUMB -> TemplateIdentifier.RIGHT_THUMB + DbTemplateIdentifier.LEFT_THUMB -> TemplateIdentifier.LEFT_THUMB + DbTemplateIdentifier.LEFT_INDEX_FINGER -> TemplateIdentifier.LEFT_INDEX_FINGER + DbTemplateIdentifier.LEFT_3RD_FINGER -> TemplateIdentifier.LEFT_3RD_FINGER + DbTemplateIdentifier.LEFT_4TH_FINGER -> TemplateIdentifier.LEFT_4TH_FINGER + DbTemplateIdentifier.LEFT_5TH_FINGER -> TemplateIdentifier.LEFT_5TH_FINGER +} + +internal fun TemplateIdentifier.fromDomain() = when (this) { + TemplateIdentifier.NONE -> null + TemplateIdentifier.RIGHT_5TH_FINGER -> DbTemplateIdentifier.RIGHT_5TH_FINGER + TemplateIdentifier.RIGHT_4TH_FINGER -> DbTemplateIdentifier.RIGHT_4TH_FINGER + TemplateIdentifier.RIGHT_3RD_FINGER -> DbTemplateIdentifier.RIGHT_3RD_FINGER + TemplateIdentifier.RIGHT_INDEX_FINGER -> DbTemplateIdentifier.RIGHT_INDEX_FINGER + TemplateIdentifier.RIGHT_THUMB -> DbTemplateIdentifier.RIGHT_THUMB + TemplateIdentifier.LEFT_THUMB -> DbTemplateIdentifier.LEFT_THUMB + TemplateIdentifier.LEFT_INDEX_FINGER -> DbTemplateIdentifier.LEFT_INDEX_FINGER + TemplateIdentifier.LEFT_3RD_FINGER -> DbTemplateIdentifier.LEFT_3RD_FINGER + TemplateIdentifier.LEFT_4TH_FINGER -> DbTemplateIdentifier.LEFT_4TH_FINGER + TemplateIdentifier.LEFT_5TH_FINGER -> DbTemplateIdentifier.LEFT_5TH_FINGER +} diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RealmFaceSampleConverter.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RealmFaceSampleConverter.kt index 0120134b66..b1526ee856 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RealmFaceSampleConverter.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RealmFaceSampleConverter.kt @@ -1,12 +1,15 @@ package com.simprints.infra.enrolment.records.repository.local.models import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Sample import com.simprints.infra.enrolment.records.realm.store.models.DbFaceSample as RealmFaceSample internal fun RealmFaceSample.toDomain(): Sample = Sample( id = id, - template = template, + template = BiometricTemplate( + template = template, + ), format = format, referenceId = referenceId, modality = Modality.FACE, @@ -15,6 +18,6 @@ internal fun RealmFaceSample.toDomain(): Sample = Sample( internal fun Sample.toRealmFaceDb(): RealmFaceSample = RealmFaceSample().also { sample -> sample.id = id sample.referenceId = referenceId - sample.template = template + sample.template = template.template sample.format = format } diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RealmFingerprintSampleConverter.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RealmFingerprintSampleConverter.kt index a3e1317978..41a2993132 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RealmFingerprintSampleConverter.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RealmFingerprintSampleConverter.kt @@ -1,13 +1,16 @@ package com.simprints.infra.enrolment.records.repository.local.models import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Sample import com.simprints.infra.enrolment.records.realm.store.models.DbFingerprintSample as RealmFingerprintSample internal fun RealmFingerprintSample.toDomain(): Sample = Sample( id = id, - identifier = DbSampleIdentifier.fromId(fingerIdentifier).toDomain(), - template = template, + template = BiometricTemplate( + identifier = DbTemplateIdentifier.fromId(fingerIdentifier).toDomain(), + template = template, + ), format = format, referenceId = referenceId, modality = Modality.FINGERPRINT, @@ -16,7 +19,7 @@ internal fun RealmFingerprintSample.toDomain(): Sample = Sample( internal fun Sample.toRealmFingerprintDb(): RealmFingerprintSample = RealmFingerprintSample().also { sample -> sample.id = id sample.referenceId = referenceId - sample.fingerIdentifier = identifier.fromDomain()?.id ?: -1 - sample.template = template + sample.fingerIdentifier = template.identifier.fromDomain()?.id ?: -1 + sample.template = template.template sample.format = format } diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RoomBiometricTemplateConverter.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RoomBiometricTemplateConverter.kt index 90e297ae3a..77d5fccc5c 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RoomBiometricTemplateConverter.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/local/models/RoomBiometricTemplateConverter.kt @@ -1,5 +1,6 @@ package com.simprints.infra.enrolment.records.repository.local.models +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Sample import com.simprints.infra.enrolment.records.room.store.models.DbBiometricTemplate import com.simprints.infra.enrolment.records.room.store.models.DbModality @@ -8,18 +9,20 @@ import com.simprints.infra.enrolment.records.room.store.models.toDomain internal fun DbBiometricTemplate.toSample(): Sample = Sample( id = uuid, - identifier = identifier?.let { DbSampleIdentifier.fromId(it) }.toDomain(), + template = BiometricTemplate( + template = templateData, + identifier = identifier?.let { DbTemplateIdentifier.fromId(it) }.toDomain(), + ), modality = DbModality.fromId(modality).toDomain(), referenceId = referenceId, format = format, - template = templateData, ) internal fun Sample.toRoomDb(subjectId: String): DbBiometricTemplate = DbBiometricTemplate( uuid = id, - templateData = template, + templateData = template.template, format = format, - identifier = identifier.fromDomain()?.id, + identifier = template.identifier.fromDomain()?.id, subjectId = subjectId, referenceId = referenceId, modality = modality.fromDomain().id, diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt index b8ee1f1c54..86ade624a0 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt @@ -23,7 +23,7 @@ internal data class ApiFaceReference( internal fun List.toFaceApi(encoder: EncodingUtils): ApiFaceReference? = if (isNotEmpty()) { ApiFaceReference( first().referenceId, - map { ApiFaceTemplate(encoder.byteArrayToBase64(it.template)) }, + map { ApiFaceTemplate(encoder.byteArrayToBase64(it.template.template)) }, first().format, ) } else { diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFinger.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFinger.kt index 7c76a0eee5..313d47dc51 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFinger.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFinger.kt @@ -1,7 +1,7 @@ package com.simprints.infra.enrolment.records.repository.remote.models.fingerprint import androidx.annotation.Keep -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier @Keep internal enum class ApiFinger { @@ -17,16 +17,16 @@ internal enum class ApiFinger { LEFT_5TH_FINGER, } -internal fun SampleIdentifier.toApi(): ApiFinger = when (this) { - SampleIdentifier.RIGHT_5TH_FINGER -> ApiFinger.RIGHT_5TH_FINGER - SampleIdentifier.RIGHT_4TH_FINGER -> ApiFinger.RIGHT_4TH_FINGER - SampleIdentifier.RIGHT_3RD_FINGER -> ApiFinger.RIGHT_3RD_FINGER - SampleIdentifier.RIGHT_INDEX_FINGER -> ApiFinger.RIGHT_INDEX_FINGER - SampleIdentifier.RIGHT_THUMB -> ApiFinger.RIGHT_THUMB - SampleIdentifier.LEFT_THUMB -> ApiFinger.LEFT_THUMB - SampleIdentifier.LEFT_INDEX_FINGER -> ApiFinger.LEFT_INDEX_FINGER - SampleIdentifier.LEFT_3RD_FINGER -> ApiFinger.LEFT_3RD_FINGER - SampleIdentifier.LEFT_4TH_FINGER -> ApiFinger.LEFT_4TH_FINGER - SampleIdentifier.LEFT_5TH_FINGER -> ApiFinger.LEFT_5TH_FINGER - SampleIdentifier.NONE -> throw IllegalArgumentException("Must be a finger sample identifier") +internal fun TemplateIdentifier.toApi(): ApiFinger = when (this) { + TemplateIdentifier.RIGHT_5TH_FINGER -> ApiFinger.RIGHT_5TH_FINGER + TemplateIdentifier.RIGHT_4TH_FINGER -> ApiFinger.RIGHT_4TH_FINGER + TemplateIdentifier.RIGHT_3RD_FINGER -> ApiFinger.RIGHT_3RD_FINGER + TemplateIdentifier.RIGHT_INDEX_FINGER -> ApiFinger.RIGHT_INDEX_FINGER + TemplateIdentifier.RIGHT_THUMB -> ApiFinger.RIGHT_THUMB + TemplateIdentifier.LEFT_THUMB -> ApiFinger.LEFT_THUMB + TemplateIdentifier.LEFT_INDEX_FINGER -> ApiFinger.LEFT_INDEX_FINGER + TemplateIdentifier.LEFT_3RD_FINGER -> ApiFinger.LEFT_3RD_FINGER + TemplateIdentifier.LEFT_4TH_FINGER -> ApiFinger.LEFT_4TH_FINGER + TemplateIdentifier.LEFT_5TH_FINGER -> ApiFinger.LEFT_5TH_FINGER + TemplateIdentifier.NONE -> throw IllegalArgumentException("Must be a finger sample identifier") } diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt index 58ad01c6ff..5af86eed93 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt @@ -23,11 +23,10 @@ internal data class ApiFingerprintReference( internal fun List.toFingerprintApi(encoder: EncodingUtils): ApiFingerprintReference? = if (isNotEmpty()) { ApiFingerprintReference( first().referenceId, - map { - ApiFingerprintTemplate( - encoder.byteArrayToBase64(it.template), - it.identifier.toApi(), - ) + map { sample -> + sample.template.let { + ApiFingerprintTemplate(encoder.byteArrayToBase64(it.template), it.identifier.toApi()) + } }, first().format, ) diff --git a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/commcare/CommCareIdentityDataSourceTest.kt b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/commcare/CommCareIdentityDataSourceTest.kt index 4eb85ffd59..ed295aef7b 100644 --- a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/commcare/CommCareIdentityDataSourceTest.kt +++ b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/commcare/CommCareIdentityDataSourceTest.kt @@ -5,10 +5,11 @@ import android.content.Context import android.database.Cursor import android.net.Uri import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.TemplateIdentifier.LEFT_INDEX_FINGER +import com.simprints.core.domain.reference.TemplateIdentifier.LEFT_THUMB import com.simprints.core.domain.sample.Identity import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier.LEFT_INDEX_FINGER -import com.simprints.core.domain.sample.SampleIdentifier.LEFT_THUMB import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.tools.json.JsonHelper import com.simprints.core.tools.time.TimeHelper @@ -54,15 +55,19 @@ class CommCareIdentityDataSourceTest { subjectId = "b26c91bc-b307-4131-80c3-55090ba5dbf2", samples = listOf( Sample( - identifier = LEFT_THUMB, - template = byteArrayOf(), + template = BiometricTemplate( + identifier = LEFT_THUMB, + template = byteArrayOf(), + ), format = "ISO_19794_2", referenceId = "referenceId", modality = Modality.FINGERPRINT, ), Sample( - identifier = LEFT_INDEX_FINGER, - template = byteArrayOf(), + template = BiometricTemplate( + identifier = LEFT_INDEX_FINGER, + template = byteArrayOf(), + ), format = "ISO_19794_2", referenceId = "referenceId", modality = Modality.FINGERPRINT, @@ -73,15 +78,19 @@ class CommCareIdentityDataSourceTest { subjectId = "a961fcb4-8573-4270-a1b2-088e88275b00", samples = listOf( Sample( - identifier = LEFT_THUMB, - template = byteArrayOf(), + template = BiometricTemplate( + identifier = LEFT_THUMB, + template = byteArrayOf(), + ), format = "ISO_19794_2", referenceId = "referenceId", modality = Modality.FINGERPRINT, ), Sample( - identifier = LEFT_INDEX_FINGER, - template = byteArrayOf(), + template = BiometricTemplate( + identifier = LEFT_INDEX_FINGER, + template = byteArrayOf(), + ), format = "ISO_19794_2", referenceId = "referenceId", modality = Modality.FINGERPRINT, @@ -94,7 +103,9 @@ class CommCareIdentityDataSourceTest { subjectId = "b26c91bc-b307-4131-80c3-55090ba5dbf2", samples = listOf( Sample( - template = byteArrayOf(), + template = BiometricTemplate( + template = byteArrayOf(), + ), format = "ROC_1_23", referenceId = "referenceId", modality = Modality.FACE, @@ -105,7 +116,9 @@ class CommCareIdentityDataSourceTest { subjectId = "a961fcb4-8573-4270-a1b2-088e88275b00", samples = listOf( Sample( - template = byteArrayOf(), + template = BiometricTemplate( + template = byteArrayOf(), + ), format = "ROC_3", referenceId = "referenceId", modality = Modality.FACE, @@ -259,8 +272,8 @@ class CommCareIdentityDataSourceTest { exp.subjectId == act.subjectId && exp.samples .zip(act.samples) { expSample, actSample -> - expSample.identifier == actSample.identifier && - expSample.template.contentEquals(actSample.template) && + expSample.template.identifier == actSample.template.identifier && + expSample.template.template.contentEquals(actSample.template.template) && expSample.format == actSample.format }.all { it } }.all { it } @@ -278,7 +291,7 @@ class CommCareIdentityDataSourceTest { exp.subjectId == act.subjectId && exp.samples .zip(act.samples) { expSample, actSample -> - expSample.template.contentEquals(actSample.template) && + expSample.template.template.contentEquals(actSample.template.template) && expSample.format == actSample.format }.all { it } }.all { it } diff --git a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/RealmEnrolmentRecordLocalDataSourceTest.kt b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/RealmEnrolmentRecordLocalDataSourceTest.kt index 3acb0c6973..7662f12ace 100644 --- a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/RealmEnrolmentRecordLocalDataSourceTest.kt +++ b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/RealmEnrolmentRecordLocalDataSourceTest.kt @@ -4,9 +4,10 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Identity import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.TimeHelper @@ -502,7 +503,9 @@ class RealmEnrolmentRecordLocalDataSourceTest { ) = Sample( id = id, referenceId = referenceId, - template = Random.nextBytes(64), + template = BiometricTemplate( + template = Random.nextBytes(64), + ), format = "faceTemplateFormat", modality = Modality.FACE, ) @@ -513,8 +516,10 @@ class RealmEnrolmentRecordLocalDataSourceTest { ) = Sample( id = id, referenceId = referenceId, - identifier = SampleIdentifier.LEFT_3RD_FINGER, - template = Random.nextBytes(64), + template = BiometricTemplate( + identifier = TemplateIdentifier.LEFT_3RD_FINGER, + template = Random.nextBytes(64), + ), format = "fingerprintTemplateFormat", modality = Modality.FINGERPRINT, ) diff --git a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/RoomEnrolmentRecordLocalDataSourceTest.kt b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/RoomEnrolmentRecordLocalDataSourceTest.kt index 5a1e75b04c..a093dd35c4 100644 --- a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/RoomEnrolmentRecordLocalDataSourceTest.kt +++ b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/RoomEnrolmentRecordLocalDataSourceTest.kt @@ -5,8 +5,9 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.tools.time.TimeHelper @@ -73,45 +74,57 @@ class RoomEnrolmentRecordLocalDataSourceTest { // Samples defined first private val faceSample1 = Sample( - template = byteArrayOf(1, 2, 3), + template = BiometricTemplate( + template = byteArrayOf(1, 2, 3), + ), format = ROC_1_FORMAT, referenceId = "ref-face-1", id = "face-uuid-1", modality = Modality.FACE, ) private val faceSample2 = Sample( - template = byteArrayOf(4, 5, 6), + template = BiometricTemplate( + template = byteArrayOf(4, 5, 6), + ), format = ROC_3_FORMAT, referenceId = "ref-face-2", id = "face-uuid-2", modality = Modality.FACE, ) private val faceSample3 = Sample( - template = byteArrayOf(7, 8, 9), + template = BiometricTemplate( + template = byteArrayOf(7, 8, 9), + ), format = ROC_1_FORMAT, referenceId = "ref-face-3-p2", id = "face-uuid-3-p2", modality = Modality.FACE, ) private val fingerprintSample1 = Sample( - identifier = SampleIdentifier.LEFT_THUMB, - template = byteArrayOf(10, 11), + template = BiometricTemplate( + identifier = TemplateIdentifier.LEFT_THUMB, + template = byteArrayOf(10, 11), + ), format = NEC_FORMAT, referenceId = "ref-fp-1", id = "fp-uuid-1", modality = Modality.FINGERPRINT, ) private val fingerprintSample2 = Sample( - identifier = SampleIdentifier.RIGHT_THUMB, - template = byteArrayOf(12, 13), + template = BiometricTemplate( + identifier = TemplateIdentifier.RIGHT_THUMB, + template = byteArrayOf(12, 13), + ), format = ISO_FORMAT, referenceId = "ref-fp-2", id = "fp-uuid-2", modality = Modality.FINGERPRINT, ) private val fingerprintSample3 = Sample( - identifier = SampleIdentifier.LEFT_INDEX_FINGER, - template = byteArrayOf(14, 15), + template = BiometricTemplate( + identifier = TemplateIdentifier.LEFT_INDEX_FINGER, + template = byteArrayOf(14, 15), + ), format = NEC_FORMAT, referenceId = "ref-fp-3-p2", id = "fp-uuid-3-p2", diff --git a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/models/DbSubjectTest.kt b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/models/DbSubjectTest.kt index ba4ce21f7e..006cf8c91e 100644 --- a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/models/DbSubjectTest.kt +++ b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/local/models/DbSubjectTest.kt @@ -2,8 +2,9 @@ package com.simprints.infra.enrolment.records.repository.local.models import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.enrolment.records.realm.store.models.DbFaceSample import com.simprints.infra.enrolment.records.realm.store.models.DbFingerprintSample @@ -28,14 +29,18 @@ class DbSubjectTest { @Test fun fromDomainToDbModel() { val fingerprintSample = Sample( - identifier = SampleIdentifier.RIGHT_3RD_FINGER, - template = Random.nextBytes(64), + template = BiometricTemplate( + identifier = TemplateIdentifier.RIGHT_3RD_FINGER, + template = Random.nextBytes(64), + ), format = "NEC_1", referenceId = REFERENCE_ID, modality = Modality.FINGERPRINT, ) val faceSample = Sample( - template = Random.nextBytes(64), + template = BiometricTemplate( + template = Random.nextBytes(64), + ), format = "RANK_ONE_1_23", referenceId = REFERENCE_ID, modality = Modality.FACE, @@ -70,7 +75,7 @@ class DbSubjectTest { @Test fun fromDbModelToDomain() { val fingerprintSample = DbFingerprintSample().apply { - fingerIdentifier = SampleIdentifier.RIGHT_3RD_FINGER.ordinal + fingerIdentifier = TemplateIdentifier.RIGHT_3RD_FINGER.ordinal template = Random.nextBytes(64) format = "NEC_1" referenceId = REFERENCE_ID diff --git a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/remote/EnrolmentRecordRemoteDataSourceImplTest.kt b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/remote/EnrolmentRecordRemoteDataSourceImplTest.kt index cd97b91c64..beb2fd79c8 100644 --- a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/remote/EnrolmentRecordRemoteDataSourceImplTest.kt +++ b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/remote/EnrolmentRecordRemoteDataSourceImplTest.kt @@ -2,8 +2,9 @@ package com.simprints.infra.enrolment.records.repository.remote import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.tools.utils.EncodingUtils import com.simprints.infra.authstore.AuthStore @@ -70,14 +71,18 @@ class EnrolmentRecordRemoteDataSourceImplTest { attendantId = ATTENDANT_ID, samples = listOf( Sample( - identifier = SampleIdentifier.LEFT_3RD_FINGER, - template = FINGERPRINT_TEMPLATE, + template = BiometricTemplate( + identifier = TemplateIdentifier.LEFT_3RD_FINGER, + template = FINGERPRINT_TEMPLATE, + ), format = "ISO_19794_2", referenceId = "5289df73-7df5-3326-bcdd-22597afb1fac", modality = Modality.FINGERPRINT, ), Sample( - template = FACE_TEMPLATE, + template = BiometricTemplate( + template = FACE_TEMPLATE, + ), format = "faceTemplateFormat", referenceId = "b4a3ba90-6413-32b4-a4ea-a841a5a400ec", modality = Modality.FACE, diff --git a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerTest.kt b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerTest.kt index 3b846e988b..8d8317bc60 100644 --- a/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerTest.kt +++ b/infra/enrolment-records/repository/src/test/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerTest.kt @@ -1,23 +1,23 @@ package com.simprints.infra.enrolment.records.repository.remote.models.fingerprint import com.google.common.truth.Truth.assertThat -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import org.junit.Test class ApiFingerTest { @Test fun `should map correctly the Finger enums`() { val mapping = mapOf( - SampleIdentifier.LEFT_THUMB to ApiFinger.LEFT_THUMB, - SampleIdentifier.LEFT_INDEX_FINGER to ApiFinger.LEFT_INDEX_FINGER, - SampleIdentifier.LEFT_3RD_FINGER to ApiFinger.LEFT_3RD_FINGER, - SampleIdentifier.LEFT_4TH_FINGER to ApiFinger.LEFT_4TH_FINGER, - SampleIdentifier.LEFT_5TH_FINGER to ApiFinger.LEFT_5TH_FINGER, - SampleIdentifier.RIGHT_THUMB to ApiFinger.RIGHT_THUMB, - SampleIdentifier.RIGHT_INDEX_FINGER to ApiFinger.RIGHT_INDEX_FINGER, - SampleIdentifier.RIGHT_3RD_FINGER to ApiFinger.RIGHT_3RD_FINGER, - SampleIdentifier.RIGHT_4TH_FINGER to ApiFinger.RIGHT_4TH_FINGER, - SampleIdentifier.RIGHT_5TH_FINGER to ApiFinger.RIGHT_5TH_FINGER, + TemplateIdentifier.LEFT_THUMB to ApiFinger.LEFT_THUMB, + TemplateIdentifier.LEFT_INDEX_FINGER to ApiFinger.LEFT_INDEX_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER to ApiFinger.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_4TH_FINGER to ApiFinger.LEFT_4TH_FINGER, + TemplateIdentifier.LEFT_5TH_FINGER to ApiFinger.LEFT_5TH_FINGER, + TemplateIdentifier.RIGHT_THUMB to ApiFinger.RIGHT_THUMB, + TemplateIdentifier.RIGHT_INDEX_FINGER to ApiFinger.RIGHT_INDEX_FINGER, + TemplateIdentifier.RIGHT_3RD_FINGER to ApiFinger.RIGHT_3RD_FINGER, + TemplateIdentifier.RIGHT_4TH_FINGER to ApiFinger.RIGHT_4TH_FINGER, + TemplateIdentifier.RIGHT_5TH_FINGER to ApiFinger.RIGHT_5TH_FINGER, ) mapping.forEach { diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCaptureBiometricsPayload.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCaptureBiometricsPayload.kt index 2e68ff8e17..4455c95603 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCaptureBiometricsPayload.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCaptureBiometricsPayload.kt @@ -1,7 +1,7 @@ package com.simprints.infra.eventsync.event.remote.models import androidx.annotation.Keep -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.events.event.domain.models.fingerprint.FingerprintCaptureBiometricsEvent @@ -13,7 +13,7 @@ internal data class ApiFingerprintCaptureBiometricsPayload( ) : ApiEventPayload(startTime) { @Keep data class Fingerprint( - val finger: SampleIdentifier, + val finger: TemplateIdentifier, val template: String, val quality: Int, val format: String, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCapturePayload.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCapturePayload.kt index 28ac3f3cf3..38688fbaf9 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCapturePayload.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCapturePayload.kt @@ -3,7 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonInclude.Include -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.events.event.domain.models.fingerprint.FingerprintCaptureEvent.FingerprintCapturePayload import com.simprints.infra.events.event.domain.models.fingerprint.FingerprintCaptureEvent.FingerprintCapturePayload.Result.BAD_QUALITY @@ -20,13 +20,13 @@ internal data class ApiFingerprintCapturePayload( override val startTime: ApiTimestamp, val endTime: ApiTimestamp?, val qualityThreshold: Int, - val finger: SampleIdentifier, + val finger: TemplateIdentifier, val result: ApiResult, val fingerprint: ApiFingerprint?, ) : ApiEventPayload(startTime) { @Keep data class ApiFingerprint( - val finger: SampleIdentifier, + val finger: TemplateIdentifier, val quality: Int, val format: String, ) { diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt index 6c0ecd7be0..258851dfac 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt @@ -4,7 +4,7 @@ import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonSubTypes import com.fasterxml.jackson.annotation.JsonTypeInfo import com.simprints.core.ExcludedFromGeneratedTestCoverageReports -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.events.event.domain.models.subject.FaceTemplate import com.simprints.infra.events.event.domain.models.subject.FingerprintTemplate import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.face.ApiFaceReference @@ -58,4 +58,4 @@ internal fun FaceTemplate.fromDomainToApi() = ApiFaceTemplate(template) internal fun ApiFingerprintReference.fromApiToDomain() = DomainFingerprintReference(id, templates.map { it.fromApiToDomain() }, format, metadata) -internal fun ApiFingerprintTemplate.fromApiToDomain() = FingerprintTemplate(template, SampleIdentifier.valueOf(finger.name)) +internal fun ApiFingerprintTemplate.fromApiToDomain() = FingerprintTemplate(template, TemplateIdentifier.valueOf(finger.name)) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintTemplate.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintTemplate.kt index 89786f8b89..9ef4393a26 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintTemplate.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintTemplate.kt @@ -1,10 +1,10 @@ package com.simprints.infra.eventsync.event.remote.models.subject.biometricref.fingerprint import androidx.annotation.Keep -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier @Keep internal data class ApiFingerprintTemplate( val template: String, - val finger: SampleIdentifier, + val finger: TemplateIdentifier, ) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/common/SubjectFactory.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/common/SubjectFactory.kt index 7c431c6a15..ed0f62af49 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/common/SubjectFactory.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/common/SubjectFactory.kt @@ -2,7 +2,8 @@ package com.simprints.infra.eventsync.sync.common import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredential -import com.simprints.core.domain.sample.CaptureIdentity +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Sample import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.tools.time.TimeHelper @@ -68,7 +69,7 @@ class SubjectFactory @Inject constructor( projectId: String, attendantId: TokenizableString, moduleId: TokenizableString, - captures: List, + captures: List, externalCredential: ExternalCredential?, ): Subject = buildSubject( subjectId = subjectId, @@ -100,13 +101,15 @@ class SubjectFactory @Inject constructor( externalCredentials = externalCredentials, ) - private fun extractCaptureSamples(response: CaptureIdentity) = response.samples.map { sample -> + private fun extractCaptureSamples(response: BiometricReferenceCapture) = response.templates.map { templateCapture -> Sample( - identifier = sample.identifier, - template = sample.template, - format = sample.format, + template = BiometricTemplate( + identifier = templateCapture.identifier, + template = templateCapture.template, + ), + format = response.format, referenceId = response.referenceId, - modality = sample.modality, + modality = response.modality, ) } @@ -124,8 +127,10 @@ class SubjectFactory @Inject constructor( format: String, referenceId: String, ): Sample = Sample( - identifier = template.finger, - template = encodingUtils.base64ToBytes(template.template), + template = BiometricTemplate( + identifier = template.finger, + template = encodingUtils.base64ToBytes(template.template), + ), format = format, referenceId = referenceId, modality = Modality.FINGERPRINT, @@ -136,7 +141,9 @@ class SubjectFactory @Inject constructor( format: String, referenceId: String, ) = Sample( - template = encodingUtils.base64ToBytes(template.template), + template = BiometricTemplate( + template = encodingUtils.base64ToBytes(template.template), + ), format = format, referenceId = referenceId, modality = Modality.FACE, diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCapturePayloadTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCapturePayloadTest.kt index 8b92671e1a..c53c5754bb 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCapturePayloadTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/ApiFingerprintCapturePayloadTest.kt @@ -1,7 +1,7 @@ package com.simprints.infra.eventsync.event.remote.models import com.google.common.truth.Truth.assertThat -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.tools.utils.randomUUID import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.events.event.domain.models.fingerprint.FingerprintCaptureEvent @@ -13,7 +13,7 @@ class ApiFingerprintCapturePayloadTest { fun `creating fingerprint capture object has correct values`() { val fingerprint = ApiFingerprintCapturePayload.ApiFingerprint( FingerprintCaptureEvent.FingerprintCapturePayload.Fingerprint( - finger = SampleIdentifier.LEFT_3RD_FINGER, + finger = TemplateIdentifier.LEFT_3RD_FINGER, quality = 23, format = "ISO_19794_2", ), @@ -23,7 +23,7 @@ class ApiFingerprintCapturePayloadTest { startTime = ApiTimestamp(1), endTime = ApiTimestamp(1), qualityThreshold = 23, - finger = SampleIdentifier.LEFT_3RD_FINGER, + finger = TemplateIdentifier.LEFT_3RD_FINGER, result = ApiFingerprintCapturePayload.ApiResult.GOOD_SCAN, fingerprint = fingerprint, ) @@ -33,7 +33,7 @@ class ApiFingerprintCapturePayloadTest { assertThat(startTime).isEqualTo(ApiTimestamp(1)) assertThat(endTime).isEqualTo(ApiTimestamp(1)) assertThat(qualityThreshold).isEqualTo(23) - assertThat(finger).isEqualTo(SampleIdentifier.LEFT_3RD_FINGER) + assertThat(finger).isEqualTo(TemplateIdentifier.LEFT_3RD_FINGER) assertThat(result).isEqualTo(ApiFingerprintCapturePayload.ApiResult.GOOD_SCAN) assertThat(fingerprint).isEqualTo(fingerprint) } diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordCreationEventTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordCreationEventTest.kt index 96f2f95e93..a8015f9b4a 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordCreationEventTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordCreationEventTest.kt @@ -3,7 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models.subject import com.google.common.truth.Truth.* import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.config.store.remote.models.ApiExternalCredentialType import com.simprints.infra.events.event.domain.models.subject.EnrolmentRecordCreationEvent @@ -25,7 +25,7 @@ class ApiEnrolmentRecordCreationEventTest { ApiFingerprintReference( "fpRefId", listOf( - ApiFingerprintTemplate("template", SampleIdentifier.LEFT_THUMB), + ApiFingerprintTemplate("template", TemplateIdentifier.LEFT_THUMB), ), "NEC_1", ), @@ -47,7 +47,7 @@ class ApiEnrolmentRecordCreationEventTest { FingerprintReference( "fpRefId", listOf( - FingerprintTemplate("template", SampleIdentifier.LEFT_THUMB), + FingerprintTemplate("template", TemplateIdentifier.LEFT_THUMB), ), "NEC_1", ), diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordMoveEventTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordMoveEventTest.kt index d4c4cf4de1..e35f7205bc 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordMoveEventTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordMoveEventTest.kt @@ -3,7 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models.subject import com.google.common.truth.Truth.* import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.config.store.remote.models.ApiExternalCredentialType import com.simprints.infra.events.event.domain.models.subject.EnrolmentRecordMoveEvent @@ -26,7 +26,7 @@ class ApiEnrolmentRecordMoveEventTest { ApiFingerprintReference( "fpRefId", listOf( - ApiFingerprintTemplate("template", SampleIdentifier.LEFT_THUMB), + ApiFingerprintTemplate("template", TemplateIdentifier.LEFT_THUMB), ), "NEC_1", ), @@ -54,7 +54,7 @@ class ApiEnrolmentRecordMoveEventTest { FingerprintReference( "fpRefId", listOf( - FingerprintTemplate("template", SampleIdentifier.LEFT_THUMB), + FingerprintTemplate("template", TemplateIdentifier.LEFT_THUMB), ), "NEC_1", ), diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordUpdateEventTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordUpdateEventTest.kt index 27ecfdffce..4e4b2ec029 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordUpdateEventTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/remote/models/subject/ApiEnrolmentRecordUpdateEventTest.kt @@ -3,7 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models.subject import com.google.common.truth.Truth.* import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.config.store.remote.models.ApiExternalCredentialType import com.simprints.infra.events.event.domain.models.subject.EnrolmentRecordUpdateEvent @@ -26,7 +26,7 @@ class ApiEnrolmentRecordUpdateEventTest { ApiFingerprintReference( "fpRefId", listOf( - ApiFingerprintTemplate("template", SampleIdentifier.LEFT_THUMB), + ApiFingerprintTemplate("template", TemplateIdentifier.LEFT_THUMB), ), "NEC_1", ), @@ -50,7 +50,7 @@ class ApiEnrolmentRecordUpdateEventTest { biometricReferencesAdded = listOf( FingerprintReference( "fpRefId", - listOf(FingerprintTemplate("template", SampleIdentifier.LEFT_THUMB)), + listOf(FingerprintTemplate("template", TemplateIdentifier.LEFT_THUMB)), "NEC_1", ), FaceReference( diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTaskTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTaskTest.kt index 2a6bee52b7..89b979f6a1 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTaskTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/CommCareEventSyncTaskTest.kt @@ -4,6 +4,7 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Sample import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw @@ -334,7 +335,9 @@ class CommCareEventSyncTaskTest { moduleId = "attendantId".asTokenizableRaw(), samples = listOf( Sample( - template = byteArrayOf(), + template = BiometricTemplate( + template = byteArrayOf(), + ), format = "format", referenceId = "referenceId", modality = Modality.FACE, diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTaskTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTaskTest.kt index 20da78d3ce..b7f16bf8f2 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTaskTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SimprintsEventDownSyncTaskTest.kt @@ -4,6 +4,7 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType +import com.simprints.core.domain.reference.BiometricTemplate import com.simprints.core.domain.sample.Sample import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw @@ -557,7 +558,9 @@ class SimprintsEventDownSyncTaskTest { moduleId = "attendantId".asTokenizableRaw(), samples = listOf( Sample( - template = byteArrayOf(), + template = BiometricTemplate( + template = byteArrayOf(), + ), format = "format", referenceId = "referenceId", modality = Modality.FACE, diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SubjectFactoryTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SubjectFactoryTest.kt index 6a239d4f7a..689aa66fd3 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SubjectFactoryTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/tasks/SubjectFactoryTest.kt @@ -4,10 +4,11 @@ import com.google.common.truth.Truth.* import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredential import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.CaptureIdentity -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.TimeHelper @@ -72,14 +73,18 @@ class SubjectFactoryTest { moduleId = MODULE_ID, samples = listOf( Sample( - identifier = IDENTIFIER, - template = BASE_64_BYTES, + template = BiometricTemplate( + identifier = IDENTIFIER, + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = REFERENCE_ID, modality = Modality.FINGERPRINT, ), Sample( - template = BASE_64_BYTES, + template = BiometricTemplate( + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = REFERENCE_ID, modality = Modality.FACE, @@ -108,14 +113,18 @@ class SubjectFactoryTest { moduleId = MODULE_ID, samples = listOf( Sample( - identifier = IDENTIFIER, - template = BASE_64_BYTES, + template = BiometricTemplate( + identifier = IDENTIFIER, + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = REFERENCE_ID, modality = Modality.FINGERPRINT, ), Sample( - template = BASE_64_BYTES, + template = BiometricTemplate( + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = REFERENCE_ID, modality = Modality.FACE, @@ -134,27 +143,35 @@ class SubjectFactoryTest { moduleId = MODULE_ID, samples = listOf( Sample( - identifier = IDENTIFIER, - template = BASE_64_BYTES, + template = BiometricTemplate( + identifier = IDENTIFIER, + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = "referenceId-finger-1", modality = Modality.FINGERPRINT, ), Sample( - identifier = IDENTIFIER, - template = BASE_64_BYTES, + template = BiometricTemplate( + identifier = IDENTIFIER, + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = "referenceId-finger-2", modality = Modality.FINGERPRINT, ), Sample( - template = BASE_64_BYTES, + template = BiometricTemplate( + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = "referenceId-finger-3", modality = Modality.FACE, ), Sample( - template = BASE_64_BYTES, + template = BiometricTemplate( + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = "referenceId-finger-4", modality = Modality.FACE, @@ -173,7 +190,7 @@ class SubjectFactoryTest { templates = listOf( FingerprintTemplate( template = BASE_64_BYTES.toString(), - finger = SampleIdentifier.LEFT_THUMB, + finger = TemplateIdentifier.LEFT_THUMB, ), ), ), @@ -194,27 +211,35 @@ class SubjectFactoryTest { moduleId = MODULE_ID, samples = listOf( Sample( - identifier = IDENTIFIER, - template = BASE_64_BYTES, + template = BiometricTemplate( + identifier = IDENTIFIER, + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = "referenceId-finger-1", modality = Modality.FINGERPRINT, ), Sample( - identifier = IDENTIFIER, - template = BASE_64_BYTES, + template = BiometricTemplate( + identifier = IDENTIFIER, + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = "referenceId-finger-5", modality = Modality.FINGERPRINT, ), Sample( - template = BASE_64_BYTES, + template = BiometricTemplate( + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = "referenceId-finger-4", modality = Modality.FACE, ), Sample( - template = BASE_64_BYTES, + template = BiometricTemplate( + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = "referenceId-finger-6", modality = Modality.FACE, @@ -239,14 +264,18 @@ class SubjectFactoryTest { createdAt = Date(0L), samples = listOf( Sample( - identifier = IDENTIFIER, - template = BASE_64_BYTES, + template = BiometricTemplate( + identifier = IDENTIFIER, + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = REFERENCE_ID, modality = Modality.FINGERPRINT, ), Sample( - template = BASE_64_BYTES, + template = BiometricTemplate( + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = REFERENCE_ID, modality = Modality.FACE, @@ -261,28 +290,26 @@ class SubjectFactoryTest { attendantId = expected.attendantId, moduleId = expected.moduleId, captures = listOf( - CaptureIdentity( - GUID1, - Modality.FINGERPRINT, - listOf( - CaptureSample( + BiometricReferenceCapture( + referenceId = GUID1, + modality = Modality.FINGERPRINT, + format = REFERENCE_FORMAT, + templates = listOf( + BiometricTemplateCapture( captureEventId = GUID1, identifier = IDENTIFIER, template = BASE_64_BYTES, - format = REFERENCE_FORMAT, - modality = Modality.FINGERPRINT, ), ), ), - CaptureIdentity( - GUID1, - Modality.FACE, - listOf( - CaptureSample( + BiometricReferenceCapture( + referenceId = GUID1, + modality = Modality.FACE, + format = REFERENCE_FORMAT, + templates = listOf( + BiometricTemplateCapture( captureEventId = GUID1, template = BASE_64_BYTES, - format = REFERENCE_FORMAT, - modality = Modality.FACE, ), ), ), @@ -301,14 +328,18 @@ class SubjectFactoryTest { moduleId = MODULE_ID, samples = listOf( Sample( - identifier = IDENTIFIER, - template = BASE_64_BYTES, + template = BiometricTemplate( + identifier = IDENTIFIER, + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = REFERENCE_ID, modality = Modality.FINGERPRINT, ), Sample( - template = BASE_64_BYTES, + template = BiometricTemplate( + template = BASE_64_BYTES, + ), format = REFERENCE_FORMAT, referenceId = REFERENCE_ID, modality = Modality.FACE, @@ -341,7 +372,7 @@ class SubjectFactoryTest { private const val TEMPLATE_NAME = "template" private val EXTERNAL_CREDENTIAL_VALUE = "value".asTokenizableEncrypted() private val EXTERNAL_CREDENTIAL_TYPE = ExternalCredentialType.NHISCard - private val IDENTIFIER = SampleIdentifier.LEFT_THUMB + private val IDENTIFIER = TemplateIdentifier.LEFT_THUMB private val FINGERPRINT_REFERENCE = FingerprintReference( id = REFERENCE_ID, format = REFERENCE_FORMAT, diff --git a/infra/events/src/debug/java/com/simprints/infra/events/sampledata/EventFactoryUtils.kt b/infra/events/src/debug/java/com/simprints/infra/events/sampledata/EventFactoryUtils.kt index 2937ed8ac2..8e31120728 100644 --- a/infra/events/src/debug/java/com/simprints/infra/events/sampledata/EventFactoryUtils.kt +++ b/infra/events/src/debug/java/com/simprints/infra/events/sampledata/EventFactoryUtils.kt @@ -2,8 +2,8 @@ package com.simprints.infra.events.sampledata import android.os.Build import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.TemplateIdentifier.LEFT_THUMB import com.simprints.core.domain.response.AppMatchConfidence.MEDIUM -import com.simprints.core.domain.sample.SampleIdentifier.LEFT_THUMB import com.simprints.core.tools.time.Timestamp import com.simprints.core.tools.utils.SimNetworkUtils import com.simprints.core.tools.utils.SimNetworkUtils.Connection diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureBiometricsEvent.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureBiometricsEvent.kt index fdb51b9bc7..f0cf31ce4e 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureBiometricsEvent.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureBiometricsEvent.kt @@ -1,7 +1,7 @@ package com.simprints.infra.events.event.domain.models.fingerprint import androidx.annotation.Keep -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.tools.time.Timestamp import com.simprints.core.tools.utils.randomUUID @@ -51,7 +51,7 @@ data class FingerprintCaptureBiometricsEvent( @Keep data class Fingerprint( - val finger: SampleIdentifier, + val finger: TemplateIdentifier, val template: String, val quality: Int, val format: String, diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureEvent.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureEvent.kt index 14da649a0c..a38815e702 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureEvent.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureEvent.kt @@ -1,7 +1,7 @@ package com.simprints.infra.events.event.domain.models.fingerprint import androidx.annotation.Keep -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.tools.time.Timestamp import com.simprints.core.tools.utils.randomUUID @@ -22,7 +22,7 @@ data class FingerprintCaptureEvent( constructor( createdAt: Timestamp, endTime: Timestamp, - finger: SampleIdentifier, + finger: TemplateIdentifier, qualityThreshold: Int, result: FingerprintCapturePayload.Result, fingerprint: FingerprintCapturePayload.Fingerprint?, @@ -52,7 +52,7 @@ data class FingerprintCaptureEvent( override val createdAt: Timestamp, override val eventVersion: Int, override var endedAt: Timestamp?, - val finger: SampleIdentifier, + val finger: TemplateIdentifier, val qualityThreshold: Int, val result: Result, val fingerprint: Fingerprint?, @@ -64,7 +64,7 @@ data class FingerprintCaptureEvent( @Keep data class Fingerprint( - val finger: SampleIdentifier, + val finger: TemplateIdentifier, val quality: Int, val format: String, ) diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/EnrolmentRecordCreationEvent.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/EnrolmentRecordCreationEvent.kt index 064295b2f7..5ca404c344 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/EnrolmentRecordCreationEvent.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/EnrolmentRecordCreationEvent.kt @@ -66,8 +66,8 @@ data class EnrolmentRecordCreationEvent( fingerprintSamples.first().referenceId, fingerprintSamples.map { FingerprintTemplate( - encoder.byteArrayToBase64(it.template), - it.identifier, + encoder.byteArrayToBase64(it.template.template), + it.template.identifier, ) }, fingerprintSamples.first().format, @@ -80,7 +80,7 @@ data class EnrolmentRecordCreationEvent( faceSamples.first().referenceId, faceSamples.map { FaceTemplate( - encoder.byteArrayToBase64(it.template), + encoder.byteArrayToBase64(it.template.template), ) }, faceSamples.first().format, diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/FingerprintTemplate.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/FingerprintTemplate.kt index 8da5a26d52..78a83f2c3e 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/FingerprintTemplate.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/FingerprintTemplate.kt @@ -1,10 +1,10 @@ package com.simprints.infra.events.event.domain.models.subject import androidx.annotation.Keep -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier @Keep data class FingerprintTemplate( val template: String, - val finger: SampleIdentifier, + val finger: TemplateIdentifier, ) diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/EventPayloadTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/EventPayloadTest.kt index df340a167e..73de5d4bc3 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/EventPayloadTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/EventPayloadTest.kt @@ -1,8 +1,8 @@ package com.simprints.infra.events.event.domain.models import com.google.common.truth.Truth.assertThat +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.response.AppMatchConfidence -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.tools.utils.SimNetworkUtils import com.simprints.core.tools.utils.SimNetworkUtils.Connection import com.simprints.infra.events.event.domain.models.AlertScreenEvent.AlertScreenPayload.AlertScreenEventType.BLUETOOTH_NOT_ENABLED @@ -160,7 +160,7 @@ class EventPayloadTest { FingerprintCaptureBiometricsEvent( createdAt = CREATED_AT, fingerprint = FingerprintCaptureBiometricsEvent.FingerprintCaptureBiometricsPayload.Fingerprint( - finger = SampleIdentifier.LEFT_3RD_FINGER, + finger = TemplateIdentifier.LEFT_3RD_FINGER, template = "template", quality = 1, format = "ISO_19794_2", @@ -170,11 +170,11 @@ class EventPayloadTest { FingerprintCaptureEvent( createdAt = CREATED_AT, endTime = ENDED_AT, - finger = SampleIdentifier.LEFT_THUMB, + finger = TemplateIdentifier.LEFT_THUMB, qualityThreshold = 10, result = FingerprintCaptureEvent.FingerprintCapturePayload.Result.BAD_QUALITY, fingerprint = FingerprintCaptureEvent.FingerprintCapturePayload.Fingerprint( - finger = SampleIdentifier.LEFT_THUMB, + finger = TemplateIdentifier.LEFT_THUMB, quality = 8, format = "ISO_19794_2", ), diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureBiometricsEventTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureBiometricsEventTest.kt index ba3b57f002..79e34eb5a2 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureBiometricsEventTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureBiometricsEventTest.kt @@ -1,7 +1,7 @@ package com.simprints.infra.events.event.domain.models.fingerprint import com.google.common.truth.Truth.assertThat -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.events.event.domain.models.EventType import com.simprints.infra.events.sampledata.SampleDefaults import org.junit.Test @@ -11,7 +11,7 @@ class FingerprintCaptureBiometricsEventTest { fun create_FingerprintCaptureBiometricsEvent() { val fingerArg = FingerprintCaptureBiometricsEvent.FingerprintCaptureBiometricsPayload.Fingerprint( - SampleIdentifier.LEFT_3RD_FINGER, + TemplateIdentifier.LEFT_3RD_FINGER, "template", 1, "ISO_19794_2", diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureEventTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureEventTest.kt index 742a9adf60..160a372c31 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureEventTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/fingerprint/FingerprintCaptureEventTest.kt @@ -1,7 +1,7 @@ package com.simprints.infra.events.event.domain.models.fingerprint import com.google.common.truth.Truth.assertThat -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.infra.events.event.domain.models.EventType import com.simprints.infra.events.sampledata.SampleDefaults import org.junit.Test @@ -10,14 +10,14 @@ class FingerprintCaptureEventTest { @Test fun create_FingerprintCaptureEvent() { val fingerprint = FingerprintCaptureEvent.FingerprintCapturePayload.Fingerprint( - SampleIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, 8, "ISO_19794_2", ) val event = FingerprintCaptureEvent( SampleDefaults.CREATED_AT, SampleDefaults.ENDED_AT, - SampleIdentifier.LEFT_THUMB, + TemplateIdentifier.LEFT_THUMB, 10, FingerprintCaptureEvent.FingerprintCapturePayload.Result.BAD_QUALITY, fingerprint, @@ -30,7 +30,7 @@ class FingerprintCaptureEventTest { assertThat(endedAt).isEqualTo(SampleDefaults.ENDED_AT) assertThat(eventVersion).isEqualTo(FingerprintCaptureEvent.EVENT_VERSION) assertThat(type).isEqualTo(EventType.FINGERPRINT_CAPTURE) - assertThat(finger).isEqualTo(SampleIdentifier.LEFT_THUMB) + assertThat(finger).isEqualTo(TemplateIdentifier.LEFT_THUMB) assertThat(qualityThreshold).isEqualTo(10) assertThat(fingerprint).isEqualTo(fingerprint) } diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/local/migrations/EventMigration7To8Test.kt b/infra/events/src/test/java/com/simprints/infra/events/event/local/migrations/EventMigration7To8Test.kt index 0763185a86..98454cf586 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/local/migrations/EventMigration7To8Test.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/local/migrations/EventMigration7To8Test.kt @@ -9,7 +9,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.google.common.truth.Truth.assertThat -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.tools.extentions.getStringWithColumnName import com.simprints.core.tools.utils.randomUUID import com.simprints.infra.events.event.local.EventRoomDatabase @@ -475,7 +475,7 @@ class EventMigration7To8Test { private const val SESSION_ID = "aSessionID" private const val DEVICE_ID = "aDeviceID" private const val TEMPLATE = "template" - private val FINGER = SampleIdentifier.LEFT_3RD_FINGER + private val FINGER = TemplateIdentifier.LEFT_3RD_FINGER private val CREATED_AT = 1611584017198 private val ENDED_AT = 1621588617198 private const val QUALITY = 85 diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/MatchParams.kt b/infra/matching/src/main/java/com/simprints/infra/matching/MatchParams.kt index b22dfd329d..6988ba0d7d 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/MatchParams.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/MatchParams.kt @@ -3,17 +3,15 @@ package com.simprints.infra.matching import androidx.annotation.Keep import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.ModalitySdkType -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.step.StepParams -import com.simprints.infra.config.store.models.FaceConfiguration import com.simprints.infra.enrolment.records.repository.domain.models.BiometricDataSource import com.simprints.infra.enrolment.records.repository.domain.models.SubjectQuery @Keep data class MatchParams( - val probeReferenceId: String, val bioSdk: ModalitySdkType, - val probeSamples: List = emptyList(), + val probeReference: BiometricReferenceCapture, val flowType: FlowType, val queryForCandidates: SubjectQuery, val biometricDataSource: BiometricDataSource, diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/MatchResult.kt b/infra/matching/src/main/java/com/simprints/infra/matching/MatchResult.kt index 755ce5634d..939b0cdaa2 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/MatchResult.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/MatchResult.kt @@ -2,11 +2,11 @@ package com.simprints.infra.matching import androidx.annotation.Keep import com.simprints.core.domain.common.ModalitySdkType -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.step.StepResult @Keep data class MatchResult( - val results: List, + val results: List, val sdk: ModalitySdkType, ) : StepResult diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FaceMatcherUseCase.kt b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FaceMatcherUseCase.kt index c0ee511cea..1372a7ff73 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FaceMatcherUseCase.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FaceMatcherUseCase.kt @@ -1,9 +1,9 @@ package com.simprints.infra.matching.usecase import com.simprints.core.DispatcherBG -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult import com.simprints.core.tools.time.TimeHelper import com.simprints.face.infra.basebiosdk.matching.FaceMatcher import com.simprints.face.infra.biosdkresolver.FaceBioSDK @@ -49,11 +49,11 @@ class FaceMatcherUseCase @Inject constructor( return@channelFlow } val bioSdk = resolveFaceBioSdk(matchParams.bioSdk) - - if (matchParams.probeSamples.isEmpty()) { + if (matchParams.probeReference.templates.isEmpty()) { send(MatcherState.Success(emptyList(), emptyList(), 0, bioSdk.matcherName())) return@channelFlow } + val queryWithSupportedFormat = matchParams.queryForCandidates.copy( format = bioSdk.templateFormat(), ) @@ -87,20 +87,20 @@ class FaceMatcherUseCase @Inject constructor( this@channelFlow.send(MatcherState.CandidateLoaded) } - val batchInfo = consumeAndMatch(candidatesChannel, matchParams.probeSamples, resultSet, bioSdk) + val batchInfo = consumeAndMatch(candidatesChannel, matchParams.probeReference, resultSet, bioSdk) send(MatcherState.Success(resultSet.toList(), batchInfo, loadedCandidates.get(), bioSdk.matcherName())) }.flowOn(dispatcherBG) private suspend fun consumeAndMatch( candidatesChannel: ReceiveChannel, - samples: List, + probeReference: BiometricReferenceCapture, resultSet: MatchResultSet, bioSdk: FaceBioSDK, ): List { val matchBatches = mutableListOf() for (batch in candidatesChannel) { val comparingStartTime = timeHelper.now() - val results = bioSdk.createMatcher(samples).use { matcher -> + val results = bioSdk.createMatcher(probeReference).use { matcher -> match(matcher, batch.identities) } resultSet.addAll(results) @@ -123,7 +123,7 @@ class FaceMatcherUseCase @Inject constructor( batchCandidates: List, ) = batchCandidates.fold(MatchResultSet()) { acc, candidate -> acc.add( - MatchComparisonResult( + ComparisonResult( candidate.subjectId, matcher.getHighestComparisonScoreForCandidate(candidate), ), diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCase.kt b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCase.kt index 9fdd14e0f3..a32fdddaad 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCase.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCase.kt @@ -2,7 +2,7 @@ package com.simprints.infra.matching.usecase import com.simprints.core.DispatcherBG import com.simprints.core.domain.common.FlowType -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture import com.simprints.core.domain.sample.Identity import com.simprints.core.tools.time.TimeHelper import com.simprints.fingerprint.infra.biosdk.BioSdkWrapper @@ -51,11 +51,11 @@ class FingerprintMatcherUseCase @Inject constructor( return@channelFlow } val bioSdkWrapper = resolveBioSdkWrapper(matchParams.bioSdk) - - if (matchParams.probeSamples.isEmpty()) { + if (matchParams.probeReference.templates.isEmpty()) { send(MatcherState.Success(emptyList(), emptyList(), 0, bioSdkWrapper.matcherName)) return@channelFlow } + // Only candidates with supported template format are considered val queryWithSupportedFormat = matchParams.queryForCandidates.copy( @@ -91,7 +91,7 @@ class FingerprintMatcherUseCase @Inject constructor( val batchInfo = consumeAndMatch( channel = channel, - samples = matchParams.probeSamples, + probeReference = matchParams.probeReference, resultSet = resultSet, bioSdk = matchParams.bioSdk, bioSdkWrapper = bioSdkWrapper, @@ -104,7 +104,7 @@ class FingerprintMatcherUseCase @Inject constructor( private suspend fun consumeAndMatch( channel: ReceiveChannel, - samples: List, + probeReference: BiometricReferenceCapture, resultSet: MatchResultSet, bioSdk: FingerprintConfiguration.BioSdk, bioSdkWrapper: BioSdkWrapper, @@ -115,7 +115,7 @@ class FingerprintMatcherUseCase @Inject constructor( val comparingStartTime = timeHelper.now() val matchResults = match( - probes = samples, + probeReference = probeReference, candidates = batch.identities, flowType = flowType, bioSdkWrapper = bioSdkWrapper, @@ -137,13 +137,13 @@ class FingerprintMatcherUseCase @Inject constructor( } private suspend fun match( - probes: List, + probeReference: BiometricReferenceCapture, candidates: List, flowType: FlowType, bioSdkWrapper: BioSdkWrapper, bioSdk: FingerprintConfiguration.BioSdk, ) = bioSdkWrapper.match( - probes, + probeReference, candidates, isCrossFingerMatchingEnabled(flowType, bioSdk), ) diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/MatchResultSet.kt b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/MatchResultSet.kt index cd9b711347..9ccb485f99 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/MatchResultSet.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/MatchResultSet.kt @@ -1,6 +1,6 @@ package com.simprints.infra.matching.usecase -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import java.util.concurrent.ConcurrentSkipListSet import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.locks.ReentrantLock @@ -13,14 +13,14 @@ internal class MatchResultSet( private val lock = ReentrantLock() private val skipListSet = ConcurrentSkipListSet( - compareByDescending { it.confidence }.thenByDescending { it.subjectId }, + compareByDescending { it.comparisonScore }.thenByDescending { it.subjectId }, ) - fun add(element: MatchComparisonResult): MatchResultSet { + fun add(element: ComparisonResult): MatchResultSet { // Use a lock to ensure thread safety during the entire add operation lock.withLock { // Only perform this optimization when we know the set is at max capacity - if (skipListSet.size >= maxSize && lowestConfidence.get() > element.confidence) { + if (skipListSet.size >= maxSize && lowestConfidence.get() > element.comparisonScore) { // skip adding if the set is full and the last element has higher confidence than the current element return this } @@ -31,7 +31,7 @@ internal class MatchResultSet( // Now that the set is full, we can skip adding elements // with confidence lower than the current lowest - lowestConfidence.set(skipListSet.last().confidence) + lowestConfidence.set(skipListSet.last().comparisonScore) } return this } @@ -42,7 +42,7 @@ internal class MatchResultSet( return this } - fun toList(): List = skipListSet.toList() + fun toList(): List = skipListSet.toList() companion object { /** diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/MatcherUseCase.kt b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/MatcherUseCase.kt index 8fde808145..8d77a0dc04 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/MatcherUseCase.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/MatcherUseCase.kt @@ -1,6 +1,6 @@ package com.simprints.infra.matching.usecase -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.infra.config.store.models.Project import com.simprints.infra.logging.LoggingConstants import com.simprints.infra.matching.MatchBatchInfo @@ -23,7 +23,7 @@ interface MatcherUseCase { data object CandidateLoaded : MatcherState() data class Success( - val comparisonResults: List, + val comparisonResults: List, val matchBatches: List, val totalCandidates: Int, val matcherName: String, diff --git a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCase.kt b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCase.kt index a59b2ca6f5..0dee66db72 100644 --- a/infra/matching/src/main/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCase.kt +++ b/infra/matching/src/main/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCase.kt @@ -2,7 +2,7 @@ package com.simprints.infra.matching.usecase import com.simprints.core.SessionCoroutineScope import com.simprints.core.domain.common.FlowType -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.tools.time.Timestamp import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.sync.ConfigManager @@ -30,11 +30,11 @@ class SaveMatchEventUseCase @Inject constructor( matchParams: MatchParams, candidatesCount: Int, matcherName: String, - results: List, + results: List, batches: List, ) { sessionCoroutineScope.launch { - val matchEntries = results.map { MatchEntry(it.subjectId, it.confidence) } + val matchEntries = results.map { MatchEntry(it.subjectId, it.comparisonScore) } val event = if (matchParams.flowType == FlowType.VERIFY) { getOneToOneEvent( startTime, @@ -45,7 +45,7 @@ class SaveMatchEventUseCase @Inject constructor( matchParams.bioSdk .let { it as? FingerprintConfiguration.BioSdk } ?.let { getFingerprintComparisonStrategy(it) }, - matchParams.probeReferenceId, + matchParams.probeReference.referenceId, ) } else { getOneToManyEvent( @@ -55,7 +55,7 @@ class SaveMatchEventUseCase @Inject constructor( matchParams.queryForCandidates, candidatesCount, matchEntries, - matchParams.probeReferenceId, + matchParams.probeReference.referenceId, batches, ) } diff --git a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FaceMatcherUseCaseTest.kt b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FaceMatcherUseCaseTest.kt index e0ade2049a..d4e942b879 100644 --- a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FaceMatcherUseCaseTest.kt +++ b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FaceMatcherUseCaseTest.kt @@ -4,9 +4,11 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.* import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.sample.Identity -import com.simprints.core.domain.sample.MatchComparisonResult import com.simprints.core.domain.sample.Sample import com.simprints.core.tools.time.TimeHelper import com.simprints.face.infra.basebiosdk.matching.FaceMatcher @@ -76,11 +78,16 @@ internal class FaceMatcherUseCaseTest { val results = useCase .invoke( MatchParams( - probeReferenceId = "referenceId", flowType = FlowType.VERIFY, queryForCandidates = SubjectQuery(), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, biometricDataSource = BiometricDataSource.Simprints, + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "format", + templates = emptyList(), + ), ), project, ).toList() @@ -104,13 +111,15 @@ internal class FaceMatcherUseCaseTest { val results = useCase .invoke( MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf( - CaptureSample( - captureEventId = "faceId", - template = byteArrayOf(1, 2, 3), - modality = Modality.FACE, - format = "format", + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "faceId", + template = byteArrayOf(1, 2, 3), + ), ), ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, @@ -141,13 +150,15 @@ internal class FaceMatcherUseCaseTest { val results = useCase .invoke( MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf( - CaptureSample( - captureEventId = "faceId", - template = byteArrayOf(1, 2, 3), - modality = Modality.FACE, - format = "format", + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "faceId", + template = byteArrayOf(1, 2, 3), + ), ), ), bioSdk = FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER, // Wrong SDK type @@ -187,7 +198,9 @@ internal class FaceMatcherUseCaseTest { "subjectId", listOf( Sample( - template = byteArrayOf(1, 2, 3), + template = BiometricTemplate( + template = byteArrayOf(1, 2, 3), + ), format = "format", referenceId = "faceTemplate", modality = Modality.FACE, @@ -214,13 +227,15 @@ internal class FaceMatcherUseCaseTest { val results = useCase .invoke( matchParams = MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf( - CaptureSample( - captureEventId = "faceId", - template = byteArrayOf(1, 2, 3), - modality = Modality.FACE, - format = "format", + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "faceId", + template = byteArrayOf(1, 2, 3), + ), ), ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, @@ -239,7 +254,7 @@ internal class FaceMatcherUseCaseTest { assertThat(results[1]).isInstanceOf(MatcherUseCase.MatcherState.CandidateLoaded::class.java) val successState = results[2] as MatcherUseCase.MatcherState.Success - assertThat(successState.comparisonResults).containsExactly(MatchComparisonResult("subjectId", 42f)) + assertThat(successState.comparisonResults).containsExactly(ComparisonResult("subjectId", 42f)) assertThat(successState.totalCandidates).isEqualTo(totalCandidates) assertThat(successState.matcherName).isEqualTo("") diff --git a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCaseTest.kt b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCaseTest.kt index df9a0bd045..b0c146b7fb 100644 --- a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCaseTest.kt +++ b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/FingerprintMatcherUseCaseTest.kt @@ -4,10 +4,12 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.* import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Identity import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.time.Timestamp import com.simprints.fingerprint.infra.biosdk.BioSdkWrapper @@ -87,8 +89,12 @@ internal class FingerprintMatcherUseCaseTest { val results = useCase .invoke( MatchParams( - probeReferenceId = "referenceId", - probeSamples = emptyList(), + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = emptyList(), + ), bioSdk = SECUGEN_SIM_MATCHER, flowType = FlowType.VERIFY, queryForCandidates = SubjectQuery(), @@ -120,14 +126,16 @@ internal class FingerprintMatcherUseCaseTest { val results = useCase .invoke( MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf( - CaptureSample( - captureEventId = "fingerprintId", - template = byteArrayOf(1, 2, 3), - modality = Modality.FINGERPRINT, - format = "format", - identifier = SampleIdentifier.LEFT_3RD_FINGER, + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "fingerprintId", + template = byteArrayOf(1, 2, 3), + identifier = TemplateIdentifier.LEFT_3RD_FINGER, + ), ), ), bioSdk = SECUGEN_SIM_MATCHER, @@ -158,14 +166,16 @@ internal class FingerprintMatcherUseCaseTest { val results = useCase .invoke( MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf( - CaptureSample( - captureEventId = "fingerprintId", - template = byteArrayOf(1, 2, 3), - modality = Modality.FINGERPRINT, - format = "format", - identifier = SampleIdentifier.LEFT_3RD_FINGER, + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "fingerprintId", + template = byteArrayOf(1, 2, 3), + identifier = TemplateIdentifier.LEFT_3RD_FINGER, + ), ), ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, // Wrong SDK type @@ -215,16 +225,16 @@ internal class FingerprintMatcherUseCaseTest { Identity( "personId", listOf( - fingerprintSample(SampleIdentifier.RIGHT_5TH_FINGER), - fingerprintSample(SampleIdentifier.RIGHT_4TH_FINGER), - fingerprintSample(SampleIdentifier.RIGHT_3RD_FINGER), - fingerprintSample(SampleIdentifier.RIGHT_INDEX_FINGER), - fingerprintSample(SampleIdentifier.RIGHT_THUMB), - fingerprintSample(SampleIdentifier.LEFT_THUMB), - fingerprintSample(SampleIdentifier.LEFT_INDEX_FINGER), - fingerprintSample(SampleIdentifier.LEFT_3RD_FINGER), - fingerprintSample(SampleIdentifier.LEFT_4TH_FINGER), - fingerprintSample(SampleIdentifier.LEFT_5TH_FINGER), + fingerprintSample(TemplateIdentifier.RIGHT_5TH_FINGER), + fingerprintSample(TemplateIdentifier.RIGHT_4TH_FINGER), + fingerprintSample(TemplateIdentifier.RIGHT_3RD_FINGER), + fingerprintSample(TemplateIdentifier.RIGHT_INDEX_FINGER), + fingerprintSample(TemplateIdentifier.RIGHT_THUMB), + fingerprintSample(TemplateIdentifier.LEFT_THUMB), + fingerprintSample(TemplateIdentifier.LEFT_INDEX_FINGER), + fingerprintSample(TemplateIdentifier.LEFT_3RD_FINGER), + fingerprintSample(TemplateIdentifier.LEFT_4TH_FINGER), + fingerprintSample(TemplateIdentifier.LEFT_5TH_FINGER), ), ), ), @@ -234,14 +244,16 @@ internal class FingerprintMatcherUseCaseTest { useCase .invoke( matchParams = MatchParams( - probeReferenceId = "referenceId", - probeSamples = listOf( - CaptureSample( - captureEventId = "fingerprintId", - template = byteArrayOf(1, 2, 3), - modality = Modality.FINGERPRINT, - format = "format", - identifier = SampleIdentifier.LEFT_3RD_FINGER, + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "fingerprintId", + template = byteArrayOf(1, 2, 3), + identifier = TemplateIdentifier.LEFT_3RD_FINGER, + ), ), ), bioSdk = SECUGEN_SIM_MATCHER, @@ -254,9 +266,11 @@ internal class FingerprintMatcherUseCaseTest { coVerify { bioSdkWrapper.match(any(), any(), any()) } } - private fun fingerprintSample(finger: SampleIdentifier) = Sample( - identifier = finger, - template = byteArrayOf(1), + private fun fingerprintSample(finger: TemplateIdentifier) = Sample( + template = BiometricTemplate( + identifier = finger, + template = byteArrayOf(1), + ), format = "format", referenceId = "referenceId", modality = Modality.FINGERPRINT, diff --git a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/MatchResultSetTest.kt b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/MatchResultSetTest.kt index c41c905a63..1811e373a2 100644 --- a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/MatchResultSetTest.kt +++ b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/MatchResultSetTest.kt @@ -1,7 +1,7 @@ package com.simprints.infra.matching.usecase import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.MatchComparisonResult +import com.simprints.core.domain.sample.ComparisonResult import org.junit.Test import java.util.concurrent.CountDownLatch import java.util.concurrent.Executors @@ -12,17 +12,17 @@ class MatchResultSetTest { fun `Stores results sorted descending by confidence up to the limit`() { val set = MatchResultSet(3) - set.add(MatchComparisonResult("4", 0.4f)) - set.add(MatchComparisonResult("1", 0.1f)) - set.add(MatchComparisonResult("3", 0.3f)) - set.add(MatchComparisonResult("3", 0.1f)) - set.add(MatchComparisonResult("2", 0.2f)) + set.add(ComparisonResult("4", 0.4f)) + set.add(ComparisonResult("1", 0.1f)) + set.add(ComparisonResult("3", 0.3f)) + set.add(ComparisonResult("3", 0.1f)) + set.add(ComparisonResult("2", 0.2f)) assertThat(set.toList()).isEqualTo( listOf( - MatchComparisonResult("4", 0.4f), - MatchComparisonResult("3", 0.3f), - MatchComparisonResult("2", 0.2f), + ComparisonResult("4", 0.4f), + ComparisonResult("3", 0.3f), + ComparisonResult("2", 0.2f), ), ) } @@ -30,12 +30,12 @@ class MatchResultSetTest { @Test fun `Merges sets preserving the total limit`() { val setOne = MatchResultSet(2) - setOne.add(MatchComparisonResult("1", 0.1f)) - setOne.add(MatchComparisonResult("3", 0.3f)) + setOne.add(ComparisonResult("1", 0.1f)) + setOne.add(ComparisonResult("3", 0.3f)) val setTwo = MatchResultSet(2) - setTwo.add(MatchComparisonResult("2", 0.2f)) - setTwo.add(MatchComparisonResult("4", 0.4f)) + setTwo.add(ComparisonResult("2", 0.2f)) + setTwo.add(ComparisonResult("4", 0.4f)) val set = MatchResultSet(3) set.addAll(setOne) @@ -43,9 +43,9 @@ class MatchResultSetTest { assertThat(set.toList()).isEqualTo( listOf( - MatchComparisonResult("4", 0.4f), - MatchComparisonResult("3", 0.3f), - MatchComparisonResult("2", 0.2f), + ComparisonResult("4", 0.4f), + ComparisonResult("3", 0.3f), + ComparisonResult("2", 0.2f), ), ) } @@ -55,16 +55,16 @@ class MatchResultSetTest { fun `Stores results sorted descending by confidence and id`() { val set = MatchResultSet(3) - set.add(MatchComparisonResult("4", 0.4f)) - set.add(MatchComparisonResult("1", 0.4f)) - set.add(MatchComparisonResult("3", 0.3f)) - set.add(MatchComparisonResult("2", 0.3f)) + set.add(ComparisonResult("4", 0.4f)) + set.add(ComparisonResult("1", 0.4f)) + set.add(ComparisonResult("3", 0.3f)) + set.add(ComparisonResult("2", 0.3f)) assertThat(set.toList()).isEqualTo( listOf( - MatchComparisonResult("4", 0.4f), - MatchComparisonResult("1", 0.4f), - MatchComparisonResult("3", 0.3f), + ComparisonResult("4", 0.4f), + ComparisonResult("1", 0.4f), + ComparisonResult("3", 0.3f), ), ) } @@ -88,7 +88,7 @@ class MatchResultSetTest { // Each thread adds its own batch of elements repeat(elementsPerThread) { i -> val confidence = (threadIndex * elementsPerThread + i) / 100f - set.add(MatchComparisonResult("T$threadIndex-$i", confidence)) + set.add(ComparisonResult("T$threadIndex-$i", confidence)) } } catch (e: Exception) { e.printStackTrace() @@ -111,11 +111,11 @@ class MatchResultSetTest { // Should be sorted by confidence descending for (i in 0 until results.size - 1) { - assertThat(results[i].confidence).isAtLeast(results[i + 1].confidence) + assertThat(results[i].comparisonScore).isAtLeast(results[i + 1].comparisonScore) } // Verify the highest confidence item is at the top - assertThat(results[0].confidence).isEqualTo(1.99f) + assertThat(results[0].comparisonScore).isEqualTo(1.99f) } @Test @@ -129,7 +129,7 @@ class MatchResultSetTest { MatchResultSet(3).apply { repeat(5) { i -> val confidence = 0.5f + (threadIndex * 5 + i) / 100f - add(MatchComparisonResult("S$threadIndex-$i", confidence)) + add(ComparisonResult("S$threadIndex-$i", confidence)) } } } @@ -163,11 +163,11 @@ class MatchResultSetTest { // Should be sorted by confidence descending for (i in 0 until results.size - 1) { - assertThat(results[i].confidence).isAtLeast(results[i + 1].confidence) + assertThat(results[i].comparisonScore).isAtLeast(results[i + 1].comparisonScore) } // Verify the highest confidence item is at the top - assertThat(results[0].confidence).isEqualTo(0.74f) + assertThat(results[0].comparisonScore).isEqualTo(0.74f) } @Test @@ -175,18 +175,18 @@ class MatchResultSetTest { val set = MatchResultSet(3) // Add higher confidence items first to fill the set - set.add(MatchComparisonResult("A", 0.8f)) - set.add(MatchComparisonResult("B", 0.7f)) - set.add(MatchComparisonResult("C", 0.6f)) + set.add(ComparisonResult("A", 0.8f)) + set.add(ComparisonResult("B", 0.7f)) + set.add(ComparisonResult("C", 0.6f)) // Try to add a new set with lower confidence items val lowerSet = MatchResultSet(3) - lowerSet.add(MatchComparisonResult("D", 0.5f)) - lowerSet.add(MatchComparisonResult("E", 0.4f)) - lowerSet.add(MatchComparisonResult("F", 0.3f)) + lowerSet.add(ComparisonResult("D", 0.5f)) + lowerSet.add(ComparisonResult("E", 0.4f)) + lowerSet.add(ComparisonResult("F", 0.3f)) // Add one higher item to verify it still gets added - lowerSet.add(MatchComparisonResult("G", 0.9f)) + lowerSet.add(ComparisonResult("G", 0.9f)) set.addAll(lowerSet) @@ -194,8 +194,8 @@ class MatchResultSetTest { val results = set.toList() assertThat(results).hasSize(3) - assertThat(results[0].confidence).isEqualTo(0.9f) - assertThat(results[1].confidence).isEqualTo(0.8f) - assertThat(results[2].confidence).isEqualTo(0.7f) + assertThat(results[0].comparisonScore).isEqualTo(0.9f) + assertThat(results[1].comparisonScore).isEqualTo(0.8f) + assertThat(results[2].comparisonScore).isEqualTo(0.7f) } } diff --git a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCaseTest.kt b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCaseTest.kt index cec8168abd..574352a768 100644 --- a/infra/matching/src/test/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCaseTest.kt +++ b/infra/matching/src/test/java/com/simprints/infra/matching/usecase/SaveMatchEventUseCaseTest.kt @@ -3,9 +3,10 @@ package com.simprints.infra.matching.usecase import com.google.common.truth.Truth.* import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.common.Modality -import com.simprints.core.domain.sample.CaptureSample -import com.simprints.core.domain.sample.MatchComparisonResult -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.BiometricReferenceCapture +import com.simprints.core.domain.reference.BiometricTemplateCapture +import com.simprints.core.domain.reference.TemplateIdentifier +import com.simprints.core.domain.sample.ComparisonResult import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.tools.time.Timestamp import com.simprints.infra.config.store.models.FaceConfiguration @@ -69,16 +70,18 @@ class SaveMatchEventUseCaseTest { Timestamp(1L), Timestamp(2L), MatchParams( - probeReferenceId = "referenceId", flowType = FlowType.VERIFY, bioSdk = FaceConfiguration.BioSdk.RANK_ONE, queryForCandidates = SubjectQuery(subjectId = "subjectId"), - probeSamples = listOf( - CaptureSample( - captureEventId = "faceId", - template = byteArrayOf(1, 2, 3), - modality = Modality.FACE, - format = "format", + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FACE, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "fingerprintId", + template = byteArrayOf(1, 2, 3), + ), ), ), biometricDataSource = BiometricDataSource.Simprints, @@ -86,8 +89,8 @@ class SaveMatchEventUseCaseTest { 2, "faceMatcherName", listOf( - MatchComparisonResult("guid1", 0.5f), - MatchComparisonResult("guid2", 0.1f), + ComparisonResult("guid1", 0.5f), + ComparisonResult("guid2", 0.1f), ), batches = emptyList(), ) @@ -115,16 +118,18 @@ class SaveMatchEventUseCaseTest { Timestamp(1L), Timestamp(2L), MatchParams( - probeReferenceId = "referenceId", flowType = FlowType.VERIFY, queryForCandidates = SubjectQuery(subjectId = "subjectId"), - probeSamples = listOf( - CaptureSample( - captureEventId = "fingerprintId", - template = byteArrayOf(1, 2, 3), - modality = Modality.FINGERPRINT, - format = "format", - identifier = SampleIdentifier.RIGHT_5TH_FINGER, + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = listOf( + BiometricTemplateCapture( + captureEventId = "fingerprintId", + template = byteArrayOf(1, 2, 3), + identifier = TemplateIdentifier.LEFT_3RD_FINGER, + ), ), ), bioSdk = SECUGEN_SIM_MATCHER, @@ -133,8 +138,8 @@ class SaveMatchEventUseCaseTest { 2, "faceMatcherName", listOf( - MatchComparisonResult("guid1", 0.5f), - MatchComparisonResult("guid2", 0.1f), + ComparisonResult("guid1", 0.5f), + ComparisonResult("guid2", 0.1f), ), batches = emptyList(), ) @@ -166,8 +171,12 @@ class SaveMatchEventUseCaseTest { startTime = Timestamp(1L), endTime = Timestamp(2L), matchParams = MatchParams( - probeReferenceId = "referenceId", - probeSamples = emptyList(), + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = emptyList(), + ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, flowType = FlowType.IDENTIFY, queryForCandidates = SubjectQuery(), @@ -176,8 +185,8 @@ class SaveMatchEventUseCaseTest { candidatesCount = 2, matcherName = "faceMatcherName", results = listOf( - MatchComparisonResult("guid1", 0.5f), - MatchComparisonResult("guid2", 0.1f), + ComparisonResult("guid1", 0.5f), + ComparisonResult("guid2", 0.1f), ), batches = batches, ) @@ -227,7 +236,12 @@ class SaveMatchEventUseCaseTest { Timestamp(1L), Timestamp(2L), MatchParams( - probeReferenceId = "referenceId", + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = emptyList(), + ), flowType = FlowType.IDENTIFY, bioSdk = FaceConfiguration.BioSdk.RANK_ONE, queryForCandidates = SubjectQuery(attendantId = "userId".asTokenizableEncrypted()), @@ -235,7 +249,7 @@ class SaveMatchEventUseCaseTest { ), 0, "faceMatcherName", - listOf(MatchComparisonResult("guid1", 0.5f)), + listOf(ComparisonResult("guid1", 0.5f)), batches = batches, ) @@ -265,7 +279,12 @@ class SaveMatchEventUseCaseTest { Timestamp(1L), Timestamp(2L), MatchParams( - probeReferenceId = "referenceId", + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = emptyList(), + ), flowType = FlowType.IDENTIFY, bioSdk = FaceConfiguration.BioSdk.RANK_ONE, queryForCandidates = SubjectQuery(moduleId = "moduleId".asTokenizableEncrypted()), @@ -303,9 +322,13 @@ class SaveMatchEventUseCaseTest { Timestamp(1L), Timestamp(2L), MatchParams( - probeReferenceId = "referenceId", + probeReference = BiometricReferenceCapture( + referenceId = "referenceId", + modality = Modality.FINGERPRINT, + format = "format", + templates = emptyList(), + ), bioSdk = FaceConfiguration.BioSdk.RANK_ONE, - probeSamples = emptyList(), flowType = FlowType.IDENTIFY, queryForCandidates = SubjectQuery(), biometricDataSource = BiometricDataSource.Simprints, diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/config/testtools/Models.kt b/infra/sync/src/test/java/com/simprints/infra/sync/config/testtools/Models.kt index d56314875d..5fcb456136 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/config/testtools/Models.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/config/testtools/Models.kt @@ -3,7 +3,7 @@ package com.simprints.infra.sync.config.testtools import com.simprints.core.domain.common.AgeGroup import com.simprints.core.domain.common.Modality import com.simprints.core.domain.externalcredential.ExternalCredentialType -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.config.store.models.ConsentConfiguration import com.simprints.infra.config.store.models.DecisionPolicy @@ -68,7 +68,7 @@ internal val fingerprintConfiguration = FingerprintConfiguration( allowedSDKs = listOf(FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER), displayHandIcons = true, secugenSimMatcher = FingerprintConfiguration.FingerprintSdkConfiguration( - listOf(SampleIdentifier.LEFT_3RD_FINGER), + listOf(TemplateIdentifier.LEFT_3RD_FINGER), decisionPolicy, FingerprintConfiguration.FingerComparisonStrategy.SAME_FINGER, vero1 = Vero1Configuration(10), diff --git a/testing/data-generator/src/main/java/com/simprints/feature/datagenerator/enrollmentrecords/InsertEnrollmentRecordsUseCase.kt b/testing/data-generator/src/main/java/com/simprints/feature/datagenerator/enrollmentrecords/InsertEnrollmentRecordsUseCase.kt index 817c317466..6ae559b368 100644 --- a/testing/data-generator/src/main/java/com/simprints/feature/datagenerator/enrollmentrecords/InsertEnrollmentRecordsUseCase.kt +++ b/testing/data-generator/src/main/java/com/simprints/feature/datagenerator/enrollmentrecords/InsertEnrollmentRecordsUseCase.kt @@ -3,8 +3,9 @@ package com.simprints.feature.datagenerator.enrollmentrecords import android.os.Bundle import com.simprints.core.DispatcherIO import com.simprints.core.domain.common.Modality +import com.simprints.core.domain.reference.BiometricTemplate +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.core.domain.sample.Sample -import com.simprints.core.domain.sample.SampleIdentifier import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.tools.time.TimeHelper import com.simprints.infra.config.store.ConfigRepository @@ -87,7 +88,9 @@ internal class InsertEnrollmentRecordsUseCase @Inject constructor( repeat(numSamples) { faceSamples.add( Sample( - template = getTemplateForFormat(key), + template = BiometricTemplate( + template = getTemplateForFormat(key), + ), format = key, referenceId = UUID.randomUUID().toString(), id = UUID.randomUUID().toString(), @@ -116,15 +119,17 @@ internal class InsertEnrollmentRecordsUseCase @Inject constructor( for (i in 0 until numSamples) { fingerprintSamples.add( Sample( - template = getTemplateForFormat(key), + template = BiometricTemplate( + template = getTemplateForFormat(key), + identifier = if (fingerIdentifiers.isNullOrEmpty()) { + TemplateIdentifier.LEFT_THUMB + } else { + fingerIdentifiers[i % fingerIdentifiers.size].toFingerIdentifier() + }, + ), format = key, referenceId = UUID.randomUUID().toString(), id = UUID.randomUUID().toString(), - identifier = if (fingerIdentifiers.isNullOrEmpty()) { - SampleIdentifier.LEFT_THUMB - } else { - fingerIdentifiers[i % fingerIdentifiers.size].toFingerIdentifier() - }, modality = Modality.FINGERPRINT, ), ) @@ -134,19 +139,17 @@ internal class InsertEnrollmentRecordsUseCase @Inject constructor( } private fun String.toFingerIdentifier() = when (this.uppercase()) { - "LEFT_THUMB" -> SampleIdentifier.LEFT_THUMB - "LEFT_INDEX_FINGER" -> SampleIdentifier.LEFT_INDEX_FINGER - "LEFT_3RD_FINGER" -> SampleIdentifier.LEFT_3RD_FINGER - "LEFT_4TH_FINGER" -> SampleIdentifier.LEFT_4TH_FINGER - "LEFT_5TH_FINGER" -> SampleIdentifier.LEFT_5TH_FINGER - "RIGHT_THUMB" -> SampleIdentifier.RIGHT_THUMB - "RIGHT_INDEX_FINGER" -> SampleIdentifier.RIGHT_INDEX_FINGER - "RIGHT_3RD_FINGER" -> SampleIdentifier.RIGHT_3RD_FINGER - "RIGHT_4TH_FINGER" -> SampleIdentifier.RIGHT_4TH_FINGER - "RIGHT_5TH_FINGER" -> SampleIdentifier.RIGHT_5TH_FINGER - else -> { - SampleIdentifier.LEFT_THUMB - } + "LEFT_THUMB" -> TemplateIdentifier.LEFT_THUMB + "LEFT_INDEX_FINGER" -> TemplateIdentifier.LEFT_INDEX_FINGER + "LEFT_3RD_FINGER" -> TemplateIdentifier.LEFT_3RD_FINGER + "LEFT_4TH_FINGER" -> TemplateIdentifier.LEFT_4TH_FINGER + "LEFT_5TH_FINGER" -> TemplateIdentifier.LEFT_5TH_FINGER + "RIGHT_THUMB" -> TemplateIdentifier.RIGHT_THUMB + "RIGHT_INDEX_FINGER" -> TemplateIdentifier.RIGHT_INDEX_FINGER + "RIGHT_3RD_FINGER" -> TemplateIdentifier.RIGHT_3RD_FINGER + "RIGHT_4TH_FINGER" -> TemplateIdentifier.RIGHT_4TH_FINGER + "RIGHT_5TH_FINGER" -> TemplateIdentifier.RIGHT_5TH_FINGER + else -> TemplateIdentifier.LEFT_THUMB } private fun getTemplateForFormat(format: String): ByteArray = when (format) { diff --git a/testing/data-generator/src/test/java/com/simprints/feature/datagenerator/InsertEnrollmentRecordsUseCaseTest.kt b/testing/data-generator/src/test/java/com/simprints/feature/datagenerator/InsertEnrollmentRecordsUseCaseTest.kt index fb24923edb..6d63f49f25 100644 --- a/testing/data-generator/src/test/java/com/simprints/feature/datagenerator/InsertEnrollmentRecordsUseCaseTest.kt +++ b/testing/data-generator/src/test/java/com/simprints/feature/datagenerator/InsertEnrollmentRecordsUseCaseTest.kt @@ -4,7 +4,7 @@ import android.os.Bundle import androidx.core.os.bundleOf import androidx.test.ext.junit.runners.* import com.google.common.truth.Truth.* -import com.simprints.core.domain.sample.SampleIdentifier +import com.simprints.core.domain.reference.TemplateIdentifier import com.simprints.feature.datagenerator.enrollmentrecords.InsertEnrollmentRecordsUseCase import com.simprints.feature.datagenerator.enrollmentrecords.InsertEnrollmentRecordsUseCase.Companion.BATCH_SIZE import com.simprints.infra.config.store.ConfigRepository @@ -246,8 +246,8 @@ internal class InsertEnrollmentRecordsUseCaseTest { // Then val subject = subjectActionsSlot.captured.first().subject assertThat(subject.samples).hasSize(2) - assertThat(subject.samples[0].identifier).isEqualTo(SampleIdentifier.LEFT_THUMB) - assertThat(subject.samples[1].identifier).isEqualTo(SampleIdentifier.LEFT_THUMB) + assertThat(subject.samples[0].template.identifier).isEqualTo(TemplateIdentifier.LEFT_THUMB) + assertThat(subject.samples[1].template.identifier).isEqualTo(TemplateIdentifier.LEFT_THUMB) } @Test @@ -277,14 +277,14 @@ internal class InsertEnrollmentRecordsUseCaseTest { // Then val subject = subjectActionsSlot.captured.first().subject - val fingers = subject.samples.map { it.identifier } + val fingers = subject.samples.map { it.template.identifier } assertThat(fingers).hasSize(4) assertThat(fingers) .containsExactly( - SampleIdentifier.RIGHT_THUMB, - SampleIdentifier.RIGHT_INDEX_FINGER, - SampleIdentifier.RIGHT_THUMB, // cycles back - SampleIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.RIGHT_THUMB, + TemplateIdentifier.RIGHT_INDEX_FINGER, + TemplateIdentifier.RIGHT_THUMB, // cycles back + TemplateIdentifier.RIGHT_INDEX_FINGER, ).inOrder() } }