From 342bcf364507a8d0effe74527e36a907026e0b36 Mon Sep 17 00:00:00 2001 From: melad Date: Mon, 4 Nov 2024 10:13:22 +0200 Subject: [PATCH 1/2] [MS-104] Update the scanner mock module to simulate the latest UN20 commands --- fingerprint/connect/build.gradle.kts | 2 + .../connect/ScannerConnectModule.kt | 42 +++++++++ .../screens/ConnectScannerViewModelTest.kt | 2 +- fingerprint/infra/scanner/build.gradle.kts | 3 - .../infra/scanner/ScannerModule.kt | 18 ---- .../android/AndroidBluetoothAdapter.kt | 2 +- .../scanner/ScannerPairingManagerTest.kt | 2 +- .../scannermock/src/main/AndroidManifest.xml | 7 +- .../{ => infra}/scannermock/README.md | 0 .../dummy/DummyBluetoothAdapter.kt | 2 +- .../scannermock/dummy/DummyBluetoothDevice.kt | 2 +- .../{ => infra}/scannermock/dummy/README.md | 0 .../record/AndroidRecordBluetoothAdapter.kt | 2 +- .../record/AndroidRecordBluetoothDevice.kt | 2 +- .../record/AndroidRecordBluetoothSocket.kt | 2 +- .../{ => infra}/scannermock/record/README.md | 0 .../scannermock/simulated/README.md | 0 .../simulated/SimulatedScannerManager.kt | 30 ++++--- .../scannermock/simulated/SimulationMode.kt | 5 ++ .../simulated/common/SimulatedFinger.kt | 2 +- .../simulated/common/SimulatedScanner.kt | 8 +- .../simulated/common/SimulatedScannerState.kt | 2 +- .../common/SimulationSpeedBehaviour.kt | 2 +- .../component/SimulatedBluetoothAdapter.kt | 4 +- .../component/SimulatedBluetoothDevice.kt | 4 +- .../component/SimulatedBluetoothSocket.kt | 4 +- .../simulated/tools/ByteArrayTools.kt | 2 +- .../tools/OutputStreamInterceptor.kt | 2 +- .../simulated/v1/ScannerStateHandlerV1.kt | 2 +- .../simulated/v1/SimulatedCommandParserV1.kt | 2 +- .../simulated/v1/SimulatedFingerV1.kt | 4 +- .../simulated/v1/SimulatedResponseHelperV1.kt | 6 +- .../simulated/v1/SimulatedScannerStateV1.kt | 5 ++ .../simulated/v1/SimulatedScannerV1.kt | 6 +- .../simulated/v2/ScannerStateHandlerV2.kt | 2 +- .../v2/SimulatedCommandInputStream.kt | 2 +- .../simulated/v2/SimulatedFingerV2.kt | 6 +- .../v2/SimulatedResponseOutputStream.kt | 2 +- .../simulated/v2/SimulatedScannerStateV2.kt | 4 +- .../simulated/v2/SimulatedScannerV2.kt | 16 ++-- .../v2/response/SimulatedResponseHelperV2.kt | 2 +- .../response/SimulatedRootResponseHelper.kt | 14 +-- .../response/SimulatedUn20ResponseHelper.kt | 83 +++++++++++++----- .../response/SimulatedVeroResponseHelper.kt | 10 +-- .../scannermock/simulated/SimulationMode.kt | 5 -- .../simulated/v1/SimulatedScannerStateV1.kt | 5 -- .../res/raw/corrected_fingerprint_image.wsq | Bin 0 -> 7292 bytes .../main/res/raw/image_distortion_config.raw | Bin 0 -> 24610 bytes .../src/main/res/raw/raw_image.bin | Bin 0 -> 36938 bytes .../scannermock/ByteArrayUtilsTest.kt | 4 +- .../OutgoingMessagesToScannerTest.kt | 21 +++-- 51 files changed, 211 insertions(+), 143 deletions(-) create mode 100644 fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/ScannerConnectModule.kt rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/README.md (100%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/dummy/DummyBluetoothAdapter.kt (92%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/dummy/DummyBluetoothDevice.kt (95%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/dummy/README.md (100%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/record/AndroidRecordBluetoothAdapter.kt (95%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/record/AndroidRecordBluetoothDevice.kt (93%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/record/AndroidRecordBluetoothSocket.kt (94%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/record/README.md (100%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/README.md (100%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/SimulatedScannerManager.kt (75%) create mode 100644 fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/SimulationMode.kt rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/common/SimulatedFinger.kt (90%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/common/SimulatedScanner.kt (76%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/common/SimulatedScannerState.kt (62%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/common/SimulationSpeedBehaviour.kt (80%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/component/SimulatedBluetoothAdapter.kt (83%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/component/SimulatedBluetoothDevice.kt (84%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/component/SimulatedBluetoothSocket.kt (79%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/tools/ByteArrayTools.kt (91%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/tools/OutputStreamInterceptor.kt (93%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v1/ScannerStateHandlerV1.kt (86%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v1/SimulatedCommandParserV1.kt (88%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v1/SimulatedFingerV1.kt (99%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v1/SimulatedResponseHelperV1.kt (95%) create mode 100644 fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedScannerStateV1.kt rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v1/SimulatedScannerV1.kt (77%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/ScannerStateHandlerV2.kt (98%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/SimulatedCommandInputStream.kt (99%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/SimulatedFingerV2.kt (97%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/SimulatedResponseOutputStream.kt (96%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/SimulatedScannerStateV2.kt (92%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/SimulatedScannerV2.kt (82%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/response/SimulatedResponseHelperV2.kt (78%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/response/SimulatedRootResponseHelper.kt (73%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/response/SimulatedUn20ResponseHelper.kt (53%) rename fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/{ => infra}/scannermock/simulated/v2/response/SimulatedVeroResponseHelper.kt (93%) delete mode 100644 fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/SimulationMode.kt delete mode 100644 fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedScannerStateV1.kt create mode 100644 fingerprint/infra/scannermock/src/main/res/raw/corrected_fingerprint_image.wsq create mode 100644 fingerprint/infra/scannermock/src/main/res/raw/image_distortion_config.raw create mode 100644 fingerprint/infra/scannermock/src/main/res/raw/raw_image.bin rename fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/{ => infra}/scannermock/ByteArrayUtilsTest.kt (78%) rename fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/{ => infra}/scannermock/OutgoingMessagesToScannerTest.kt (92%) diff --git a/fingerprint/connect/build.gradle.kts b/fingerprint/connect/build.gradle.kts index ada579c339..40438f40a0 100644 --- a/fingerprint/connect/build.gradle.kts +++ b/fingerprint/connect/build.gradle.kts @@ -20,4 +20,6 @@ dependencies { implementation(project(":fingerprint:infra:scanner")) testImplementation(project(":fingerprint:infra:scannermock")) + // Uncomment the line below to use the mock scanner implementation + // implementation(project(":fingerprint:infra:scannermock")) } diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/ScannerConnectModule.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/ScannerConnectModule.kt new file mode 100644 index 0000000000..4be27b3627 --- /dev/null +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/ScannerConnectModule.kt @@ -0,0 +1,42 @@ +package com.simprints.fingerprint.connect + +import android.bluetooth.BluetoothAdapter +import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothAdapter +import com.simprints.fingerprint.infra.scanner.component.bluetooth.android.AndroidBluetoothAdapter +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object ScannerConnectModule { + + /* + * This is the simulated implementation of the BluetoothAdapter + * uncomment this and the import of the scanner mock module in the build.gradle.kts + */ +/* + @Provides + @Singleton + fun provideComponentBluetoothAdapter(@ApplicationContext ctx: Context): ComponentBluetoothAdapter = + SimulatedBluetoothAdapter(SimulatedScannerManager( + simulationMode = SimulationMode.V2, + isAdapterNull = false, + isAdapterEnabled = true, + isDeviceBonded = true, + deviceName = "Simulated Scanner", + outgoingStreamObservers = setOf(), + context = ctx, + )) +*/ + + /* + * This is the real implementation of the BluetoothAdapter + */ + @Provides + @Singleton + fun provideComponentBluetoothAdapter(): ComponentBluetoothAdapter = + AndroidBluetoothAdapter(BluetoothAdapter.getDefaultAdapter()) +} diff --git a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModelTest.kt b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModelTest.kt index 022c5db3a6..ff074cb07c 100644 --- a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModelTest.kt +++ b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModelTest.kt @@ -25,7 +25,7 @@ import com.simprints.fingerprint.infra.scanner.exceptions.unexpected.UnknownScan import com.simprints.fingerprint.infra.scanner.tools.SerialNumberConverter import com.simprints.fingerprint.infra.scanner.wrapper.ScannerFactory import com.simprints.fingerprint.infra.scanner.wrapper.ScannerWrapper -import com.simprints.fingerprint.scannermock.dummy.DummyBluetoothDevice +import com.simprints.fingerprint.infra.scannermock.dummy.DummyBluetoothDevice import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.config.store.models.FingerprintConfiguration.BioSdk.SECUGEN_SIM_MATCHER import com.simprints.infra.config.sync.ConfigManager diff --git a/fingerprint/infra/scanner/build.gradle.kts b/fingerprint/infra/scanner/build.gradle.kts index 2d59ea323d..1ff533ace1 100644 --- a/fingerprint/infra/scanner/build.gradle.kts +++ b/fingerprint/infra/scanner/build.gradle.kts @@ -23,9 +23,6 @@ dependencies { // RxJava api(libs.rxJava2.core) implementation(libs.rxJava2.kotlin) - - // If mock/dummy BT adapter is required test implementation can be switched to regular one testImplementation(project(":fingerprint:infra:scannermock")) - //implementation(project(":fingerprint:infra:scannermock")) } diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/ScannerModule.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/ScannerModule.kt index bd236cec32..fa551f9dc3 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/ScannerModule.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/ScannerModule.kt @@ -1,10 +1,7 @@ package com.simprints.fingerprint.infra.scanner -import android.bluetooth.BluetoothAdapter import android.content.Context import android.nfc.NfcAdapter -import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothAdapter -import com.simprints.fingerprint.infra.scanner.component.bluetooth.android.AndroidBluetoothAdapter import com.simprints.fingerprint.infra.scanner.nfc.ComponentNfcAdapter import com.simprints.fingerprint.infra.scanner.nfc.android.AndroidNfcAdapter import dagger.Binds @@ -13,7 +10,6 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton @Module( includes = [ @@ -35,18 +31,4 @@ object FingerprintDependenciesModule { @Provides fun provideNfcAdapter(@ApplicationContext context: Context): ComponentNfcAdapter = AndroidNfcAdapter(NfcAdapter.getDefaultAdapter(context)) - - /** - * To provide alternative implementation for BT adapter replace - * returned instance with any of the mock implementations: - * - DummyBluetoothAdapter() - * - AndroidRecordBluetoothAdapter() - * - SimulatedBluetoothAdapter(SimulatedScannerManager(...)) - * - * Also change the dependency declaration in build.gradle.kts - */ - @Provides - @Singleton - fun provideComponentBluetoothAdapter(): ComponentBluetoothAdapter = - AndroidBluetoothAdapter(BluetoothAdapter.getDefaultAdapter()) } diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/component/bluetooth/android/AndroidBluetoothAdapter.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/component/bluetooth/android/AndroidBluetoothAdapter.kt index a2e3cd839c..1bc4d8f232 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/component/bluetooth/android/AndroidBluetoothAdapter.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/component/bluetooth/android/AndroidBluetoothAdapter.kt @@ -5,7 +5,7 @@ import android.bluetooth.BluetoothAdapter import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothAdapter import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothDevice -internal class AndroidBluetoothAdapter(private val adapter: BluetoothAdapter?) : ComponentBluetoothAdapter { +class AndroidBluetoothAdapter(private val adapter: BluetoothAdapter?) : ComponentBluetoothAdapter { override fun isNull(): Boolean = adapter == null diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/ScannerPairingManagerTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/ScannerPairingManagerTest.kt index a4ca2c9b97..d14ff65d8d 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/ScannerPairingManagerTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/ScannerPairingManagerTest.kt @@ -9,7 +9,7 @@ import com.simprints.fingerprint.infra.scanner.exceptions.safe.MultiplePossibleS import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerNotPairedException import com.simprints.fingerprint.infra.scanner.tools.ScannerGenerationDeterminer import com.simprints.fingerprint.infra.scanner.tools.SerialNumberConverter -import com.simprints.fingerprint.scannermock.dummy.DummyBluetoothDevice +import com.simprints.fingerprint.infra.scannermock.dummy.DummyBluetoothDevice import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration import com.simprints.infra.recent.user.activity.RecentUserActivityManager diff --git a/fingerprint/infra/scannermock/src/main/AndroidManifest.xml b/fingerprint/infra/scannermock/src/main/AndroidManifest.xml index 4f1c58a74d..8072ee00db 100644 --- a/fingerprint/infra/scannermock/src/main/AndroidManifest.xml +++ b/fingerprint/infra/scannermock/src/main/AndroidManifest.xml @@ -1,5 +1,2 @@ - - - - - + + diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/README.md b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/README.md similarity index 100% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/README.md rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/README.md diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/dummy/DummyBluetoothAdapter.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/dummy/DummyBluetoothAdapter.kt similarity index 92% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/dummy/DummyBluetoothAdapter.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/dummy/DummyBluetoothAdapter.kt index a517337d68..3d36c415e9 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/dummy/DummyBluetoothAdapter.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/dummy/DummyBluetoothAdapter.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.dummy +package com.simprints.fingerprint.infra.scannermock.dummy import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothAdapter import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothDevice diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/dummy/DummyBluetoothDevice.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/dummy/DummyBluetoothDevice.kt similarity index 95% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/dummy/DummyBluetoothDevice.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/dummy/DummyBluetoothDevice.kt index 6962c657d4..c9809da9a0 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/dummy/DummyBluetoothDevice.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/dummy/DummyBluetoothDevice.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.dummy +package com.simprints.fingerprint.infra.scannermock.dummy import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothDevice import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothSocket diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/dummy/README.md b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/dummy/README.md similarity index 100% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/dummy/README.md rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/dummy/README.md diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothAdapter.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothAdapter.kt similarity index 95% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothAdapter.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothAdapter.kt index 888d1f2e9e..ea95e80fb2 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothAdapter.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothAdapter.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.record +package com.simprints.fingerprint.infra.scannermock.record import android.bluetooth.BluetoothAdapter import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothAdapter diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothDevice.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothDevice.kt similarity index 93% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothDevice.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothDevice.kt index 7acfd70c90..312428a00d 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothDevice.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothDevice.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.record +package com.simprints.fingerprint.infra.scannermock.record import android.bluetooth.BluetoothDevice import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothDevice diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothSocket.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothSocket.kt similarity index 94% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothSocket.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothSocket.kt index c904ca1ca1..4c14cd86ed 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/AndroidRecordBluetoothSocket.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/AndroidRecordBluetoothSocket.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.record +package com.simprints.fingerprint.infra.scannermock.record import android.bluetooth.BluetoothSocket import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothSocket diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/README.md b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/README.md similarity index 100% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/record/README.md rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/README.md diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/README.md b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/README.md similarity index 100% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/README.md rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/README.md diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/SimulatedScannerManager.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/SimulatedScannerManager.kt similarity index 75% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/SimulatedScannerManager.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/SimulatedScannerManager.kt index d32b752c73..35c1474d77 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/SimulatedScannerManager.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/SimulatedScannerManager.kt @@ -1,15 +1,16 @@ -package com.simprints.fingerprint.scannermock.simulated - -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedFinger -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedScanner -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedScannerState -import com.simprints.fingerprint.scannermock.simulated.common.SimulationSpeedBehaviour -import com.simprints.fingerprint.scannermock.simulated.component.SimulatedBluetoothDevice -import com.simprints.fingerprint.scannermock.simulated.tools.OutputStreamInterceptor -import com.simprints.fingerprint.scannermock.simulated.v1.SimulatedScannerStateV1 -import com.simprints.fingerprint.scannermock.simulated.v1.SimulatedScannerV1 -import com.simprints.fingerprint.scannermock.simulated.v2.SimulatedScannerStateV2 -import com.simprints.fingerprint.scannermock.simulated.v2.SimulatedScannerV2 +package com.simprints.fingerprint.infra.scannermock.simulated + +import android.content.Context +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedFinger +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedScanner +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedScannerState +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulationSpeedBehaviour +import com.simprints.fingerprint.infra.scannermock.simulated.component.SimulatedBluetoothDevice +import com.simprints.fingerprint.infra.scannermock.simulated.tools.OutputStreamInterceptor +import com.simprints.fingerprint.infra.scannermock.simulated.v1.SimulatedScannerStateV1 +import com.simprints.fingerprint.infra.scannermock.simulated.v1.SimulatedScannerV1 +import com.simprints.fingerprint.infra.scannermock.simulated.v2.SimulatedScannerStateV2 +import com.simprints.fingerprint.infra.scannermock.simulated.v2.SimulatedScannerV2 import io.reactivex.Observer import io.reactivex.observers.DisposableObserver import java.io.PipedInputStream @@ -26,7 +27,8 @@ class SimulatedScannerManager( var isAdapterEnabled: Boolean = true, var isDeviceBonded: Boolean = true, var deviceName: String = "", - var outgoingStreamObservers: Set> = setOf()) { + var outgoingStreamObservers: Set> = setOf(), + var context: Context?,) { private var simulatedScanner: SimulatedScanner? = null @@ -97,6 +99,6 @@ class SimulatedScannerManager( } companion object { - const val DEFAULT_MAC_ADDRESS: String = "F0:AC:D7:CE:E3:B5" + const val DEFAULT_MAC_ADDRESS: String = "F0:AC:D7:C0:03:B5" } } diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/SimulationMode.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/SimulationMode.kt new file mode 100644 index 0000000000..a3ea09a19c --- /dev/null +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/SimulationMode.kt @@ -0,0 +1,5 @@ +package com.simprints.fingerprint.infra.scannermock.simulated + +enum class SimulationMode { + V1, V2 +} diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedFinger.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedFinger.kt similarity index 90% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedFinger.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedFinger.kt index 8a6c322897..bd8b0de85b 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedFinger.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedFinger.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.common +package com.simprints.fingerprint.infra.scannermock.simulated.common enum class SimulatedFinger { diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedScanner.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedScanner.kt similarity index 76% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedScanner.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedScanner.kt index ce1b11075d..fa21e0cded 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedScanner.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedScanner.kt @@ -1,8 +1,8 @@ -package com.simprints.fingerprint.scannermock.simulated.common +package com.simprints.fingerprint.infra.scannermock.simulated.common -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager -import com.simprints.fingerprint.scannermock.simulated.common.SimulationSpeedBehaviour.INSTANT -import com.simprints.fingerprint.scannermock.simulated.common.SimulationSpeedBehaviour.REALISTIC +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulationSpeedBehaviour.INSTANT +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulationSpeedBehaviour.REALISTIC import java.io.OutputStream abstract class SimulatedScanner(val scannerManager: SimulatedScannerManager) { diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedScannerState.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedScannerState.kt similarity index 62% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedScannerState.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedScannerState.kt index 364df4a9d0..8cc1353800 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulatedScannerState.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulatedScannerState.kt @@ -1,3 +1,3 @@ -package com.simprints.fingerprint.scannermock.simulated.common +package com.simprints.fingerprint.infra.scannermock.simulated.common abstract class SimulatedScannerState(val eventQueue: MutableList Unit> = mutableListOf()) diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulationSpeedBehaviour.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulationSpeedBehaviour.kt similarity index 80% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulationSpeedBehaviour.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulationSpeedBehaviour.kt index 547c07a56e..d1f033fb14 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/common/SimulationSpeedBehaviour.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/common/SimulationSpeedBehaviour.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.common +package com.simprints.fingerprint.infra.scannermock.simulated.common enum class SimulationSpeedBehaviour { INSTANT, diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothAdapter.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothAdapter.kt similarity index 83% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothAdapter.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothAdapter.kt index abfcc9b6e1..4e2bdf5423 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothAdapter.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothAdapter.kt @@ -1,8 +1,8 @@ -package com.simprints.fingerprint.scannermock.simulated.component +package com.simprints.fingerprint.infra.scannermock.simulated.component import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothAdapter import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothDevice -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager class SimulatedBluetoothAdapter(private val simulatedScannerManager: SimulatedScannerManager) : ComponentBluetoothAdapter { diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothDevice.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothDevice.kt similarity index 84% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothDevice.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothDevice.kt index 0a9184a089..56e54e29ae 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothDevice.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothDevice.kt @@ -1,8 +1,8 @@ -package com.simprints.fingerprint.scannermock.simulated.component +package com.simprints.fingerprint.infra.scannermock.simulated.component import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothDevice import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothSocket -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager import java.util.UUID diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothSocket.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothSocket.kt similarity index 79% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothSocket.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothSocket.kt index 69a77f672d..29d015ec4b 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/component/SimulatedBluetoothSocket.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/component/SimulatedBluetoothSocket.kt @@ -1,7 +1,7 @@ -package com.simprints.fingerprint.scannermock.simulated.component +package com.simprints.fingerprint.infra.scannermock.simulated.component import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBluetoothSocket -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager import java.io.InputStream import java.io.OutputStream diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/tools/ByteArrayTools.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/tools/ByteArrayTools.kt similarity index 91% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/tools/ByteArrayTools.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/tools/ByteArrayTools.kt index 437a23315b..4de65aaf3f 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/tools/ByteArrayTools.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/tools/ByteArrayTools.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.tools +package com.simprints.fingerprint.infra.scannermock.simulated.tools /** @throws IndexOutOfBoundsException if odd number of hex characters */ fun hexStringToByteArray(string: String): ByteArray { diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/tools/OutputStreamInterceptor.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/tools/OutputStreamInterceptor.kt similarity index 93% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/tools/OutputStreamInterceptor.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/tools/OutputStreamInterceptor.kt index f782d569d4..0f7e110337 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/tools/OutputStreamInterceptor.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/tools/OutputStreamInterceptor.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.tools +package com.simprints.fingerprint.infra.scannermock.simulated.tools import io.reactivex.Observer import java.io.OutputStream diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/ScannerStateHandlerV1.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/ScannerStateHandlerV1.kt similarity index 86% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/ScannerStateHandlerV1.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/ScannerStateHandlerV1.kt index ad2ae536d1..04d0d4eb19 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/ScannerStateHandlerV1.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/ScannerStateHandlerV1.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v1 +package com.simprints.fingerprint.infra.scannermock.simulated.v1 import com.simprints.fingerprint.infra.scanner.v1.Message import com.simprints.fingerprint.infra.scanner.v1.enums.MESSAGE_TYPE diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedCommandParserV1.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedCommandParserV1.kt similarity index 88% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedCommandParserV1.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedCommandParserV1.kt index a1c461e5bd..28f3c0ce48 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedCommandParserV1.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedCommandParserV1.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v1 +package com.simprints.fingerprint.infra.scannermock.simulated.v1 import com.simprints.fingerprint.infra.scanner.v1.Message import java.io.PipedInputStream diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedFingerV1.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedFingerV1.kt similarity index 99% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedFingerV1.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedFingerV1.kt index 413ff7e205..4c04e897fa 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedFingerV1.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedFingerV1.kt @@ -1,6 +1,6 @@ -package com.simprints.fingerprint.scannermock.simulated.v1 +package com.simprints.fingerprint.infra.scannermock.simulated.v1 -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedFinger +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedFinger enum class SimulatedFingerV1(val imageQualityResponse: String = "fa fa fa fa 0e 00 8b 00 63 00 f5 f5 f5 f5 ", // Quality score 99 diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedResponseHelperV1.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedResponseHelperV1.kt similarity index 95% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedResponseHelperV1.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedResponseHelperV1.kt index 19d3e25d12..70c7685cce 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedResponseHelperV1.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedResponseHelperV1.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v1 +package com.simprints.fingerprint.infra.scannermock.simulated.v1 import com.simprints.fingerprint.infra.scanner.v1.Message import com.simprints.fingerprint.infra.scanner.v1.enums.MESSAGE_TYPE.CAPTURE_IMAGE @@ -15,8 +15,8 @@ import com.simprints.fingerprint.infra.scanner.v1.enums.MESSAGE_TYPE.SET_RUNNING import com.simprints.fingerprint.infra.scanner.v1.enums.MESSAGE_TYPE.SET_UI import com.simprints.fingerprint.infra.scanner.v1.enums.MESSAGE_TYPE.UN20_SHUTDOWN import com.simprints.fingerprint.infra.scanner.v1.enums.MESSAGE_TYPE.UN20_WAKEUP -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager -import com.simprints.fingerprint.scannermock.simulated.tools.byteArrayFromHexString +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.tools.byteArrayFromHexString class SimulatedResponseHelperV1(private val simulatedScannerManager: SimulatedScannerManager, private val simulatedScanner: SimulatedScannerV1) { diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedScannerStateV1.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedScannerStateV1.kt new file mode 100644 index 0000000000..8a3868575c --- /dev/null +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedScannerStateV1.kt @@ -0,0 +1,5 @@ +package com.simprints.fingerprint.infra.scannermock.simulated.v1 + +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedScannerState + +class SimulatedScannerStateV1(var isUn20On: Boolean = false) : SimulatedScannerState() diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedScannerV1.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedScannerV1.kt similarity index 77% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedScannerV1.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedScannerV1.kt index 77b4d16510..badddc39c1 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedScannerV1.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v1/SimulatedScannerV1.kt @@ -1,8 +1,8 @@ -package com.simprints.fingerprint.scannermock.simulated.v1 +package com.simprints.fingerprint.infra.scannermock.simulated.v1 import com.simprints.fingerprint.infra.scanner.v1.Message -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedScanner +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedScanner import java.io.OutputStream class SimulatedScannerV1(simulatedScannerManager: SimulatedScannerManager, diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/ScannerStateHandlerV2.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/ScannerStateHandlerV2.kt similarity index 98% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/ScannerStateHandlerV2.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/ScannerStateHandlerV2.kt index fe6c806ea6..2ff2defc90 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/ScannerStateHandlerV2.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/ScannerStateHandlerV2.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v2 +package com.simprints.fingerprint.infra.scannermock.simulated.v2 import com.simprints.fingerprint.infra.scanner.v2.domain.Mode import com.simprints.fingerprint.infra.scanner.v2.domain.OutgoingMessage diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedCommandInputStream.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedCommandInputStream.kt similarity index 99% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedCommandInputStream.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedCommandInputStream.kt index fee4f7f28b..0ab6535498 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedCommandInputStream.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedCommandInputStream.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v2 +package com.simprints.fingerprint.infra.scannermock.simulated.v2 import com.simprints.fingerprint.infra.scanner.v2.domain.Mode import com.simprints.fingerprint.infra.scanner.v2.domain.Mode.CYPRESS_OTA diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedFingerV2.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedFingerV2.kt similarity index 97% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedFingerV2.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedFingerV2.kt index 6f9f4b94f6..a2e22e42de 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedFingerV2.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedFingerV2.kt @@ -1,8 +1,8 @@ -package com.simprints.fingerprint.scannermock.simulated.v2 +package com.simprints.fingerprint.infra.scannermock.simulated.v2 import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.models.CaptureFingerprintResult -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedFinger -import com.simprints.fingerprint.scannermock.simulated.tools.byteArrayFromHexString +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedFinger +import com.simprints.fingerprint.infra.scannermock.simulated.tools.byteArrayFromHexString enum class SimulatedFingerV2( val captureFingerprintResult: CaptureFingerprintResult = CaptureFingerprintResult.OK, diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedResponseOutputStream.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedResponseOutputStream.kt similarity index 96% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedResponseOutputStream.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedResponseOutputStream.kt index a365ee235a..487c31e5c6 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedResponseOutputStream.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedResponseOutputStream.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v2 +package com.simprints.fingerprint.infra.scannermock.simulated.v2 import com.simprints.fingerprint.infra.scanner.v2.domain.IncomingMessage import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.MainMessage diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedScannerStateV2.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedScannerStateV2.kt similarity index 92% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedScannerStateV2.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedScannerStateV2.kt index 07d6780cf6..4cd3d3d75f 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedScannerStateV2.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedScannerStateV2.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v2 +package com.simprints.fingerprint.infra.scannermock.simulated.v2 import com.simprints.fingerprint.infra.scanner.v2.domain.Mode import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.models.Dpi @@ -10,7 +10,7 @@ import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.model import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.CypressFirmwareVersion import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.UnifiedVersionInformation import com.simprints.fingerprint.infra.scanner.v2.scanner.Scanner -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedScannerState +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedScannerState class SimulatedScannerStateV2( var mode: Mode = Mode.ROOT, diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedScannerV2.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedScannerV2.kt similarity index 82% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedScannerV2.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedScannerV2.kt index ae6f0e0d9f..007549ac52 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/SimulatedScannerV2.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/SimulatedScannerV2.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v2 +package com.simprints.fingerprint.infra.scannermock.simulated.v2 import android.annotation.SuppressLint import com.simprints.fingerprint.infra.scanner.v2.domain.IncomingMessage @@ -6,12 +6,12 @@ import com.simprints.fingerprint.infra.scanner.v2.domain.OutgoingMessage import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.events.TriggerButtonPressedEvent import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.events.Un20StateChangeEvent import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.models.DigitalValue -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedScanner -import com.simprints.fingerprint.scannermock.simulated.v2.response.SimulatedResponseHelperV2 -import com.simprints.fingerprint.scannermock.simulated.v2.response.SimulatedRootResponseHelper -import com.simprints.fingerprint.scannermock.simulated.v2.response.SimulatedUn20ResponseHelper -import com.simprints.fingerprint.scannermock.simulated.v2.response.SimulatedVeroResponseHelper +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulatedScanner +import com.simprints.fingerprint.infra.scannermock.simulated.v2.response.SimulatedResponseHelperV2 +import com.simprints.fingerprint.infra.scannermock.simulated.v2.response.SimulatedRootResponseHelper +import com.simprints.fingerprint.infra.scannermock.simulated.v2.response.SimulatedUn20ResponseHelper +import com.simprints.fingerprint.infra.scannermock.simulated.v2.response.SimulatedVeroResponseHelper import io.reactivex.Flowable import io.reactivex.rxkotlin.subscribeBy import java.io.OutputStream @@ -34,7 +34,7 @@ class SimulatedScannerV2(simulatedScannerManager: SimulatedScannerManager, .apply { respondToCommands(simulatedCommandInputStream.veroCommands) } @Suppress("unused") - private val simulatedUn20ResponseHelper = SimulatedUn20ResponseHelper(simulatedScannerManager, this) + private val simulatedUn20ResponseHelper = SimulatedUn20ResponseHelper(simulatedScannerManager) .apply { respondToCommands(simulatedCommandInputStream.un20Commands) } override fun handleAppToScannerEvent(bytes: ByteArray, returnStream: OutputStream) { diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedResponseHelperV2.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedResponseHelperV2.kt similarity index 78% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedResponseHelperV2.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedResponseHelperV2.kt index 5e57e65ae2..3782660f4e 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedResponseHelperV2.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedResponseHelperV2.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v2.response +package com.simprints.fingerprint.infra.scannermock.simulated.v2.response import com.simprints.fingerprint.infra.scanner.v2.domain.IncomingMessage import com.simprints.fingerprint.infra.scanner.v2.domain.OutgoingMessage diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedRootResponseHelper.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedRootResponseHelper.kt similarity index 73% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedRootResponseHelper.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedRootResponseHelper.kt index 1233506b5a..b2d750681e 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedRootResponseHelper.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedRootResponseHelper.kt @@ -1,21 +1,24 @@ -package com.simprints.fingerprint.scannermock.simulated.v2.response +package com.simprints.fingerprint.infra.scannermock.simulated.v2.response import com.simprints.fingerprint.infra.scanner.v2.domain.root.RootCommand import com.simprints.fingerprint.infra.scanner.v2.domain.root.RootResponse import com.simprints.fingerprint.infra.scanner.v2.domain.root.commands.EnterCypressOtaModeCommand import com.simprints.fingerprint.infra.scanner.v2.domain.root.commands.EnterMainModeCommand import com.simprints.fingerprint.infra.scanner.v2.domain.root.commands.EnterStmOtaModeCommand +import com.simprints.fingerprint.infra.scanner.v2.domain.root.commands.GetCypressVersionCommand import com.simprints.fingerprint.infra.scanner.v2.domain.root.commands.GetVersionCommand import com.simprints.fingerprint.infra.scanner.v2.domain.root.commands.SetVersionCommand +import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.CypressFirmwareVersion import com.simprints.fingerprint.infra.scanner.v2.domain.root.responses.EnterCypressOtaModeResponse import com.simprints.fingerprint.infra.scanner.v2.domain.root.responses.EnterMainModeResponse import com.simprints.fingerprint.infra.scanner.v2.domain.root.responses.EnterStmOtaModeResponse +import com.simprints.fingerprint.infra.scanner.v2.domain.root.responses.GetCypressVersionResponse import com.simprints.fingerprint.infra.scanner.v2.domain.root.responses.GetVersionResponse import com.simprints.fingerprint.infra.scanner.v2.domain.root.responses.SetVersionResponse -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager -import com.simprints.fingerprint.scannermock.simulated.common.RealisticSpeedBehaviour -import com.simprints.fingerprint.scannermock.simulated.common.SimulationSpeedBehaviour -import com.simprints.fingerprint.scannermock.simulated.v2.SimulatedScannerV2 +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.common.RealisticSpeedBehaviour +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulationSpeedBehaviour +import com.simprints.fingerprint.infra.scannermock.simulated.v2.SimulatedScannerV2 class SimulatedRootResponseHelper(private val simulatedScannerManager: SimulatedScannerManager, private val simulatedScannerV2: SimulatedScannerV2) : SimulatedResponseHelperV2 { @@ -27,6 +30,7 @@ class SimulatedRootResponseHelper(private val simulatedScannerManager: Simulated is EnterStmOtaModeCommand -> EnterStmOtaModeResponse() is GetVersionCommand -> GetVersionResponse(simulatedScannerV2.scannerState.versionInfo) is SetVersionCommand -> SetVersionResponse() + is GetCypressVersionCommand -> GetCypressVersionResponse(CypressFirmwareVersion(1,0,0,0)) else -> throw UnsupportedOperationException("Un-mocked response to $command in SimulatedRootResponseHelper") } diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedUn20ResponseHelper.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedUn20ResponseHelper.kt similarity index 53% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedUn20ResponseHelper.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedUn20ResponseHelper.kt index 9d6c11039b..6f714b33cc 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedUn20ResponseHelper.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedUn20ResponseHelper.kt @@ -1,63 +1,93 @@ -package com.simprints.fingerprint.scannermock.simulated.v2.response +package com.simprints.fingerprint.infra.scannermock.simulated.v2.response + import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.Un20Command import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.Un20Response import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.CaptureFingerprintCommand import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetImageCommand +import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetImageDistortionConfigurationMatrixCommand import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetImageQualityCommand +import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetImageQualityPreviewCommand import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetSupportedImageFormatsCommand import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetSupportedTemplateTypesCommand import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetTemplateCommand import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetUn20ExtendedAppVersionCommand +import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.GetUnprocessedImageCommand +import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.commands.SetScanLedStateCommand import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.models.ImageData import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.models.ImageFormat +import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.models.OperationResultCode import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.models.TemplateData import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.models.TemplateType import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.models.Un20ExtendedAppVersion import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.CaptureFingerprintResponse +import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.GetImageDistortionConfigurationMatrixResponse +import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.GetImageQualityPreviewResponse import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.GetImageQualityResponse import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.GetImageResponse import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.GetSupportedImageFormatsResponse import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.GetSupportedTemplateTypesResponse import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.GetTemplateResponse import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.GetUn20ExtendedAppVersionResponse +import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.un20.responses.SetScanLedStateResponse import com.simprints.fingerprint.infra.scanner.v2.tools.crc.Crc32Calculator -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager -import com.simprints.fingerprint.scannermock.simulated.common.RealisticSpeedBehaviour -import com.simprints.fingerprint.scannermock.simulated.common.SimulationSpeedBehaviour -import com.simprints.fingerprint.scannermock.simulated.v2.SimulatedFingerV2 -import com.simprints.fingerprint.scannermock.simulated.v2.SimulatedScannerV2 -import com.simprints.fingerprint.scannermock.simulated.v2.toV2 -import kotlin.random.Random +import com.simprints.fingerprint.infra.scannermock.R +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.common.RealisticSpeedBehaviour +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulationSpeedBehaviour +import com.simprints.fingerprint.infra.scannermock.simulated.v2.SimulatedFingerV2 +import com.simprints.fingerprint.infra.scannermock.simulated.v2.toV2 -class SimulatedUn20ResponseHelper(private val simulatedScannerManager: SimulatedScannerManager, - private val simulatedScannerV2: SimulatedScannerV2) : SimulatedResponseHelperV2 { +class SimulatedUn20ResponseHelper( + private val simulatedScannerManager: SimulatedScannerManager +) : SimulatedResponseHelperV2 { override fun createResponseToCommand(command: Un20Command): Un20Response { val response = when (command) { - is GetUn20ExtendedAppVersionCommand -> GetUn20ExtendedAppVersionResponse(Un20ExtendedAppVersion("0.E-1.1")) + is GetUn20ExtendedAppVersionCommand -> GetUn20ExtendedAppVersionResponse( + Un20ExtendedAppVersion("0.E-1.1") + ) is CaptureFingerprintCommand -> CaptureFingerprintResponse( simulatedScannerManager.currentMockFinger().toV2() - .also { if (it == SimulatedFingerV2.NO_FINGER) simulatedScannerManager.cycleToNextFinger() } - .captureFingerprintResult + .also { if (it == SimulatedFingerV2.NO_FINGER) simulatedScannerManager.cycleToNextFinger() }.captureFingerprintResult + ) + is GetSupportedTemplateTypesCommand -> GetSupportedTemplateTypesResponse( + setOf( + TemplateType.ISO_19794_2_2011 + ) ) - is GetSupportedTemplateTypesCommand -> GetSupportedTemplateTypesResponse(setOf(TemplateType.ISO_19794_2_2011)) - is GetTemplateCommand -> GetTemplateResponse(command.templateType, - TemplateData( + is GetTemplateCommand -> GetTemplateResponse( + command.templateType, TemplateData( simulatedScannerManager.currentMockFinger().toV2().templateBytes ) ).also { simulatedScannerManager.cycleToNextFinger() } - is GetSupportedImageFormatsCommand -> GetSupportedImageFormatsResponse(setOf(ImageFormat.RAW)) + is GetSupportedImageFormatsCommand -> GetSupportedImageFormatsResponse( + setOf( + ImageFormat.RAW, ImageFormat.WSQ + ) + ) is GetImageCommand -> { - val imageBytes = Random.nextBytes((120000 * (((simulatedScannerV2.scannerState.lastFingerCapturedDpi.value / 100) * 100) / 500f)).toInt()) - GetImageResponse(command.imageFormatData.imageFormat, - ImageData( - imageBytes, - Crc32Calculator().calculateCrc32(imageBytes) + val imageBytes = readFromResources(R.raw.corrected_fingerprint_image) + GetImageResponse( + command.imageFormatData.imageFormat, ImageData( + imageBytes, Crc32Calculator().calculateCrc32(imageBytes) ) ) } - is GetImageQualityCommand -> GetImageQualityResponse(simulatedScannerManager.currentMockFinger().toV2().imageQuality) + is GetImageQualityCommand -> GetImageQualityResponse( + simulatedScannerManager.currentMockFinger().toV2().imageQuality + ) + is SetScanLedStateCommand -> SetScanLedStateResponse(OperationResultCode.OK) + is GetImageQualityPreviewCommand -> GetImageQualityPreviewResponse(70) + is GetImageDistortionConfigurationMatrixCommand -> GetImageDistortionConfigurationMatrixResponse( + readFromResources(R.raw.image_distortion_config) + ) + + is GetUnprocessedImageCommand -> { + val imageBytes = readFromResources(R.raw.raw_image) + GetImageResponse(ImageFormat.WSQ,ImageData(imageBytes,1)) + } + else -> throw UnsupportedOperationException("Unmocked response to $command in SimulatedUn20ResponseHelper") } @@ -75,4 +105,11 @@ class SimulatedUn20ResponseHelper(private val simulatedScannerManager: Simulated return response } + + private fun readFromResources(resId: Int): ByteArray { + simulatedScannerManager.context?.resources?.openRawResource(resId)?.use { inputStream -> + return inputStream.readBytes() + } + return byteArrayOf(0) + } } diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedVeroResponseHelper.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedVeroResponseHelper.kt similarity index 93% rename from fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedVeroResponseHelper.kt rename to fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedVeroResponseHelper.kt index c53c1e876f..1687a2fedf 100644 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v2/response/SimulatedVeroResponseHelper.kt +++ b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/v2/response/SimulatedVeroResponseHelper.kt @@ -1,4 +1,4 @@ -package com.simprints.fingerprint.scannermock.simulated.v2.response +package com.simprints.fingerprint.infra.scannermock.simulated.v2.response import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.VeroCommand import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.VeroResponse @@ -36,10 +36,10 @@ import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.respo import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.responses.SetSmileLedStateResponse import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.responses.SetTriggerButtonActiveResponse import com.simprints.fingerprint.infra.scanner.v2.domain.main.message.vero.responses.SetUn20OnResponse -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager -import com.simprints.fingerprint.scannermock.simulated.common.RealisticSpeedBehaviour -import com.simprints.fingerprint.scannermock.simulated.common.SimulationSpeedBehaviour -import com.simprints.fingerprint.scannermock.simulated.v2.SimulatedScannerV2 +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.common.RealisticSpeedBehaviour +import com.simprints.fingerprint.infra.scannermock.simulated.common.SimulationSpeedBehaviour +import com.simprints.fingerprint.infra.scannermock.simulated.v2.SimulatedScannerV2 class SimulatedVeroResponseHelper(private val simulatedScannerManager: SimulatedScannerManager, private val simulatedScannerV2: SimulatedScannerV2) : SimulatedResponseHelperV2 { diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/SimulationMode.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/SimulationMode.kt deleted file mode 100644 index 45ec2c8570..0000000000 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/SimulationMode.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.simprints.fingerprint.scannermock.simulated - -enum class SimulationMode { - V1, V2 -} diff --git a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedScannerStateV1.kt b/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedScannerStateV1.kt deleted file mode 100644 index 2af1e8850d..0000000000 --- a/fingerprint/infra/scannermock/src/main/java/com/simprints/fingerprint/scannermock/simulated/v1/SimulatedScannerStateV1.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.simprints.fingerprint.scannermock.simulated.v1 - -import com.simprints.fingerprint.scannermock.simulated.common.SimulatedScannerState - -class SimulatedScannerStateV1(var isUn20On: Boolean = false) : SimulatedScannerState() diff --git a/fingerprint/infra/scannermock/src/main/res/raw/corrected_fingerprint_image.wsq b/fingerprint/infra/scannermock/src/main/res/raw/corrected_fingerprint_image.wsq new file mode 100644 index 0000000000000000000000000000000000000000..5af8051729de6d79c47f44476d6df6fb24190ced GIT binary patch literal 7292 zcmZ{GcTm&8+I9Ga5(9){#6Sok6ai_Wg$@crP>~ioiiA*=CPh$+(vcQWnkc=C(yM?{ zBs6IPN-s(i5Tti_z4!k6eb3D9?AhnpGP`Hyob$}{LeNv4n*_uA>biHh<)L~vP4AoB zykV%tEh!`SU!S`rFWBC28)Gi>kUWb zb#}IO@jTB3DO{ifU635&?*&0;x7kyvpw~AxQ>o}<1#Egj^m9*gq(B$M&W%A-&_k&q zDJuG{a7-!)dc}KO>O7As6aa|;>~8_C#{Wl;{0Lw)!7~;BM;~~L3P3>tPHTXN3E*S~ zFz*3mAb_C)INAYjZt(I0067mn@dmiG0pt*Xu>p|30E{<)S_F9K0M226Cj~(H0=!lL ziUr`A15m{PZz{kg0`SQIs49Rr7vPct_*4K?5x|=apvQqL@&IZb;9UXG5di-WfNKii zhXP!u06!Ms(gFA^0q$Wyzy?6K0#`Tz3>_el4RGxO{8s?XDInMdpjrUlY5=7S@Uj71 zs{lX8fA{$ga9siT!~oP^fcFo;Eel*J0#K&_?}=mda&0pNZM2=D+r2te>R zfaU`DO#t*?;EEx@V+;sM1Kdr3z%76$4G@Y1keLAH3c!yCL>d9k8vte%5a0vE4geGz zz_SFP!~kAu;A$x#B@c*n05XlB|4*D}gIGZ4RC-hZpzTks*z&LJJRf8X0s&M2n3{%` zjt<5|^>4DWnyR7(D6a*V)zwpfC@K9&^S+_6i9$6wS?%YcrGr!XUmaZMp#II1(l?);sdg;;tg`>vuH4E{?J4#@ z2dyq0{7arZTdzI`J?r^5X8Luan(VsCFDA%2Elvnvd3$sZw+|VaH+yL(CmvAuUQeu4 zw_tT-tb$#kNifOTEf&pEZ)44@7T=Fz&2ui&u0cQXhfMv|94DcUM+_~&Sq(a{U8&-b z5x$1+HN>;|ru&mC#-yM#xZ%~zCq{YtLY9G%3B;{39c^$_YNF(L9rVo{ot>OjQeu2- z&zqGW5rzeCrJgd>nY@au$@|)>T=Io6A<3&4Sx;#Epn#>WIbfL;wL7#OH+arqSR=IC+i zjS52|;T$~~UlIUN4?QmzF{J0rIq zepas6Ev?z^k69Oe_zYEC-96nilSWU`RfRvOi;=43!}TM(2St)UD~QP$xBIRJcs@vA znDFgxXfBer-LRB=B9R!hN#UBU1lnUSKk5%l6 zh77(AsJK$eBC>8{q&?X<36F5MRt38bwc^mXB~f) z*rs~d5aHGBnQg_HiKC|n$4?JD%=(LG_Fpa%H;LvXgHJHhJ*HrGy~0DlsN5<=x zkR;kL^jyCshAxqo)>4?7zf6z?BNC1?lqj^){yAkql+yUwrQedHC$2DPDpp5&m)JBV ziwxA8p*DVp;LouTDV^@HpYKTwLxVMCeA`EJDNeBS&sJ0HrA=e_!c z=y}LNG|rI{{QZ!PFH`JDSn=!Esn`$1%ao%*LApB|QqZQrs#;U+<-**|7iARqH%r$G zWoOOL%$;B6%*&D@(V=*!xv;*zc=Aiq?Mb~yB#vmT-1~cmT9SWnd0mRC6xLwPGy3EB zzG6bL{d?6$gOtuMQJ=@MA$E4vP@&B)!&9MOSEKu+K3E!8n(S>-s{2bXznw5&8v0== zzq^#iKV4GYdhn}5MgHfHy%eUVB(=^R?z?5Rv)y0Cl9ZXRKA7F2KEp$+X- z(<%9a2|rjDv$^3euL~RXxEGwHAL$S!!7<~{d-WV#<_s3()^B@?b|`IOq#k{RY`-ZU z3$6ARHv^4v_?Y<`ef+$w3U=Qr=rLK`{5Mya=KfiyJ7ThnN+3q{uXshuR z&p`M8m{5^2AOHC2&62S8>WuTr$$b-FkD_}~$-5(uTD)f3@7d#JdM)>(SKoUSrREb% zGQh%w{@{druC#UbLxv-i?RSZC{T9iM*B-1$JA4;22#dfCXXSc-FE+jv;&!*E(YB0R z&Cc+{PB)mtL*`6(Hrb#*-r}vpaj8rA0q?ldVo!B9v>-@fx%msr^*L zu@)`m6n~7k*X{}%cD69=0<|)&F_MR^u%};5b}fP~Y$96oJTdey!0V!z=gll`bB%nc z_%?{AcFm1ZO=`dN7pRo+wUi-*QGK@FWG7|8s^8Ce{=G$H2yAyK>|X5!y&;+Q#)p?? z0uql|>88J5u~a=TsG58ZOy zG35_sQW4MoNwNpk|0EeqN5^=HmFa(y{2z&~p{0XVT!7LuFv6HvST8ceFC!ewYcH{J zaH6=-7#?0>nFs9LeEe4g1ck1Oh>Bq)rKA-URn%@E#U*gEa!S{(t83lSF)+3+tCLsO z(8S-obz56kpI~HS^&h>aI=ej?dq(~od^?*?N%rX<MePp85@p45ZiGF+_C*Ux81e z!$bbUAAPl#$n88~V{YwpBC)313vXyK@b-;!n5N9zOAkm7-1$dC_z=o!1e=+K7%;D4 z(Q2*Nd6*E?I^i}OFtRqM&=`qiu@{gsTrbiz->;%jVmvl(J&}*WI)|_(m{O>*zdxAO zQKaL7dYL;gcN2>p(V_HIvGv5FVvLNvpgx;$h&hSc{e=wO35O4h(`eA_6wg>jh^7dR zBy-uYg_6b$*;?b5SjfMC7^U!<3sJc-M_NVoN`I4pIvVhTwcXVuBJ~~e;4NWn%%@Af zvv1=`^)#W%0N-OT7>V8~+ffEQjh`!&_;6B=ICwDV_dl5?B+04-1p9D-3;@%*bYj7()`xF`y7aikjd; z%*C__c59M;0r+~n9(2L5()N>83jm`>uPQ<1@JDkD4`W>DAQB-85)5T? zxlT1{ua4r^1zDytF_Q!AH>}zk1#qK*2!aNm;V1JO`^_;`YKN7^1SrO~?xIaOk~XP6 zpCh$E2f<=hMW5dd?8*n)$jf6tM(wROW|6NI8J~KmEgU>7EKR~b*Y!DXL1U{ zTVH`%Du5_N)k2I|ttp>q2j(`Eh>D`^+_fqde&@yXS8E4hR>8+R#$#Y+)vD;=Fme@} zTA741;JuKoa^%_SQGQ3ENi&Q#JDy8Zwx=&=qar!YLv=htsZ3nkYP%>)K)i7gO(hzY zxfJgyEPW!~I`i8veXloKT%FHq)-fxr_XPyOOD|YP3_+z{`0Cy|njn$)HUVcD1~03r z(r0#lK35Z=W6a`^52wCO=Z;k^Tw^JCEcCNg%+$%rATTgH9q9=#i`=`DthYo*%OMg% zMEUVnJcwq_G;OYlXdU9?Wr#0>*n;NGMFNk}DN2yR!QfDZTx;B*w&V@V#V{7D1Or7{ z1Z6U=<`o0R$!Rpliv!WZO_>aR?;E%z6n;?pWxY(HjyOQ{doNX}`NoZn{yLY@d|=;r zKDB&)52UKyOTM2E=cAni`QKoX7-u*o;+1g{Wgxqocmr`g|EmxjTOPyK2!Cb)TlAorC7Lhyk?yWw zDUq;6uAPZD`=bUA9GV`mWT%^ssZ|<|$sk%IT3JYa3}J;vAy=zmaa3zK>o z*KFaW`7nvuQzJ}U>1_C~G{>^wi&m?LI?zRN5u_t^xR70eQm=6RCA(L%z1Q!DzyWE_ z=17X1b(Rh7^AVbOJpr*GDc!5}Gz+OZ_Iv|)yOGdK@7z4#qOtE!mv@=l%AX3SxX5G` zSiPvg;jZzvhB&<)J$`NQ86vmwWy4N9?QH|ZfiqFxhM9&RAXw@dphuJIez-!jWa^@S*UMxS^EH4Th%Ciq2rfjv0eBg);fg>`Qp0&M7lDg06 z==F6;pN`=`<$&hW24vtFFH@wt$ZhU*tVrku4rceuy~-D1g*9>*`Ru;fMMN4DYZem5 zKuru?nV>4G>e9K_3F3Tv`d*R0R4>G)&>YS%FE|1ac-LY%pN(m25fU>GTLr%>R}(jXei`OPPkHBg)}x4Nu_Rwp1(k6 z9g)Qlt2H!e)IEq841L}n#UYg)iPikV-NgLZ(X<3YF!yq~tgsk+F)oMZV)|p}Xs|su zzFh0`Pp@0flesZhEF5Y@m61g13OUi|xCsOexDx8nMX!x>BX;S6of#j}lpxrJ3K-Mg ziWf0$3)Q-RXPL^5lymfjcnOZh;C8&N^fjt%NE!mLZWBJDT1(!Hw$`^dDT>c0|2YFx zo7k)f&kvmWpq*){aU$idbb^}FLau3J7$;f!zBF@anFuQ-Vos~Z03K`}j5p@J2p$yj zc5?jSUtmo?O~H-^YQSzeV8@9i&RrS^Hz({=3=kJ8M-@fMK|CD(5;9o+4r6}rj*cV! zrKQ_StD7^RMw@7)eSnU@iHKykcj7oBTkY=RY?8?Fl%d*ArzuRfT z@kDAFo!{k2w3MD(1n4bmwKsBtwKUiYgkS-Kt0CN?QfodK_Si}5`dH5Mur-EIV#05iv}|H?7IdI;s(?#9 zYkIUwrHIhkP~jPAaBLI((1ioLry_}pjgekByvs#VRmmE8(V)S}yvL;8wKmu?(AM%` z0lVu|MP^J(RY3J?l4&Ec9WYoa(?3tn*(eZnY;HPOcLavCathGMJCh&%Jd~3uw{aZB z8F1-n^5GO-%RRg|hp4(X77N=YzqUp228D5H)8Ym<+3IM*3Bf@)e5V_(!%e%!n@gN( zvMt9B>Nbv|8||Q~Pr$Z?R^vq5@NY)KSfz<`3vFCG%@nrzi1h}R$#tR8+28LOVW{+A z$A&ta9DZy~dTP%|)yiD#Z|5sZBzN|wa;DMPw#MAneVmiQQhM)ehgNUw2z=~iBxWFY zv@JZ_s>{)(w@M=hrn7}}A2 zgtd_>2oxIM|fenpSMTp@j}(mqhJQ|>A3Hdc=S#I$F_ zr3uV6aJ<;H9$R=TqZ}!wLF}L|K*SK)6VR34k6kK6+4tiJH%Y!VE?ZPJ$}9&OWtDo=E;E0^Xo61 z#jvLD&19|f97vpbSc?|?#I6TiY;LPRbygG~Rg?2C*p?${_Vs0LVYhsHoC88(g5RJqn+N!iLMrEgUK&DA~l?a4IJT{t^>m zNL79xg5bnJ^QO)iMS9UXXtRefFDom5W*QREn_!cRRr)39L^M-Km+K4f2kgHtoXam1xR^+*^^hcQ4R9n-pGjF z&0yJsd-WuGaYq-A&v?J0>dIqos91z5*!Z>6Q92mCh5 z&O}Rk299Rp6yo;cef*dTGXpy8i|H-NC-=?IVE(!@M5vDf@{{wMIt3A|s@zdDs&ywo zO@~D%)OK+X8iv0k)dyQIh@d4qt zO1O2DYHr&w&JyhyUg^?LXx~t38}{}HX<5PU-WMnu4TT?;Mzo3b8ILQaf5i+;3U=K= z%}q`W^dyCs|Dl(Y)KJpWU;Gri_{C2<9fk&tlHaubpD|6eL&?Cu}w!eGwh2)_hDKx4FU>j6&@fznl>M` z&1W~|lvid<8?|-bR*F_(z#i5;cB{9V&1Y$IrI@vV+t)0D#eI{eOPIdEC0ZJsaDF-n zBC*WLwsODj+2C0B-v%+*cKJRvTlmMF4OPc~jF^H2)UG~rJPog(B7c-#S03J2lauTi z_p>iN?Rb9<>RR`BhFSMl**q<+Ki$8Met*`nr}E?9mmZ}Nrr^irXb=6tQ}RcNeQTAW zQ>Hq`+*1wJJ?FFi?F^Q~SjIl+GYK0drraPxIYaEy&&!=heNO(aS(+VB>UDqd>R5&`u}y^+O|N+)u!M%; zZ66X>2^XgdnLwhEXdBxS>Z%Oti|x^UGW|>{v8}w`l@{R>AMG|jHMN|ud$D+NhoKR* zzIg8q6TZBy=95%b`N;B)Uq7fPxw-Wq>6Er(^lAFykX`&CY~Q|quE*8B>5w!1_UxBs zt6i?_{**&?lDNq)AJ+wNfKJru zf7Gzzqm(hLdd-Iu9dYQjhtAz&(?6Ons6N!?-AclDhUv;~srH?gaK3ileXV4<>9_dZlZwdmtp5XDaY6(D literal 0 HcmV?d00001 diff --git a/fingerprint/infra/scannermock/src/main/res/raw/image_distortion_config.raw b/fingerprint/infra/scannermock/src/main/res/raw/image_distortion_config.raw new file mode 100644 index 0000000000000000000000000000000000000000..b1eab19b95823337ca71699beac82189eb66c83f GIT binary patch literal 24610 zcmeHvXV_j<(e>=TPXb7hDsH5U2+}vAG-*oRAiW8Sph!`qH|e6}3z7s#NH9eb5=bEl zrjTL^DWpIeDWp(BFQJAmg7B_2bI!T%C*}Iy>$|S+ALsHN?&mz`K4(2Mv)8Pdecp(C ztJOx*Puk1C;>_SAd6DmnILXII!jD(*vvgBCNs>rjMw>QpwEL(%TWwplL)AX5Hh5mM zliHKi-k|mYwX@ZJLYub=c$OSa8!x6!UDQ5Gn_mw^wO#=m_o7W_(&j%GDM;*JNFeO^ zZAm+b!2X<{;}w#>P2{wbd0yUByP@Ofebt_$_IBC`ucL64mN7cR-Qk1xEk)xy^sy(B?nRE+3=YB=pOaMObCbFX> z*kkqcRT6iT*h6GDNsp<0i)YeCj%W5$`y1N)Hz&J`45N+DxU{<>huzuZ43WcLul4~w zGfO{z>@&`98F9xw4Q zNmomT{RcniDH0DCd0X<~5;t~oxTO8n{+1TV(-9Jf(Zc7n@Hyll&`5Q)%=-r1+KMSvU@ z$YJ|0u@pF8UR@N*Mp0yioI;9|n>x+1n$o*>9Vqzoo zas|93=}M97M6Q(FOA^v%y2Ps_y(jT%k#9MKBOTxbK{?l@Yb3UFa*d=%)IQ5Ix$p^p zIFMgUp9}2uYJ2OM8EQY&Gv5jLZ9F9KTNei2=PrIuqe8}=pAQ*NXa(H zlK(^-d(z6z=0yCNWMez4I=F%_LkIMPTZVv|*xt-)5MQSH$UCH-j6%cAX9bpx@N#p_kFFqi7hU5n&ejur@ zNOZ92AQ$_IobN!Zse_aLA|q(ib1uQQ^7zbb86XkJ2S@^P*xp`XpP-HJ^Nhs6D-WVg z=Y`l`V*8N#Nq&SjJ{w|R$-c;V?v6!#P|~rqa%BNj(zVEaB&{#;Um|-+9wTyw#IYi` zh>R6{C61FgOVW6ek0d@S@*O9SN@#rFtlXO{; zf$iP`IMarb=Zfqtah^mh&-oH>mAF9Yil;>8NLncJvE)S}o4d3~@=sk{Eb&4oOGNIX zO(R`?T4X6Le4b!|92Ur7|D?8;=WieP0=r!8w*t<@pMzy{;9y0DZBqZE_aS%M~ z%MkJ0?TQQxM->rxE-8rZo+8bcw27oQB<;&WNxFDTfmlA}B9$#& zTrTo6mzRSLoV+h`H*Fr}(g#>mj!D(p3+&E5e<%XvA1ZR#UOs+^_0Hes_w<@g05CxmO4_E#?|_zR<)R|JCHZbz7P7A-{{(g4$vG&g zF1C>zTpk1mI>DdT+R0}iPbXWsyrz@GoUG~6A6#6^Nk=E&a5CD(Z@Bcl%do9|THDDk zUeIqaW&gzf1w>@=Q_?|OVIZyaFLz5(BgX9ro!h(|j4EA)Vq?IfQGPl8xnx=7Ml zF5NBZY$qeJa9n&=;%{7bE}iS-`wj&Ne@Hyf$)yO8lP)fv@A5b&7r6M616AfVe7?{{ zAit2vK|$#no=N}E&yRV*Z0 z#zi{E<$VgEioY!KS&mxwEGIiiyv(JeA#$(c^|;dI z8=SxuH#)i8#haYm>(b3m#<_g6OD{XQ1&i0mTj=u)d!ok~AWyJ8^vq=a?HfE3*A4hq z-ZMnp;k1Ce#T!Dp(WUzXo|2{qx!$F>L%z<%4GJL1KPu8SF8-p(SGjy6EmUG^i!^`+ z03Jz@B3)S4LHO}btUJkfx!lTS(8v#5!je4JC8Rh0Or*-+UFzawJS~vtdx;!2?dthQ z0r|ZyU*jWe585=zC)n3%<2nJ~%6o*2JDd`5w|HH^om0<%r=%$%b#(DfCl%NT!n|kHl({G#Zf= z&_$XkX`G9%N*+(5mI+QkK@(j(5x0eCbZN3n-CTam#R+hclUG3qCyQJ<$)&~c zq{~b2H-dcdH#)Qx@l}_f!QbfRSr>Qpkn8k0?A1QPcGEMD`i$Sc;&FXmGw@qGLj$;U ze2^tBUm0Yv%YP3EPeEt2&?Tt!r<}Axt#@h1BF%GhOc9?1vlV#`2wBpL;3Yw#rkfJs$r>n@_FSmw}yrZLY&pvgeg+1b%C$5OIfNgWztLqt;`|1U_X<;1iz@f~Wf;Epu`E0;uwl z1rX+o3PE!2FZmP4*5ltU-zxIC6G+PcI(b~umyS|Fd|clp=Q9dZ@bNS!5aHK3iYqLT z);=Q8D4qCYQHIv`0%F|FlVsrYHGR6uC)lpEaXhWOF|^h0Z)ue0-m0~2nk5GDu5~;Qsni0Jhw>S z^zu{5Tl@Sw$=~(TR?_#p43zkNFS8}@NKq$0@M#k#Xy;M%QDV-}GzRhR=0Qh!cP_WI zhfi;~gbBzx9-@uNlg~iDrxzfH{kz9+^H|#Sf?g8>zqLI&eV>jBg1e!Q#saxBumnS; zqYYme(hq$8EF>V=yhuQGU=e}voIE~Cxs_;fgt!{!rwKElhDYVY+KXU6DnmwI05 zgWy}=3xYcw5qP)X2j01Tz*EwYAP0LW#(bbppM-P(rb0yos{M)#gug1{J{TK`9O?5# zXgWOG%%6K1Dsr5c1(HtiQ09=?Il6eVkNcx!c$VE$wIH76b03hBPt#obg~vjUXZX0T zmoqR<@p2|4ichdt`Urck+A(_mIRp-4uE1}7msT)!!F?_Wa+;UFg^Z^R4(Vi{=7xBZ zmk*(EylhhB<9yt^076#MW4!zvlM0_NL0jSFZpr6(c|_#59xX}yorf}y=X>;V`2x?b z|3aUB4RP+}RwoyE6s+_|AE(o1kif-0t?T0@7z%lT1#;Lc^>Y{f{4cf7BBinJXl2_V zfAr~RA>wZ51^I(#fAM=S4+TDPcHq;OhXf=W773{KDg+2mE#z$6U*e^nv&1XBbQY%N zC=nDsG+BT0^10;eJjA(R$aWAEi--7;n|%I@OSgDIk-f#|$6frhPj9(&E0O2FC~{aJ zhrL42bn$}EqxH-)o>zY9`K_%(#2pR^xKBJc$jx5b1U>~?_XeM41P(pk320B`o6s#@ zFf{_g6N?0gpnCq*V}v4YeEhpeTc6NM{|$u$;}jpil-R+`)|gKCbcmC?y+FKm^yxOV z6&|Ho?(yjfC!Ku){Q};49yabyi#$*F5;-j{fF0!%oc}bfeBm=rZW%J}aB$$=eiL}- zzXm)dJs9#`UZ#hPr@t9eJD)JAyTi+_MZDe1u|;m{1=SPx{F9J!yNmSjG7d_{%kv^= z!Ng^>?Pz)WcyyrhfQQ`85Bk&w6AX9;6AX9;s)oq(03wGaT|A^dhrPl_*v?1*FC+E0 zOE9%SH1TziWZ)eR41&9%r^B8995SBLC-8|=gWT^E)JrcfYZU@iKPVvH9pxd;BZB^a(8K`%ik(k0(Ome1 z!Z!{v^%11KyU*hlIV_S87LJ7-3AgyP*z?N&_=sxS>Lc-Hu40$SiSjZHQ35HDea%d5O6V-Dr zmJjrm=VWO={!N}TU;3ltoC>B}fWf`=VPv2mxE;~VGf%#o} z&tqPJQ4bmr4%r~BKY#k$sK*f8K!FxxC>W)>~Xzp5-4EMN8@g%2Em=LhSm!4-Vnd?8FSq)eOeOazo;xB ze~#=b;%7eZR}kk#B5MQ;Z_`?6Pei^E@@$cHLd0-sy&&tk^v#fWLo>*hJZ%`##T=EO zy^@VX`lpMV5PAL}M41CHxA#V_KA2TquIE_QxE{L*FKp z=DnZ{A$~C23m9(1!`Pm4LvWbON8m4Y@ksoo7}|uqq0f-4iNY0mE=PrYDbJuFMw}VK zGXg5ZmCHT9wSI`W10dmU#|CV8W$Z8>iqZ-77@)iIPXp8o(f0flv~oeNbotbPxm-Lg$Riw;T*}kEd`fERRKt7A;=91jo})KmAPOz)w86WXa-1i*O~ruwefD`Sa#JIcN5) znKNh1c;fNt)22?HGI{dkNs}f`oH${^gz@9XjU6+3)QAzohYcGxbm)+WA09kt(4c_> z2lVgXuP-i|JY~w%>C+!4qM5U1&6@q>lYj(FgrsnQ1W**q5{2@t9nUomo=}Vgw;0eA z+kyr2=K|QA*$VA(AOkdFtALFiGiuaG02@Ah*bv|%uz>>x^zSzXkfy1l43c_@kmk>) zj}|U0@tAAy?B||ax^(IDO~(r_*bg`jl!mUv2B!hoym^3Tz@C85N~aOn`0?Y$!eOPy zh632&!RoFlQxQBks*K$n^AjM!Pk;m`S+EpO1?UAFFSa~z2H*@Cu)%MLDIB~=fz6-y zBw|TqGgbi%fmDwnk^sgq!lOhrL&JxJ0xISc9fkZbM=@%2l7ea=da3Ck#AaaXGI&g3 z(P4EYnPVEtDN_*0%3VZ-3~PZ3IW!ZhIOggWywXJ08yy7TI4(^!ct37VI>YOv)v+CqpE$y_&r@F6;QoMSFHf) zRUSlE!ctt8_?BHHiZX~Lsu@qTKsA2cil|6d3}Mq6RHkY~uugSD)dG_uDoq1ele>^z z%z2=CYC)Y^mhd%kfgXrT^QxrN$>jBE(^p1?HE7vxsjhiNUlCOqvt~@@uF7FpkK_rX zFI|bvsLF(|=yU~C%q!G@DVFbAYm6CMtifslGTB?8DnY&W+H3a7uv*qDOBky@Q}P4z zyfy9m{*fnnl-alMx`veVzyTiEIsvVGb$!Mey=N$-a-vp4JxCo7O0x@ zY7$_TMTbP%>?>BB#mZMTGn8x4VpZa5^3`fk!C4K;YEaI#Jhe1O!v0Ex=Deeoi&XeF3UE~_G~N;6YkWeidsTD1RIz(NowsZL&zG z@Kqceg_>}9C?{C>j20ACi#iAu4_dHPuhlz2RjE#eJZ8)o0HeDm)f9o6*n%QV{xyip zG>u}@ECUuhfQQ;onW}UY!dEL9Z7rBo&Ed18s?-8xJG+U|qeqV!I~K4S?jp|vRzm@n zmAcNZCZS9mjYAPBB~V>a#%O6)#h@a&PO8Zjt0UDRkEyIo@4-?1`t}_;Y7}5qId42~ z5~9gnrs1{Cp;|84%X$h!QsY73to$){%=3ys=gozTSw;9vEm%@%gVVQf-#)`fj2KB= zs{&TBM7bU-`l95b=2FI2F%Kk)MLh&K#A9A6IbG{=twPJyw}RNS?xtVgK7D%k9yWaV z2)e5&yXsyHETM6H65V0l^}u6F70iBvM&4J9G!01RC6nw`x5{R9+Ej$ECeLQM&OGl6 zOuc#y9X4$ENO)^C?t;95K-I>_I>cJeo5uj6<)Kc}mWu)um{cfKc~1Q@bqdIHymf+2 z|IqrGhBAyM;ve_>L=irEh?y!eZ6*q)#_tA zzcP7h_qCDe8sIT6)tcD)8iiCl$~x0h z5*s1(?E^>k=+V8~;D;XuET9^JIM&%!m+ZQ&hQ}(dsN4MpG<8jd2QFgZ3{s=3vFQgJ zd2>`VpEG#sD1hqTy<68og9bObtIV#FRO_@iRbKAd zF?Lq?SdN=As&rII2+VVU>ej7m*8u|t4jNnoE7QKg_8g9sg9u7!)%Nh2tpE;gh^{>F zgTetG1*C%*OrK1nqkpdzf;KcQN(|Q?vYd|U(xpr10fYsAA&v~BrG10GP=+dxu{%>m zp+2K%twu@;hwdSs5)mQk+)BBimYwWpbk<=d#yAQ~PeC!Gx^)GpPW=h1au>KuS)xH- zRf3h%Bm-tMC3Tr$Q!s`{Coka31|;TF<)}KNZ2V#hq0FdWJ(*EmyL9f{sZ+mx{Q#`V zT_v!(YMWR!k8yf~D%ph1{Dy^K$E*?$GO3<%P_k50j+zY`qbepjqgOksW5+x1MAhln zzkkDBHA@hdmZ1q+xK*#3$C_~2bP!m|LtTV815!CYGdEG)>Bw=+Xe_-IGYX&-l{pHi zI`r<-r|;_AH5RZaa#rUqP5&AgKHvZ(E;;M0%7#J5ptkfZ&!G?MVWXB9%X6UW)Cr#I z(7so%UcFc2uCfd%F!E~ct}2ciNiNJ14e{`335n9YghWR*M2j*fqi5mMjDn-uw{O>u zs2c84iqINlX^$YT!d*x&<`)ypfYCt>NEW*?#X*{kT{-_O!>41$0mhsaAuxREsCMmc zzr815HBi+Q!JKatN9#C@B|u+9rLYv2K~hkJieG^-HFlQeimIAWsXVX4M?z3kB_VX` z*r7xF+i!2%wnvX1J$v`=(;|oz-jHf_2C6@s`bRD`uMDw2J(yDW~tRXa)viVRgv)f?ffW{gB- zG*#z$9X_DCty}l*fTgLmB0s1|UCCEkf|`7_GAf2o31QW!OrNiW3aby{LsGSAbK7lQ zyLIc{ldwvDXw<|?bX5^-EW;{-jkU-S*1jrHX~Vz;*p%wm624L>gp_w;p$LX?Xv}FwGXJ;WBIiOsQ(qJ zl1Oz8QbO=(CI?G)bC)hb%lE4IRjh84&(c?`LxrST5!Fg%x-2>qQKXecO+T!H7K|QR z0Ap@dU07ErM16QIn|?%vTLmbzT`NN}869k17WiXw_O(IuVHxyIDn60#kl4 zR1I!#Og^=9sF`84sQMt=u?CGrn`C^;a>K}#xl|*n3Uj3vj82(fl}v9`9PS2Ee=1*r z8K|mMz^v#iWrm)l_x}9{45D0C@wX}suaMvi^AONf`UTPy2Y*tCtcu9}=0Shc?4=Y8 z);?6ItlBW!ErJccGE_r`45jwdMhxo1WQ?X05*!OoeN-YcG?nnHkhN5y4JAV^wUI(| z!m~6pv6`9T)?2%SMZxU|AhaK8p-!r*(AXr<9HnkjCmAA&P%2|RRFTqY7R+XMnd;NJ zV?i8j39oe!de1aW#aBSZilcQ^j=wUh^kC=6<0MUkk1uV<)y|np58G)bth;a2vC7p^HsI+ls3pO zN-b@1ApM4#yUNJ|`v@#UN)c4FQ@*Lt)xa$Hi0*sD@=~X$*m?4U?*5DufU78HCUBymAyW9QlovR?mxc z#-QT`8+Vwsc>{(GoHMilMxLO%7)91<+mwg9z+0R*R=L%=b0-U8TW0zSIc3a=rN?z= z8Qys50*G|v0VJ5i)Kj9yPzK-t%%&ffU|5niVAsNE?gGtYyazgE>8W6qWd~7IP8c`{ zy)%0*kf%C|g}BCmF?`5fXZ3lb9(4ljUa&!!=e_zG{35OT2pcjQ=5)?!wrL9w@b>P5t8D0y*ls{pf&bV;V|6@;NC=) zUx=fzgpmY>My3OiTO=+75vhfl3Ml~f?!m!ZHE|hlaV3(@!JN&GVv^6EV@a+V&bKTK5~9XX z86Kipwrts(O$UB_$>%^-Rz2Os zv5Z3WETJ^NnM}xSdI>&hKzgfj5Fc=<$CzW-x&&KrKL`FQU$h`gD5-)|HRl;bDlUa( zE3vCe^wDFGQ%0P&vxKFm9JLVPD>F*pkkMo+F{z(wL~rxJPsCNai`$pnyX1z2!ote~ zwsivTQtDz5Z6#LK2SG$l?51t|*m0KUT41=_RdSSWIx~Fb`xSJQx~U2rU?`lo-+o6A z1E%hJotbahRc1ZhRqtFf=RpxV<>pF+yRf$lI_=Y&BU_GM=qd0yn6us)q^BxEAU!q0 zM^u(eB_zXBp@P20^K6%|)v-`<=&a2#Ywg}P^; ztm=`bl%?pYGJKVsl4@##@Efawp=plY6#t7d` z>?JkrgOjG7eGZP&tz2+86P@esO@ys-5iz~@-g^cOsNP;Nwe(FMCYPl=f{48)mc{AQ zOxu(-(Nat0R!?qrA=9Z4fXZqyh2~QwpFg*>c2te(O(atV>Ky|GTn5ZwRSB>Bpec_a zVkH{SgXU2c%Y;X2DJ;}P3L9h=G9IIKrn)7S);(&?7U9#ko9HP`brO`JGWXC?_3`ez zbr75Qf!;FSGMcyIQ`W>v*;s06414#+*pr-qa*U*6F;+)emEq#k@F^q>-!deWg-XcjxRDDSbjZ{bNo4>#W zClej3ujF$pdvBC$Pcf|m6rd4TwGtUbR3Fti#-^6=hRRZ_6!RsjO362vs+OIGij=whM^u_tC6`vqu&jq*QuY~5)sV|j zyVt6D)w+Xq*b-G$XbhDV8jGNnzXmD5D?BujYLDRrQE8oivsuy@Wi@BJM$k}|)v&5N z7<%_tm0m@Vjk=bltLR4A+zK}BZhEYXdy$nOmzE&B{zgK(9;c4)5>)G~g2-BW`c zunwtTN~utZPnJK8p!sSgR3$I8pihHWhEJV zs-pp{$|#1fp-5F?J+Bp~5;Gi)ut4)|(c1*2S}#D;SItRP?Ofm;NMi;jR^67O4ys&VsfjRPhO2_q;=kJ9VCj|QN!4CS zD{XUZPJ^U^V6dSBl8ViJO$$xj&KT;fLtkpL%%ZdE)GA9MYhhV>Od$hB<3KLyK~UNc zYAeBfB2QI44u)-WO(BD-AlzGyCD9iSwuu%e>Ku2}oYfRW+_7vAMI-Z$RO^pyf?DN>3SiN zVdZ?Un#SmSkBw@nYJkfoS2o-$6OGB%fTT^9wSSi4Hjd#tVu&3w3XYng!q^;D?pD~e zNR<^Qx7Y{cB%98{N^Cg`wW&I$)YYhgnQzFd!6O~SgAUXQq`ttatuos`$YEp67Sng@ z<;e)PCoo#ud7Jpz$PW`zZrUJ<#HAE5-M9;-x@=b|Z6Hn6W6XXY3Qt|ffW5%5(LJ+Am9W$yT1Z$aX?!jJO`%?@Vx^?Sn^DEtuulS?h!^F)mx%?G`U}aS;*+0>fpf9Vps3xXp-B~n`|Qw>*DLz8|sYGZKh7!75FC) zS9g4+#~1kjMK4;dvF2K9ue0tq*WX~HjW^l!+wnV_Z@Jah+kW?Z+wZXB4|d*Vx82j8 zd;MtdefHb`fCCRca@y%&OYb2=bm@|g@3r{;!7^O z{K~7Yx%Rs2Z@lT2TmN!fo3^*#(XPXtcX#a6xy#?XcJFat&-;7#dC)d-{)v(8Bjv^t z^8T@MmQ~8rYGkB6D+V)ET9`Gw^Ddf+_dodXqmMrRs1^)kKf}e@0}C*>Z|F}3jeU=S>}ze?bjao+5=yE;A;%1&F-0x_ literal 0 HcmV?d00001 diff --git a/fingerprint/infra/scannermock/src/main/res/raw/raw_image.bin b/fingerprint/infra/scannermock/src/main/res/raw/raw_image.bin new file mode 100644 index 0000000000000000000000000000000000000000..cefd71ebfa07a9cce9a499f73b9fb79244e11a75 GIT binary patch literal 36938 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 literal 0 HcmV?d00001 diff --git a/fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/scannermock/ByteArrayUtilsTest.kt b/fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/infra/scannermock/ByteArrayUtilsTest.kt similarity index 78% rename from fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/scannermock/ByteArrayUtilsTest.kt rename to fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/infra/scannermock/ByteArrayUtilsTest.kt index bdc1c739f4..70e03d47bf 100644 --- a/fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/scannermock/ByteArrayUtilsTest.kt +++ b/fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/infra/scannermock/ByteArrayUtilsTest.kt @@ -1,7 +1,7 @@ -package com.simprints.fingerprint.scannermock +package com.simprints.fingerprint.infra.scannermock import com.simprints.fingerprint.infra.scanner.v1.Message -import com.simprints.fingerprint.scannermock.simulated.tools.hexStringToByteArray +import com.simprints.fingerprint.infra.scannermock.simulated.tools.hexStringToByteArray import org.junit.Assert.assertEquals import org.junit.Test import java.nio.ByteBuffer diff --git a/fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/scannermock/OutgoingMessagesToScannerTest.kt b/fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/infra/scannermock/OutgoingMessagesToScannerTest.kt similarity index 92% rename from fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/scannermock/OutgoingMessagesToScannerTest.kt rename to fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/infra/scannermock/OutgoingMessagesToScannerTest.kt index 272c47d029..2d5a5f3870 100644 --- a/fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/scannermock/OutgoingMessagesToScannerTest.kt +++ b/fingerprint/infra/scannermock/src/test/java/com/simprints/fingerprint/infra/scannermock/OutgoingMessagesToScannerTest.kt @@ -1,12 +1,14 @@ -package com.simprints.fingerprint.scannermock +package com.simprints.fingerprint.infra.scannermock +import androidx.test.ext.junit.runners.AndroidJUnit4 import com.simprints.fingerprint.infra.scanner.v1.Scanner import com.simprints.fingerprint.infra.scanner.v1.ScannerCallback import com.simprints.fingerprint.infra.scanner.v1.wrappedScannerCallback -import com.simprints.fingerprint.scannermock.simulated.SimulatedScannerManager -import com.simprints.fingerprint.scannermock.simulated.SimulationMode -import com.simprints.fingerprint.scannermock.simulated.component.SimulatedBluetoothAdapter -import com.simprints.fingerprint.scannermock.simulated.tools.byteArrayFromHexString +import com.simprints.fingerprint.infra.scannermock.simulated.SimulatedScannerManager +import com.simprints.fingerprint.infra.scannermock.simulated.SimulationMode +import com.simprints.fingerprint.infra.scannermock.simulated.component.SimulatedBluetoothAdapter +import com.simprints.fingerprint.infra.scannermock.simulated.tools.byteArrayFromHexString +import io.mockk.mockk import io.reactivex.android.plugins.RxAndroidPlugins import io.reactivex.observers.TestObserver import io.reactivex.plugins.RxJavaPlugins @@ -15,11 +17,10 @@ import org.junit.Assert import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.robolectric.RobolectricTestRunner import org.robolectric.shadows.ShadowLooper import java.util.concurrent.LinkedBlockingQueue -@RunWith(RobolectricTestRunner::class) +@RunWith(AndroidJUnit4::class) class OutgoingMessagesToScannerTest { private lateinit var testScanner: Scanner @@ -33,7 +34,11 @@ class OutgoingMessagesToScannerTest { testObserver = TestObserver() - val simulatedScannerManager = SimulatedScannerManager(SimulationMode.V1, outgoingStreamObservers = setOf(testObserver)) + val simulatedScannerManager = SimulatedScannerManager( + SimulationMode.V1, + outgoingStreamObservers = setOf(testObserver), + context = mockk(relaxed = true) + ) val simulatedBluetoothAdapter = SimulatedBluetoothAdapter(simulatedScannerManager) testScanner = Scanner("F0:AC:D7:C0:00:00", simulatedBluetoothAdapter) From 8afad89a942fcc51c20da08746e4feb25a85177f Mon Sep 17 00:00:00 2001 From: Melad Raouf Date: Thu, 14 Nov 2024 14:49:40 +0200 Subject: [PATCH 2/2] [MS-104] Update the readme --- fingerprint/infra/scannermock/README.md | 60 +++++++++++++++++++------ 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/fingerprint/infra/scannermock/README.md b/fingerprint/infra/scannermock/README.md index 6a071d7bda..fa2d79acee 100644 --- a/fingerprint/infra/scannermock/README.md +++ b/fingerprint/infra/scannermock/README.md @@ -1,13 +1,47 @@ -# Fingerprint Scanner Mock - -This package contains alternatives for `android.bluetooth.BluetoothAdapter` and associated classes that are designed for -use with the Bluetooth Component Abstractions for mocking, debugging, and testing. The options are as follows: - -- [Simulated Bluetooth Adapter](./src/main/java/com/simprints/fingerprint/scannermock/simulated/README.md) - \- This is for an elaborate mock of the Vero fingerprint scanner, that simulates responses and interaction faithful to how the real scanner would operate. - For use in integration testing or for manual testing/debugging code easily or where we want the scanner to always respond in a certain way. -- [Dummy Bluetooth Adapter](./src/main/java/com/simprints/fingerprint/scannermock/dummy/README.md) - \- This is a very simple skeleton that can be used in tests where communication with the scanner does not occur, - but we just want something simple to pass as the `ComponentBluetoothAdapter` to allow code to compile. -- [Android Record Bluetooth Adapter](./src/main/java/com/simprints/fingerprint/scannermock/record/README.md) - \- This uses the actual `android.bluetooth.BluetoothAdapter` but with ability to record the received byte streams into a file for debugging purposes. +# Scanner Mock Module README + +The Scanner Mock Module provides alternative Bluetooth adapters for replacing real Vero2 or Vero1 scanners in testing environments. This module includes adapters to simulate fingerprint capturing scenarios, record Bluetooth data for debugging, or serve as simple placeholders in basic tests. This README provides guidance on setting up and using each of these mock adapters in your testing environment. + +--- + +## 1. Replacing the Real Android Bluetooth Adapter + +To replace the real `AndroidBluetoothAdapter` with one of the mock adapters, select the appropriate adapter for your test case: +- Substitute the real `AndroidBluetoothAdapter` with `SimulatedBluetoothAdapter` in your DI setup. [Example](../../connect/src/main/java/com/simprints/fingerprint/connect/ScannerConnectModule.kt). +### A. **SimulatedBluetoothAdapter** + +Use the `SimulatedBluetoothAdapter` to fully simulate the fingerprint capturing scenario in NEC or SimMatcher flows. This adapter is designed to emulate the complete scanning and capturing process, providing success and error responses similar to those from real scanners. + +#### Setup +- Configure the test data in `SimulatedUn20ResponseHelper` to match your test case needs. This helper currently contains all necessary data for a successful fingerprint collection flow, but you can adjust it for specific scenarios or errors. + +#### Reference +More details on using the `SimulatedBluetoothAdapter` can be found in the [README](../scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/simulated/README.md). + +### B. **AndroidRecordBluetoothAdapter** + +The `AndroidRecordBluetoothAdapter` mimics the real Android Bluetooth components with the added functionality of recording incoming data bytes from the scanner to a file. This is particularly useful for debugging purposes, allowing you to analyze the exact data transmitted during the fingerprint scanning process. +More details on using the `AndroidRecordBluetoothAdapter` can be found in the [README](../scannermock/src/main/java/com/simprints/fingerprint/infra/scannermock/record/README.md). +### C. **DummyBluetoothAdapter** + +The `DummyBluetoothAdapter` serves as a simple placeholder adapter, useful in tests that require a Bluetooth component but do not involve actual data transmission or device communication. + +- This adapter is beneficial when: + - You need a `ComponentBluetoothAdapter` instance that is enabled. + - You need access to the MAC address of the `ComponentBluetoothDevice`. + +> **Note**: Attempts to connect or communicate with the `DummyBluetoothAdapter` will throw an `UnsupportedOperationException`. + +--- + +## Summary + +Each mock adapter provides specific functionality suited to different test requirements: + +| Adapter | Purpose | +|----------------------------|-------------------------------------------------------| +| **SimulatedBluetoothAdapter** | Full simulation of the fingerprint capture process | +| **AndroidRecordBluetoothAdapter** | Real Bluetooth functionality with data recording | +| **DummyBluetoothAdapter** | Basic placeholder with minimal Bluetooth properties| + +Choose the adapter that best fits your test scenario to effectively mock the scanner behavior and ensure accurate and efficient testing.