From 0aaf3ee0e66d582d7dc5d5233442783590517cf7 Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Tue, 16 Jan 2024 11:49:06 +0200 Subject: [PATCH] Dismantle ConfigManager by directly calling repo and scheduler --- face/capture/build.gradle.kts | 1 - .../capture/screens/FaceCaptureViewModel.kt | 8 +- .../LiveFeedbackFragmentViewModel.kt | 13 ++- .../screens/FaceCaptureViewModelTest.kt | 10 +- .../LiveFeedbackFragmentViewModelTest.kt | 8 +- feature/client-api/build.gradle.kts | 1 - .../feature/clientapi/ClientApiViewModel.kt | 8 +- .../DeleteSessionEventsIfNeededUseCase.kt | 8 +- ...EnrolmentCreationEventForSubjectUseCase.kt | 6 +- .../usecases/GetEventsForCoSyncUseCase.kt | 9 +- .../clientapi/ClientApiViewModelTest.kt | 6 +- .../DeleteSessionEventsIfNeededUseCaseTest.kt | 10 +- ...lmentCreationEventForSubjectUseCaseTest.kt | 14 +-- .../usecases/GetEventsForCoSyncUseCaseTest.kt | 14 +-- feature/consent/build.gradle.kts | 1 - .../screens/consent/ConsentViewModel.kt | 8 +- .../screens/privacy/PrivacyNoticeViewModel.kt | 10 +- .../screens/consent/ConsentViewModelTest.kt | 10 +- .../privacy/PrivacyNoticeViewModelTest.kt | 22 ++-- .../feature/dashboard/debug/DebugFragment.kt | 10 +- .../dashboard/logout/LogoutSyncViewModel.kt | 6 +- .../feature/dashboard/main/MainViewModel.kt | 6 +- .../projectdetails/ProjectDetailsViewModel.kt | 6 +- .../dashboard/main/sync/SyncViewModel.kt | 12 +- .../dashboard/settings/SettingsViewModel.kt | 10 +- .../settings/about/AboutViewModel.kt | 8 +- .../FingerSelectionViewModel.kt | 6 +- .../settings/syncinfo/SyncInfoViewModel.kt | 12 +- .../ModuleSelectionViewModel.kt | 18 +-- .../repository/ModuleRepositoryImpl.kt | 13 ++- .../logout/LogoutSyncViewModelTest.kt | 10 +- .../dashboard/main/MainViewModelTest.kt | 6 +- .../ProjectDetailsViewModelTest.kt | 101 ++++++++++------- .../dashboard/main/sync/SyncViewModelTest.kt | 38 +++---- .../settings/SettingsViewModelTest.kt | 36 +++--- .../settings/about/AboutViewModelTest.kt | 10 +- .../FingerSelectionViewModelTest.kt | 10 +- .../syncinfo/SyncInfoViewModelTest.kt | 23 ++-- .../ModuleSelectionViewModelTest.kt | 13 ++- .../repository/ModuleRepositoryImplTest.kt | 19 ++-- feature/enrol-last-biometric/build.gradle.kts | 1 - .../screen/EnrolLastBiometricViewModel.kt | 6 +- .../screen/EnrolLastBiometricViewModelTest.kt | 10 +- feature/fetch-subject/build.gradle.kts | 1 - .../screen/FetchSubjectViewModel.kt | 6 +- .../screen/FetchSubjectViewModelTest.kt | 8 +- .../usecases/CancelBackgroundSyncUseCase.kt | 6 +- .../usecases/ExtractCrashKeysUseCase.kt | 8 +- .../StartBackgroundSyncIfNeededUseCase.kt | 10 +- .../UpdateProjectInCurrentSessionUseCase.kt | 8 +- .../CancelBackgroundSyncUseCaseTest.kt | 8 +- .../usecases/ExtractCrashKeysUseCaseTest.kt | 10 +- .../StartBackgroundSyncUseCaseTest.kt | 19 ++-- ...pdateProjectInCurrentSessionUseCaseTest.kt | 10 +- feature/matcher/build.gradle.kts | 1 - .../usecases/FingerprintMatcherUseCase.kt | 8 +- .../matcher/usecases/SaveMatchEventUseCase.kt | 6 +- .../usecases/FingerprintMatcherUseCaseTest.kt | 6 +- .../usecases/SaveMatchEventUseCaseTest.kt | 8 +- feature/orchestrator/build.gradle.kts | 1 - .../orchestrator/OrchestratorViewModel.kt | 8 +- .../orchestrator/OrchestratorViewModelTest.kt | 10 +- feature/setup/build.gradle.kts | 1 - .../feature/setup/screen/SetupViewModel.kt | 6 +- .../setup/screen/SetupViewModelTest.kt | 14 +-- .../screen/FingerprintCaptureViewModel.kt | 6 +- .../screen/FingerprintCaptureViewModelTest.kt | 8 +- fingerprint/connect/build.gradle.kts | 1 - .../screens/ConnectScannerViewModel.kt | 6 +- .../connect/screens/ota/OtaViewModel.kt | 6 +- .../screens/ConnectScannerViewModelTest.kt | 19 +--- .../connect/screens/ota/OtaViewModelTest.kt | 8 +- fingerprint/infra/scanner/build.gradle.kts | 1 - .../infra/scanner/ScannerPairingManager.kt | 6 +- .../infra/scanner/data/FirmwareRepository.kt | 8 +- .../data/remote/FirmwareRemoteDataSource.kt | 6 +- .../worker/FirmwareFileUpdateScheduler.kt | 9 +- .../helpers/ScannerInitialSetupHelper.kt | 17 ++- .../infra/scanner/wrapper/ScannerFactory.kt | 6 +- .../scanner/ScannerPairingManagerTest.kt | 6 +- .../scanner/data/FirmwareRepositoryTest.kt | 8 +- .../remote/FirmwareRemoteDataSourceTest.kt | 4 +- .../worker/FirmwareFileUpdateSchedulerTest.kt | 6 +- .../helpers/ScannerInitialSetupHelperTest.kt | 6 +- .../scanner/wrapper/ScannerFactoryTest.kt | 6 +- .../id/ScheduleBackgroundSyncUseCase.kt | 6 +- .../id/ScheduleBackgroundSyncUseCaseTest.kt | 13 ++- .../authenticator/ProjectAuthenticator.kt | 10 +- .../authlogic/authenticator/SignerManager.kt | 14 ++- .../authenticator/ProjectAuthenticatorTest.kt | 22 ++-- .../authenticator/SignerManagerTest.kt | 11 +- .../infra/config/store/ConfigRepository.kt | 2 +- .../config/store/ConfigRepositoryImpl.kt | 2 +- .../infra/config/sync/ConfigManager.kt | 45 -------- .../infra/config/sync/ConfigManagerImpl.kt | 51 --------- .../infra/config/sync/ConfigManagerModule.kt | 8 +- .../config/sync/ConfigurationScheduler.kt | 6 + .../ConfigurationSchedulerImpl.kt | 4 +- .../sync/worker/ConfigurationScheduler.kt | 6 - .../config/sync/worker/ConfigurationWorker.kt | 8 +- .../config/sync/ConfigManagerImplTest.kt | 102 ----------------- .../ConfigurationSchedulerImplTest.kt | 2 +- .../sync/worker/ConfigurationWorkerTest.kt | 44 +++++--- infra/enrolment-records-sync/build.gradle.kts | 1 - .../sync/worker/EnrolmentRecordWorker.kt | 10 +- .../worker/EnrolmentRecordWorkerTest.kt | 8 +- infra/event-sync/build.gradle.kts | 1 - .../infra/eventsync/EventSyncManagerImpl.kt | 6 +- .../sync/down/EventDownSyncWorkersBuilder.kt | 2 +- .../sync/master/EventSyncMasterWorker.kt | 4 +- .../sync/up/tasks/EventUpSyncTask.kt | 2 +- .../infra/eventsync/EventSyncManagerTest.kt | 2 +- .../down/EventDownSyncWorkersBuilderTest.kt | 2 +- .../sync/master/EventSyncMasterWorkerTest.kt | 6 +- .../sync/up/tasks/EventUpSyncTaskTest.kt | 2 +- .../infra/events/EventRepositoryImpl.kt | 2 +- .../infra/events/EventRepositoryImplTest.kt | 2 +- infra/images/build.gradle.kts | 1 - .../remote/ImageRemoteDataSourceImpl.kt | 10 +- .../remote/ImageRemoteDataSourceImplTest.kt | 103 +++++++++--------- infra/project-security-store/build.gradle.kts | 1 - .../remote/SecurityStateRemoteDataSource.kt | 8 +- .../SecurityStateRemoteDataSourceTest.kt | 6 +- 123 files changed, 617 insertions(+), 781 deletions(-) delete mode 100644 infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt delete mode 100644 infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManagerImpl.kt create mode 100644 infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigurationScheduler.kt rename infra/config-sync/src/main/java/com/simprints/infra/config/sync/{worker => }/ConfigurationSchedulerImpl.kt (92%) delete mode 100644 infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationScheduler.kt delete mode 100644 infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerImplTest.kt rename infra/config-sync/src/test/java/com/simprints/infra/config/sync/{worker => }/ConfigurationSchedulerImplTest.kt (96%) diff --git a/face/capture/build.gradle.kts b/face/capture/build.gradle.kts index a4ecda867e..6d276090f1 100644 --- a/face/capture/build.gradle.kts +++ b/face/capture/build.gradle.kts @@ -19,7 +19,6 @@ dependencies { implementation(project(":infra:orchestrator-data")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:enrolment-records-store")) implementation(project(":infra:events")) implementation(project(":infra:images")) diff --git a/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt b/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt index 109674a5f8..787637ff43 100644 --- a/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt +++ b/face/capture/src/main/java/com/simprints/face/capture/screens/FaceCaptureViewModel.kt @@ -12,8 +12,8 @@ import com.simprints.face.capture.models.FaceDetection import com.simprints.face.capture.usecases.BitmapToByteArrayUseCase import com.simprints.face.capture.usecases.SaveFaceImageUseCase import com.simprints.face.capture.usecases.SimpleCaptureEventReporter +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants.CrashReportTag import com.simprints.infra.logging.Simber import dagger.hilt.android.lifecycle.HiltViewModel @@ -23,10 +23,10 @@ import javax.inject.Inject @HiltViewModel internal class FaceCaptureViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val saveFaceImage: SaveFaceImageUseCase, private val eventReporter: SimpleCaptureEventReporter, - private val bitmapToByteArray: BitmapToByteArrayUseCase + private val bitmapToByteArray: BitmapToByteArrayUseCase, ) : ViewModel() { // Updated in live feedback screen @@ -63,7 +63,7 @@ internal class FaceCaptureViewModel @Inject constructor( fun flowFinished() { viewModelScope.launch { - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() if (projectConfiguration.face?.imageSavingStrategy == FaceConfiguration.ImageSavingStrategy.ONLY_GOOD_SCAN) { saveFaceDetections() } diff --git a/face/capture/src/main/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModel.kt b/face/capture/src/main/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModel.kt index d44015b272..69f5062892 100644 --- a/face/capture/src/main/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModel.kt +++ b/face/capture/src/main/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModel.kt @@ -13,7 +13,7 @@ import com.simprints.face.capture.models.FaceDetection import com.simprints.face.capture.models.FaceTarget import com.simprints.face.capture.models.SymmetricTarget import com.simprints.face.capture.usecases.SimpleCaptureEventReporter -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.facebiosdk.detection.Face import com.simprints.infra.facebiosdk.detection.FaceDetector import dagger.hilt.android.lifecycle.HiltViewModel @@ -28,7 +28,7 @@ import javax.inject.Inject internal class LiveFeedbackFragmentViewModel @Inject constructor( private val frameProcessor: FrameProcessor, private val faceDetector: FaceDetector, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventReporter: SimpleCaptureEventReporter, private val timeHelper: TimeHelper, ) : ViewModel() { @@ -85,7 +85,7 @@ internal class LiveFeedbackFragmentViewModel @Inject constructor( samplesToCapture: Int, attemptNumber: Int, cropRect: RectF, - previewSize: Size + previewSize: Size, ) { this.samplesToCapture = samplesToCapture this.attemptNumber = attemptNumber @@ -101,7 +101,7 @@ internal class LiveFeedbackFragmentViewModel @Inject constructor( */ private fun finishCapture(attemptNumber: Int) { viewModelScope.launch { - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() sortedQualifyingCaptures = userCaptures .filter { it.hasValidStatus() && it.isAboveQualityThreshold(projectConfiguration.face!!.qualityThreshold) } .sortedByDescending { it.face?.quality } @@ -115,7 +115,7 @@ internal class LiveFeedbackFragmentViewModel @Inject constructor( private fun getFaceDetectionFromPotentialFace( bitmap: Bitmap, - potentialFace: Face? + potentialFace: Face?, ): FaceDetection { return if (potentialFace == null) { bitmap.recycle() @@ -187,7 +187,8 @@ internal class LiveFeedbackFragmentViewModel @Inject constructor( } private suspend fun sendCaptureEvent(faceDetection: FaceDetection, attemptNumber: Int) { - val qualityThreshold = configManager.getProjectConfiguration().face!!.qualityThreshold.toFloat() + val qualityThreshold = + configRepository.getProjectConfiguration().face!!.qualityThreshold.toFloat() eventReporter.addCaptureEvents(faceDetection, attemptNumber, qualityThreshold) } diff --git a/face/capture/src/test/java/com/simprints/face/capture/screens/FaceCaptureViewModelTest.kt b/face/capture/src/test/java/com/simprints/face/capture/screens/FaceCaptureViewModelTest.kt index 1384db2ef9..e75e0b4617 100644 --- a/face/capture/src/test/java/com/simprints/face/capture/screens/FaceCaptureViewModelTest.kt +++ b/face/capture/src/test/java/com/simprints/face/capture/screens/FaceCaptureViewModelTest.kt @@ -6,7 +6,7 @@ import com.simprints.face.capture.models.FaceDetection import com.simprints.face.capture.usecases.BitmapToByteArrayUseCase import com.simprints.face.capture.usecases.SaveFaceImageUseCase import com.simprints.face.capture.usecases.SimpleCaptureEventReporter -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FaceConfiguration.ImageSavingStrategy import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.getOrAwaitValue @@ -31,7 +31,7 @@ class FaceCaptureViewModelTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var faceImageUseCase: SaveFaceImageUseCase @@ -59,7 +59,7 @@ class FaceCaptureViewModelTest { viewModel = FaceCaptureViewModel( - configManager, + configRepository, faceImageUseCase, eventReporter, bitmapToByteArrayUseCase, @@ -68,7 +68,7 @@ class FaceCaptureViewModelTest { @Test fun `Save face detections should not be called when image saving strategy set to NEVER`() = runTest { - coEvery { configManager.getProjectConfiguration().face?.imageSavingStrategy } returns ImageSavingStrategy.NEVER + coEvery { configRepository.getProjectConfiguration().face?.imageSavingStrategy } returns ImageSavingStrategy.NEVER viewModel.captureFinished(faceDetections) viewModel.flowFinished() @@ -77,7 +77,7 @@ class FaceCaptureViewModelTest { @Test fun `Save face detections should be called when image saving strategy set to ONLY_GOO_SCAN`() = runTest { - coEvery { configManager.getProjectConfiguration().face?.imageSavingStrategy } returns ImageSavingStrategy.ONLY_GOOD_SCAN + coEvery { configRepository.getProjectConfiguration().face?.imageSavingStrategy } returns ImageSavingStrategy.ONLY_GOOD_SCAN viewModel.captureFinished(faceDetections) viewModel.flowFinished() diff --git a/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModelTest.kt b/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModelTest.kt index 37bab35288..bcb619b69a 100644 --- a/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModelTest.kt +++ b/face/capture/src/test/java/com/simprints/face/capture/screens/livefeedback/LiveFeedbackFragmentViewModelTest.kt @@ -10,7 +10,7 @@ import com.google.common.truth.Truth.assertThat import com.simprints.core.tools.time.TimeHelper import com.simprints.face.capture.models.FaceDetection import com.simprints.face.capture.usecases.SimpleCaptureEventReporter -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.facebiosdk.detection.Face import com.simprints.infra.facebiosdk.detection.FaceDetector import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -51,7 +51,7 @@ internal class LiveFeedbackFragmentViewModelTest { lateinit var rectF: RectF @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var eventReporter: SimpleCaptureEventReporter @@ -68,7 +68,7 @@ internal class LiveFeedbackFragmentViewModelTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getProjectConfiguration().face?.qualityThreshold } returns QUALITY_THRESHOLD + coEvery { configRepository.getProjectConfiguration().face?.qualityThreshold } returns QUALITY_THRESHOLD every { timeHelper.now() } returnsMany (0..100L).toList() justRun { frameProcessor.init(any(), any()) } justRun { frame.close() } @@ -78,7 +78,7 @@ internal class LiveFeedbackFragmentViewModelTest { viewModel = LiveFeedbackFragmentViewModel( frameProcessor, faceDetector, - configManager, + configRepository, eventReporter, timeHelper ) diff --git a/feature/client-api/build.gradle.kts b/feature/client-api/build.gradle.kts index ac38ee44bd..d6bd834aa6 100644 --- a/feature/client-api/build.gradle.kts +++ b/feature/client-api/build.gradle.kts @@ -10,7 +10,6 @@ dependencies { implementation(project(":infra:auth-store")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) implementation(project(":infra:enrolment-records-store")) implementation(project(":infra:orchestrator-data")) diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/ClientApiViewModel.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/ClientApiViewModel.kt index caea013d2b..cef0654793 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/ClientApiViewModel.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/ClientApiViewModel.kt @@ -20,9 +20,8 @@ import com.simprints.feature.clientapi.usecases.GetEnrolmentCreationEventForSubj import com.simprints.feature.clientapi.usecases.GetEventsForCoSyncUseCase import com.simprints.feature.clientapi.usecases.IsFlowCompletedWithErrorUseCase import com.simprints.feature.clientapi.usecases.SimpleEventReporter -import com.simprints.infra.orchestration.data.responses.AppVerifyResponse import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.Simber import com.simprints.infra.orchestration.data.ActionRequest import com.simprints.infra.orchestration.data.ActionRequestIdentifier @@ -32,6 +31,7 @@ import com.simprints.infra.orchestration.data.responses.AppEnrolResponse import com.simprints.infra.orchestration.data.responses.AppErrorResponse import com.simprints.infra.orchestration.data.responses.AppIdentifyResponse import com.simprints.infra.orchestration.data.responses.AppRefusalResponse +import com.simprints.infra.orchestration.data.responses.AppVerifyResponse import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -48,7 +48,7 @@ class ClientApiViewModel @Inject internal constructor( private val deleteSessionEventsIfNeeded: DeleteSessionEventsIfNeededUseCase, private val isFlowCompletedWithError: IsFlowCompletedWithErrorUseCase, private val authStore: AuthStore, - private val configManager: ConfigManager + private val configRepository: ConfigRepository, ) : ViewModel() { val returnResponse: LiveData> @@ -64,7 +64,7 @@ class ClientApiViewModel @Inject internal constructor( private val _showAlert = MutableLiveData>() private suspend fun getProject() = - runCatching { configManager.getProject(authStore.signedInProjectId) }.getOrNull() + runCatching { configRepository.getProject(authStore.signedInProjectId) }.getOrNull() suspend fun handleIntent(action: String, extras: Bundle): ActionRequest? { val extrasMap = extras.toMap() diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCase.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCase.kt index 325eb0f60b..ee06315474 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCase.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCase.kt @@ -1,21 +1,21 @@ package com.simprints.feature.clientapi.usecases import com.simprints.core.ExternalScope +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.canSyncDataToSimprints -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import javax.inject.Inject internal class DeleteSessionEventsIfNeededUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventRepository: EventRepository, - @ExternalScope private val externalScope: CoroutineScope + @ExternalScope private val externalScope: CoroutineScope, ) { suspend operator fun invoke(sessionId: String) = externalScope.launch { - if (!configManager.getProjectConfiguration().canSyncDataToSimprints()) { + if (!configRepository.getProjectConfiguration().canSyncDataToSimprints()) { eventRepository.deleteSessionEvents(sessionId) } } diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForSubjectUseCase.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForSubjectUseCase.kt index be636968f5..3642eb7a45 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForSubjectUseCase.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForSubjectUseCase.kt @@ -3,9 +3,9 @@ package com.simprints.feature.clientapi.usecases import com.simprints.core.tools.json.JsonHelper import com.simprints.core.tools.utils.EncodingUtils import com.simprints.feature.clientapi.models.CoSyncEnrolmentRecordEvents +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.canCoSyncAllData import com.simprints.infra.config.store.models.canCoSyncBiometricData -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.store.domain.models.Subject import com.simprints.infra.enrolment.records.store.domain.models.SubjectQuery @@ -13,13 +13,13 @@ import com.simprints.infra.events.event.domain.models.subject.EnrolmentRecordCre import javax.inject.Inject internal class GetEnrolmentCreationEventForSubjectUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val encoder: EncodingUtils, private val jsonHelper: JsonHelper, ) { suspend operator fun invoke(projectId: String, subjectId: String): String? { - val config = configManager.getProjectConfiguration() + val config = configRepository.getProjectConfiguration() if (!config.canCoSyncAllData() && !config.canCoSyncBiometricData()) { return null diff --git a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEventsForCoSyncUseCase.kt b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEventsForCoSyncUseCase.kt index cda9d27433..059918b456 100644 --- a/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEventsForCoSyncUseCase.kt +++ b/feature/client-api/src/main/java/com/simprints/feature/clientapi/usecases/GetEventsForCoSyncUseCase.kt @@ -5,13 +5,13 @@ import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.serialization.TokenizationAsStringSerializer import com.simprints.core.tools.json.JsonHelper import com.simprints.feature.clientapi.models.CoSyncEvents +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.canCoSyncAllData import com.simprints.infra.config.store.models.canCoSyncAnalyticsData import com.simprints.infra.config.store.models.canCoSyncBiometricData import com.simprints.infra.config.store.models.canCoSyncData import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.EnrolmentEventV2 import com.simprints.infra.events.event.domain.models.Event @@ -25,13 +25,14 @@ import kotlinx.coroutines.flow.toList import javax.inject.Inject internal class GetEventsForCoSyncUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventRepository: EventRepository, private val jsonHelper: JsonHelper, - private val tokenizationProcessor: TokenizationProcessor + private val tokenizationProcessor: TokenizationProcessor, ) { + suspend operator fun invoke(sessionId: String, project: Project?): String? { - val config = configManager.getProjectConfiguration() + val config = configRepository.getProjectConfiguration() if (!config.canCoSyncData()) { return null diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/ClientApiViewModelTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/ClientApiViewModelTest.kt index 74e8ef7323..601e12bf0f 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/ClientApiViewModelTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/ClientApiViewModelTest.kt @@ -15,7 +15,7 @@ import com.simprints.feature.clientapi.usecases.GetEventsForCoSyncUseCase import com.simprints.feature.clientapi.usecases.IsFlowCompletedWithErrorUseCase import com.simprints.feature.clientapi.usecases.SimpleEventReporter import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.orchestration.data.ActionRequest import com.simprints.infra.orchestration.data.ActionRequestIdentifier import com.simprints.infra.orchestration.data.ActionResponse @@ -73,7 +73,7 @@ internal class ClientApiViewModelTest { lateinit var authStore: AuthStore @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository private lateinit var viewModel: ClientApiViewModel @@ -100,7 +100,7 @@ internal class ClientApiViewModelTest { deleteSessionEventsIfNeeded = deleteSessionEventsIfNeeded, isFlowCompletedWithError = isFlowCompletedWithError, authStore = authStore, - configManager = configManager + configRepository = configRepository ) } diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCaseTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCaseTest.kt index e06ce29a00..822ccde1a2 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCaseTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/DeleteSessionEventsIfNeededUseCaseTest.kt @@ -1,6 +1,6 @@ package com.simprints.feature.clientapi.usecases -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.UpSynchronizationConfiguration import com.simprints.infra.events.EventRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -21,7 +21,7 @@ class DeleteSessionEventsIfNeededUseCaseTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var eventRepository: EventRepository @@ -33,7 +33,7 @@ class DeleteSessionEventsIfNeededUseCaseTest { MockKAnnotations.init(this, relaxed = true) deleteUseCase = DeleteSessionEventsIfNeededUseCase( - configManager, + configRepository, eventRepository, CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) @@ -41,7 +41,7 @@ class DeleteSessionEventsIfNeededUseCaseTest { @Test fun `deletes session events if data sync disabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { coEvery { synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.NONE } @@ -54,7 +54,7 @@ class DeleteSessionEventsIfNeededUseCaseTest { @Test fun `does not delete session events if data sync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { coEvery { synchronization.up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL } diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForSubjectUseCaseTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForSubjectUseCaseTest.kt index 3bca910ae1..7e99958797 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForSubjectUseCaseTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEnrolmentCreationEventForSubjectUseCaseTest.kt @@ -3,8 +3,8 @@ package com.simprints.feature.clientapi.usecases import com.google.common.truth.Truth.assertThat import com.simprints.core.tools.json.JsonHelper import com.simprints.core.tools.utils.EncodingUtils +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.UpSynchronizationConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.MockKAnnotations @@ -24,7 +24,7 @@ class GetEnrolmentCreationEventForSubjectUseCaseTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var enrolmentRecordRepository: EnrolmentRecordRepository @@ -44,7 +44,7 @@ class GetEnrolmentCreationEventForSubjectUseCaseTest { every { jsonHelper.toJson(any()) } returns "json" useCase = GetEnrolmentCreationEventForSubjectUseCase( - configManager, + configRepository, enrolmentRecordRepository, encoder, jsonHelper @@ -53,7 +53,7 @@ class GetEnrolmentCreationEventForSubjectUseCaseTest { @Test fun `returns null if coSync disabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.NONE } @@ -65,7 +65,7 @@ class GetEnrolmentCreationEventForSubjectUseCaseTest { @Test fun `returns null if only analytics sync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ONLY_ANALYTICS } @@ -77,7 +77,7 @@ class GetEnrolmentCreationEventForSubjectUseCaseTest { @Test fun `returns null if no creation event`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ONLY_BIOMETRICS } @@ -90,7 +90,7 @@ class GetEnrolmentCreationEventForSubjectUseCaseTest { @Test fun `returns event if biometrics coSync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ONLY_BIOMETRICS } diff --git a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEventsForCoSyncUseCaseTest.kt b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEventsForCoSyncUseCaseTest.kt index 6fafb9ea06..b1861baf3c 100644 --- a/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEventsForCoSyncUseCaseTest.kt +++ b/feature/client-api/src/test/java/com/simprints/feature/clientapi/usecases/GetEventsForCoSyncUseCaseTest.kt @@ -3,7 +3,7 @@ package com.simprints.feature.clientapi.usecases import com.google.common.truth.Truth.assertThat import com.simprints.core.tools.json.JsonHelper import com.simprints.feature.clientapi.models.CoSyncEvents -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.UpSynchronizationConfiguration import com.simprints.infra.config.store.tokenization.TokenizationProcessor import com.simprints.infra.events.EventRepository @@ -28,7 +28,7 @@ class GetEventsForCoSyncUseCaseTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var eventRepository: EventRepository @@ -53,12 +53,12 @@ class GetEventsForCoSyncUseCaseTest { mockk(relaxed = true), ) - useCase = GetEventsForCoSyncUseCase(configManager, eventRepository, jsonHelper, tokenizationProcessor) + useCase = GetEventsForCoSyncUseCase(configRepository, eventRepository, jsonHelper, tokenizationProcessor) } @Test fun `returns null if coSync disabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.NONE } @@ -69,7 +69,7 @@ class GetEventsForCoSyncUseCaseTest { @Test fun `returns all events if full coSync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ALL } every { jsonHelper.toJson(any ()) } returns "json" @@ -81,7 +81,7 @@ class GetEventsForCoSyncUseCaseTest { @Test fun `returns only analytics events if analytics coSync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ONLY_ANALYTICS } every { jsonHelper.toJson(any ()) } returns "json" @@ -93,7 +93,7 @@ class GetEventsForCoSyncUseCaseTest { @Test fun `returns only biometric events if biometric coSync enabled`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.up.coSync.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.ONLY_BIOMETRICS } every { jsonHelper.toJson(any ()) } returns "json" diff --git a/feature/consent/build.gradle.kts b/feature/consent/build.gradle.kts index b3237edef4..341d9d9e71 100644 --- a/feature/consent/build.gradle.kts +++ b/feature/consent/build.gradle.kts @@ -9,7 +9,6 @@ android { dependencies { implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:auth-store")) implementation(project(":infra:events")) implementation(project(":feature:exit-form")) diff --git a/feature/consent/src/main/java/com/simprints/feature/consent/screens/consent/ConsentViewModel.kt b/feature/consent/src/main/java/com/simprints/feature/consent/screens/consent/ConsentViewModel.kt index 445bfc03a7..c1ddf864e8 100644 --- a/feature/consent/src/main/java/com/simprints/feature/consent/screens/consent/ConsentViewModel.kt +++ b/feature/consent/src/main/java/com/simprints/feature/consent/screens/consent/ConsentViewModel.kt @@ -16,7 +16,7 @@ import com.simprints.feature.exitform.ExitFormConfigurationBuilder import com.simprints.feature.exitform.ExitFormResult import com.simprints.feature.exitform.exitFormConfiguration import com.simprints.feature.exitform.scannerOptions -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.events.EventRepository @@ -31,7 +31,7 @@ import javax.inject.Inject @HiltViewModel internal class ConsentViewModel @Inject constructor( private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventRepository: EventRepository, private val generalConsentTextHelper: GeneralConsentTextHelper, private val parentalConsentTextHelper: ParentalConsentTextHelper, @@ -54,7 +54,7 @@ internal class ConsentViewModel @Inject constructor( fun loadConfiguration(consentType: ConsentType) { viewModelScope.launch { - val projectConfig = configManager.getProjectConfiguration() + val projectConfig = configRepository.getProjectConfiguration() _viewState.postValue(mapConfigToViewState(projectConfig, consentType)) } } @@ -67,7 +67,7 @@ internal class ConsentViewModel @Inject constructor( fun declineClicked(currentConsentTab: ConsentTab) { saveConsentEvent(currentConsentTab, ConsentEvent.ConsentPayload.Result.DECLINED) viewModelScope.launch { - val projectConfig = configManager.getProjectConfiguration() + val projectConfig = configRepository.getProjectConfiguration() _showExitForm.send(getExitFormFromModalities(projectConfig.general.modalities)) } } diff --git a/feature/consent/src/main/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModel.kt b/feature/consent/src/main/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModel.kt index bb8410d473..a706b70403 100644 --- a/feature/consent/src/main/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModel.kt +++ b/feature/consent/src/main/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModel.kt @@ -7,13 +7,13 @@ import androidx.lifecycle.viewModelScope import com.simprints.core.livedata.LiveDataEvent import com.simprints.core.livedata.send import com.simprints.core.tools.utils.TimeUtils -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.PrivacyNoticeResult import com.simprints.infra.config.store.models.PrivacyNoticeResult.Failed import com.simprints.infra.config.store.models.PrivacyNoticeResult.FailedBecauseBackendMaintenance import com.simprints.infra.config.store.models.PrivacyNoticeResult.InProgress import com.simprints.infra.config.store.models.PrivacyNoticeResult.Succeed -import com.simprints.infra.authstore.AuthStore import com.simprints.infra.network.ConnectivityTracker import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.catch @@ -24,7 +24,7 @@ import javax.inject.Inject @HiltViewModel internal class PrivacyNoticeViewModel @Inject constructor( private val connectivityTracker: ConnectivityTracker, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, ) : ViewModel() { @@ -43,8 +43,8 @@ internal class PrivacyNoticeViewModel @Inject constructor( } fun retrievePrivacyNotice() = viewModelScope.launch { - val deviceConfiguration = configManager.getDeviceConfiguration() - configManager.getPrivacyNotice( + val deviceConfiguration = configRepository.getDeviceConfiguration() + configRepository.getPrivacyNotice( authStore.signedInProjectId, deviceConfiguration.language ) diff --git a/feature/consent/src/test/java/com/simprints/feature/consent/screens/consent/ConsentViewModelTest.kt b/feature/consent/src/test/java/com/simprints/feature/consent/screens/consent/ConsentViewModelTest.kt index 17c909dd87..c55600edc7 100644 --- a/feature/consent/src/test/java/com/simprints/feature/consent/screens/consent/ConsentViewModelTest.kt +++ b/feature/consent/src/test/java/com/simprints/feature/consent/screens/consent/ConsentViewModelTest.kt @@ -8,7 +8,7 @@ import com.simprints.feature.consent.ConsentType import com.simprints.feature.consent.screens.consent.helpers.GeneralConsentTextHelper import com.simprints.feature.consent.screens.consent.helpers.ParentalConsentTextHelper import com.simprints.feature.exitform.ExitFormResult -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.events.EventRepository @@ -49,7 +49,7 @@ class ConsentViewModelTest { private lateinit var parentalConsentTextHelper: ParentalConsentTextHelper @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var projectConfig: ProjectConfiguration @@ -65,7 +65,7 @@ class ConsentViewModelTest { @Before fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getProjectConfiguration() } returns projectConfig + coEvery { configRepository.getProjectConfiguration() } returns projectConfig every { projectConfig.consent } returns mockk() every { timeHelper.now() } returns TIMESTAMP @@ -74,7 +74,7 @@ class ConsentViewModelTest { vm = ConsentViewModel( timeHelper, - configManager, + configRepository, eventRepository, generalConsentTextHelper, parentalConsentTextHelper, @@ -91,7 +91,7 @@ class ConsentViewModelTest { vm.loadConfiguration(ConsentType.ENROL) val state = vm.viewState.getOrAwaitValue() - coVerify { configManager.getProjectConfiguration() } + coVerify { configRepository.getProjectConfiguration() } verify { generalConsentTextHelper.assembleText(any(), eq(defaultModalityList), eq(ConsentType.ENROL)) } verify { parentalConsentTextHelper.assembleText(any(), eq(defaultModalityList), eq(ConsentType.ENROL)) } diff --git a/feature/consent/src/test/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModelTest.kt b/feature/consent/src/test/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModelTest.kt index 4e2bbd5671..a2be2fc132 100644 --- a/feature/consent/src/test/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModelTest.kt +++ b/feature/consent/src/test/java/com/simprints/feature/consent/screens/privacy/PrivacyNoticeViewModelTest.kt @@ -2,10 +2,10 @@ package com.simprints.feature.consent.screens.privacy import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.PrivacyNoticeResult -import com.simprints.infra.authstore.AuthStore import com.simprints.infra.network.ConnectivityTracker import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.getOrAwaitValue @@ -36,7 +36,7 @@ internal class PrivacyNoticeViewModelTest { lateinit var connectivityTracker: ConnectivityTracker @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var authStore: AuthStore @@ -48,19 +48,19 @@ internal class PrivacyNoticeViewModelTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration(LANGUAGE, listOf(), "") + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration(LANGUAGE, listOf(), "") every { authStore.signedInProjectId } returns PROJECT_ID privacyNoticeViewModel = PrivacyNoticeViewModel( connectivityTracker, - configManager, + configRepository, authStore, ) } @Test fun `retrievePrivacyNotice should return DownloadInProgress when trying download`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(LANGUAGE), ) @@ -73,7 +73,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should return ContentAvailable when success received`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(LANGUAGE), PrivacyNoticeResult.Succeed(LANGUAGE, "some long consent") ) @@ -87,7 +87,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should return ConsentNotAvailable when Failed received`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(LANGUAGE), PrivacyNoticeResult.Failed(LANGUAGE, Throwable()) ) @@ -101,7 +101,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should return BackendMaintenance when FailedBecauseBackendMaintenance received`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(LANGUAGE), PrivacyNoticeResult.FailedBecauseBackendMaintenance(LANGUAGE, Throwable()) ) @@ -115,7 +115,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `retrievePrivacyNotice should return BackendMaintenance with estimation when FailedBecauseBackendMaintenance received`() = runTest { - coEvery { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf( PrivacyNoticeResult.InProgress(LANGUAGE), PrivacyNoticeResult.FailedBecauseBackendMaintenance(LANGUAGE, Throwable(), 1000L) ) @@ -131,7 +131,7 @@ internal class PrivacyNoticeViewModelTest { @Test fun `downloadPressed should retrieve notice when online`() = runTest { every { connectivityTracker.isConnected() } returns true - coEvery { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf(PrivacyNoticeResult.InProgress(LANGUAGE)) + coEvery { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE) } returns flowOf(PrivacyNoticeResult.InProgress(LANGUAGE)) val privacyNoticeLiveData = privacyNoticeViewModel.viewState() val showOfflineLiveData = privacyNoticeViewModel.showOffline() diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/debug/DebugFragment.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/debug/DebugFragment.kt index 194c969ecf..82c9a77ab0 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/debug/DebugFragment.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/debug/DebugFragment.kt @@ -11,16 +11,16 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.work.WorkManager import com.simprints.core.DispatcherIO -import com.simprints.infra.uibase.viewbinding.viewBinding import com.simprints.feature.dashboard.R import com.simprints.feature.dashboard.databinding.FragmentDebugBinding import com.simprints.infra.authlogic.AuthManager import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.eventsync.status.models.EventSyncWorkerState +import com.simprints.infra.uibase.viewbinding.viewBinding import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.toList @@ -35,7 +35,7 @@ internal class DebugFragment : Fragment(R.layout.fragment_debug) { lateinit var eventSyncManager: EventSyncManager @Inject - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @Inject lateinit var authStore: AuthStore @@ -94,7 +94,9 @@ internal class DebugFragment : Fragment(R.layout.fragment_debug) { binding.logs.append("\nGetting Configs from BFSID") lifecycleScope.launch { try { - configManager.refreshProject(authStore.signedInProjectId) + configRepository.refreshProject(authStore.signedInProjectId).also { (project, _) -> + enrolmentRecordRepository.tokenizeExistingRecords(project) + } binding.logs.append("\nGot Configs from BFSID") } catch (e: Exception) { binding.logs.append("\nFailed to refresh the project configuration") diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModel.kt index 98080bbda9..f6b5f0d7eb 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModel.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.viewModelScope import com.simprints.core.ExternalScope import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.infra.authlogic.AuthManager -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SettingsPasswordConfig import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope @@ -16,14 +16,14 @@ import javax.inject.Inject @HiltViewModel class LogoutSyncViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authManager: AuthManager, @ExternalScope private val externalScope: CoroutineScope, ) : ViewModel() { val settingsLocked: LiveData> get() = liveData(context = viewModelScope.coroutineContext) { - emit(LiveDataEventWithContent(configManager.getProjectConfiguration().general.settingsPassword)) + emit(LiveDataEventWithContent(configRepository.getProjectConfiguration().general.settingsPassword)) } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/MainViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/MainViewModel.kt index e1439ebdb1..4d7209cb0f 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/MainViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/MainViewModel.kt @@ -4,14 +4,14 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel internal class MainViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) : ViewModel() { val consentRequired: LiveData @@ -23,6 +23,6 @@ internal class MainViewModel @Inject constructor( } private fun load() = viewModelScope.launch { - _consentRequired.postValue(configManager.getProjectConfiguration().consent.collectConsent) + _consentRequired.postValue(configRepository.getProjectConfiguration().consent.collectConsent) } } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModel.kt index 6629d78c52..c5c100c983 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModel.kt @@ -5,8 +5,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.domain.tokenization.TokenizableString -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor import com.simprints.infra.recent.user.activity.RecentUserActivityManager @@ -16,7 +16,7 @@ import javax.inject.Inject @HiltViewModel internal class ProjectDetailsViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, private val recentUserActivityManager: RecentUserActivityManager, private val tokenizationProcessor: TokenizationProcessor @@ -33,7 +33,7 @@ internal class ProjectDetailsViewModel @Inject constructor( fun load() = viewModelScope.launch { val state = try { val projectId = authStore.signedInProjectId - val cachedProject = configManager.getProject(projectId) + val cachedProject = configRepository.getProject(projectId) val recentUserActivity = recentUserActivityManager.getRecentUserActivity() val decryptedUserId = when(val userId = recentUserActivity.lastUserUsed) { is TokenizableString.Raw -> userId diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/sync/SyncViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/sync/SyncViewModel.kt index 5ef6378696..ec18ae3023 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/sync/SyncViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/main/sync/SyncViewModel.kt @@ -22,7 +22,7 @@ import com.simprints.feature.dashboard.views.SyncCardState.SyncTooManyRequests import com.simprints.feature.dashboard.views.SyncCardState.SyncTryAgain import com.simprints.infra.authlogic.AuthManager import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DownSynchronizationConfiguration import com.simprints.infra.config.store.models.SynchronizationConfiguration import com.simprints.infra.config.store.models.canSyncDataToSimprints @@ -46,7 +46,7 @@ import javax.inject.Inject internal class SyncViewModel @Inject constructor( private val eventSyncManager: EventSyncManager, private val connectivityTracker: ConnectivityTracker, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val timeHelper: TimeHelper, private val authStore: AuthStore, private val securityStateRepository: SecurityStateRepository, @@ -153,7 +153,7 @@ internal class SyncViewModel @Inject constructor( ) } } - configManager.getProjectConfiguration().also { configuration -> + configRepository.getProjectConfiguration().also { configuration -> _syncToBFSIDAllowed.postValue(configuration.canSyncDataToSimprints() || configuration.isEventDownSyncAllowed()) } eventSyncManager @@ -259,13 +259,13 @@ internal class SyncViewModel @Inject constructor( isDownSyncAllowed() && isSelectedModulesEmpty() && isModuleSync() private suspend fun isDownSyncAllowed() = - configManager.getProjectConfiguration().synchronization.frequency != SynchronizationConfiguration.Frequency.ONLY_PERIODICALLY_UP_SYNC + configRepository.getProjectConfiguration().synchronization.frequency != SynchronizationConfiguration.Frequency.ONLY_PERIODICALLY_UP_SYNC private suspend fun isSelectedModulesEmpty() = - configManager.getDeviceConfiguration().selectedModules.isEmpty() + configRepository.getDeviceConfiguration().selectedModules.isEmpty() private suspend fun isModuleSync() = - configManager.getProjectConfiguration().synchronization.down.partitionType == DownSynchronizationConfiguration.PartitionType.MODULE + configRepository.getProjectConfiguration().synchronization.down.partitionType == DownSynchronizationConfiguration.PartitionType.MODULE private fun isConnected() = connectivityTracker.observeIsConnected().value ?: true diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt index 3ed146e210..768aa30636 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/SettingsViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.logging.LoggingConstants @@ -15,7 +15,7 @@ import javax.inject.Inject @HiltViewModel internal class SettingsViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) : ViewModel() { val generalConfiguration: LiveData @@ -36,16 +36,16 @@ internal class SettingsViewModel @Inject constructor( fun updateLanguagePreference(language: String) { viewModelScope.launch { - configManager.updateDeviceConfiguration { it.apply { it.language = language } } + configRepository.updateDeviceConfiguration { it.apply { it.language = language } } _languagePreference.postValue(language) Simber.tag(LoggingConstants.CrashReportTag.SETTINGS.name).i("Language set to $language") } } private fun load() = viewModelScope.launch { - val configuration = configManager.getProjectConfiguration().general + val configuration = configRepository.getProjectConfiguration().general - _languagePreference.postValue(configManager.getDeviceConfiguration().language) + _languagePreference.postValue(configRepository.getDeviceConfiguration().language) _generalConfiguration.postValue(configuration) _settingsLocked.postValue(configuration.settingsPassword) } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/about/AboutViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/about/AboutViewModel.kt index 66fbff0735..70f86d3c75 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/about/AboutViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/about/AboutViewModel.kt @@ -9,7 +9,7 @@ import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.core.livedata.send import com.simprints.infra.authlogic.AuthManager import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.store.models.canSyncDataToSimprints @@ -24,7 +24,7 @@ import javax.inject.Inject @HiltViewModel internal class AboutViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authManager: AuthManager, private val authStore: AuthStore, private val eventSyncManager: EventSyncManager, @@ -76,14 +76,14 @@ internal class AboutViewModel @Inject constructor( eventSyncManager.countEventsToUpload(projectId = projectId, type = null).first() > 0 private suspend fun canSyncDataToSimprints(): Boolean = - configManager.getProjectConfiguration().canSyncDataToSimprints() + configRepository.getProjectConfiguration().canSyncDataToSimprints() private fun logout() { externalScope.launch { authManager.signOut() } } private fun load() = viewModelScope.launch { - val configuration = configManager.getProjectConfiguration() + val configuration = configRepository.getProjectConfiguration() val syncAndSearchConfig = SyncAndSearchConfig( configuration.synchronization.down.partitionType.name, configuration.identification.poolType.name, diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt index 0a1753b9f6..e1cf2238af 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModel.kt @@ -4,15 +4,15 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Finger -import com.simprints.infra.config.sync.ConfigManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel internal class FingerSelectionViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) : ViewModel() { val fingerSelections: LiveData> @@ -22,7 +22,7 @@ internal class FingerSelectionViewModel @Inject constructor( fun start() { viewModelScope.launch { _fingerSelections.postValue( - configManager.getProjectConfiguration().fingerprint!!.bioSdkConfiguration.fingersToCapture + configRepository.getProjectConfiguration().fingerprint!!.bioSdkConfiguration.fingersToCapture .toFingerSelectionItems() ) } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModel.kt index b90dd17619..2e6b29e87a 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModel.kt @@ -7,7 +7,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.feature.dashboard.settings.syncinfo.modulecount.ModuleCount -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.config.store.models.DownSynchronizationConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.SynchronizationConfiguration @@ -21,6 +20,7 @@ import com.simprints.infra.eventsync.status.models.EventSyncWorkerState import com.simprints.infra.images.ImageRepository import com.simprints.infra.logging.Simber import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository @@ -34,7 +34,7 @@ import javax.inject.Inject @HiltViewModel internal class SyncInfoViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, connectivityTracker: ConnectivityTracker, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val authStore: AuthStore, @@ -149,7 +149,7 @@ internal class SyncInfoViewModel @Inject constructor( val projectId = authStore.signedInProjectId awaitAll( - async { _configuration.postValue(configManager.getProjectConfiguration()) }, + async { _configuration.postValue(configRepository.getProjectConfiguration()) }, async { _recordsInLocal.postValue(getRecordsInLocal(projectId)) }, async { _recordsToUpSync.postValue(getRecordsToUpSync(projectId)) }, async { @@ -190,7 +190,7 @@ internal class SyncInfoViewModel @Inject constructor( ?: 0 private suspend fun fetchRecordsToCreateAndDeleteCount(): DownSyncCounts = - if (configManager.getProjectConfiguration().isEventDownSyncAllowed()) { + if (configRepository.getProjectConfiguration().isEventDownSyncAllowed()) { fetchAndUpdateRecordsToDownSyncAndDeleteCount() } else { DownSyncCounts(0, 0) @@ -205,7 +205,7 @@ internal class SyncInfoViewModel @Inject constructor( } private suspend fun getModuleCounts(projectId: String): List = - configManager.getDeviceConfiguration().selectedModules.map { moduleName -> + configRepository.getDeviceConfiguration().selectedModules.map { moduleName -> val count = enrolmentRecordRepository.count( SubjectQuery(projectId = projectId, moduleId = moduleName.value) ) @@ -214,7 +214,7 @@ internal class SyncInfoViewModel @Inject constructor( is TokenizableString.Tokenized -> tokenizationProcessor.decrypt( encrypted = moduleName, tokenKeyType = TokenKeyType.ModuleId, - project = configManager.getProject(projectId) + project = configRepository.getProject(projectId) ) } return@map ModuleCount(name = decryptedName.value, count = count) diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModel.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModel.kt index 434b3e6877..5685f2bd3c 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModel.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModel.kt @@ -11,10 +11,10 @@ import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.excepti import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository.Module import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository.ModuleRepository import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope @@ -24,9 +24,9 @@ import javax.inject.Inject @HiltViewModel internal class ModuleSelectionViewModel @Inject constructor( private val authStore: AuthStore, - private val repository: ModuleRepository, + private val moduleRepository: ModuleRepository, private val eventSyncManager: EventSyncManager, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val tokenizationProcessor: TokenizationProcessor, @ExternalScope private val externalScope: CoroutineScope, ) : ViewModel() { @@ -47,15 +47,15 @@ internal class ModuleSelectionViewModel @Inject constructor( init { postUpdateModules { - maxNumberOfModules = repository.getMaxNumberOfModules() + maxNumberOfModules = moduleRepository.getMaxNumberOfModules() initialModules = - repository.getModules().map { module -> + moduleRepository.getModules().map { module -> val decryptedName = when (val name = module.name) { is TokenizableString.Raw -> name is TokenizableString.Tokenized -> tokenizationProcessor.decrypt( encrypted = name, tokenKeyType = TokenKeyType.ModuleId, - project = configManager.getProject(authStore.signedInProjectId) + project = configRepository.getProject(authStore.signedInProjectId) ) } module.copy(name = decryptedName) @@ -66,7 +66,7 @@ internal class ModuleSelectionViewModel @Inject constructor( fun loadPasswordSettings() { viewModelScope.launch { - configManager.getProjectConfiguration() + configRepository.getProjectConfiguration() .general .settingsPassword .let { _screenLocked.postValue(it) } @@ -100,14 +100,14 @@ internal class ModuleSelectionViewModel @Inject constructor( is TokenizableString.Raw -> tokenizationProcessor.encrypt( decrypted = name, tokenKeyType = TokenKeyType.ModuleId, - project = configManager.getProject(authStore.signedInProjectId) + project = configRepository.getProject(authStore.signedInProjectId) ) is TokenizableString.Tokenized -> name } module.copy(name = encryptedName) } - repository.saveModules(modules) + moduleRepository.saveModules(modules) eventSyncManager.stop() eventSyncManager.sync() } diff --git a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImpl.kt b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImpl.kt index a8815313c8..0a5983179c 100644 --- a/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImpl.kt +++ b/feature/dashboard/src/main/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImpl.kt @@ -1,7 +1,7 @@ package com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository import com.simprints.core.domain.tokenization.values -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.store.domain.models.SubjectQuery import com.simprints.infra.eventsync.EventSyncManager @@ -12,13 +12,13 @@ import javax.inject.Inject // TODO move into the event system infra module? internal class ModuleRepositoryImpl @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val eventSyncManager: EventSyncManager, ) : ModuleRepository { override suspend fun getModules(): List = - configManager.getProjectConfiguration().synchronization.down.moduleOptions.map { + configRepository.getProjectConfiguration().synchronization.down.moduleOptions.map { Module(it, isModuleSelected(it.value)) } @@ -28,14 +28,15 @@ internal class ModuleRepositoryImpl @Inject constructor( } override suspend fun getMaxNumberOfModules(): Int = - configManager.getProjectConfiguration().synchronization.down.maxNbOfModules + configRepository.getProjectConfiguration().synchronization.down.maxNbOfModules private suspend fun isModuleSelected(moduleName: String): Boolean { - return configManager.getDeviceConfiguration().selectedModules.values().contains(moduleName) + return configRepository.getDeviceConfiguration().selectedModules.values() + .contains(moduleName) } private suspend fun setSelectedModules(selectedModules: List) { - configManager.updateDeviceConfiguration { + configRepository.updateDeviceConfiguration { it.apply { this.selectedModules = selectedModules.map { module -> module.name } logMessageForCrashReport("Modules set to ${this.selectedModules.values()}") diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModelTest.kt index 6ec43fe8a1..76af0e1eff 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/logout/LogoutSyncViewModelTest.kt @@ -3,7 +3,7 @@ package com.simprints.feature.dashboard.logout import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.assertThat import com.simprints.infra.authlogic.AuthManager -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.getOrAwaitValue @@ -25,7 +25,7 @@ internal class LogoutSyncViewModelTest { lateinit var authManager: AuthManager @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @get:Rule val rule = InstantTaskExecutorRule() @@ -41,7 +41,7 @@ internal class LogoutSyncViewModelTest { @Test fun `should logout correctly`() { val viewModel = LogoutSyncViewModel( - configManager = configManager, + configRepository = configRepository, authManager = authManager, externalScope = CoroutineScope(testCoroutineRule.testCoroutineDispatcher) ) @@ -54,13 +54,13 @@ internal class LogoutSyncViewModelTest { @Test fun `password config should be fetched after initialization`() { val config = SettingsPasswordConfig.Locked(password = "123") - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns mockk { every { settingsPassword } returns config } } val viewModel = LogoutSyncViewModel( - configManager = configManager, + configRepository = configRepository, authManager = authManager, externalScope = CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/MainViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/MainViewModelTest.kt index 14772bd3e6..76ce619532 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/MainViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/MainViewModelTest.kt @@ -2,7 +2,7 @@ package com.simprints.feature.dashboard.main import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.assertThat -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.coEvery import io.mockk.every @@ -18,7 +18,7 @@ class MainViewModelTest { @get:Rule val testCoroutineRule = TestCoroutineRule() - private val configManager = mockk { + private val configRepository = mockk { coEvery { getProjectConfiguration() } returns mockk { every { consent } returns mockk { every { collectConsent } returns true @@ -28,7 +28,7 @@ class MainViewModelTest { @Test fun `should initialize the live data correctly`() { - val viewModel = MainViewModel(configManager) + val viewModel = MainViewModel(configRepository) assertThat(viewModel.consentRequired.value).isEqualTo(true) } diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModelTest.kt index 1c1ca006e3..b994eebf1f 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/projectdetails/ProjectDetailsViewModelTest.kt @@ -4,46 +4,25 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.assertThat import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.asTokenizableEncrypted -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity import com.simprints.testtools.common.coroutines.TestCoroutineRule +import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.every -import io.mockk.mockk +import io.mockk.impl.annotations.MockK import kotlinx.coroutines.test.runTest +import org.junit.Before import org.junit.Rule import org.junit.Test class ProjectDetailsViewModelTest { - companion object { - private const val PROJECT_ID = "projectID" - private const val PROJECT_NAME = "name" - private const val LAST_SCANNER = "scanner" - private val LAST_USER = "user".asTokenizableEncrypted() - private val PROJECT = Project( - PROJECT_ID, - PROJECT_NAME, - "description", - "creator", - "bucket", - "", - tokenizationKeys = emptyMap() - ) - private val RECENT_USER_ACTIVITY = RecentUserActivity( - lastScannerVersion = "", - lastScannerUsed = LAST_SCANNER, - lastUserUsed = LAST_USER, - enrolmentsToday = 0, - identificationsToday = 0, - verificationsToday = 0, - lastActivityTime = 0 - ) - } @get:Rule val rule = InstantTaskExecutorRule() @@ -51,19 +30,31 @@ class ProjectDetailsViewModelTest { @get:Rule val testCoroutineRule = TestCoroutineRule() - private val authStore = mockk { - every { signedInProjectId } returns PROJECT_ID - } - private val configManager = mockk { - coEvery { getProject(PROJECT_ID) } returns PROJECT - } - private val tokenizationProcessor = mockk() - private val recentUserActivityManager = mockk { - coEvery { getRecentUserActivity() } returns RECENT_USER_ACTIVITY + @MockK + private lateinit var authStore: AuthStore + + @MockK + private lateinit var configRepository: ConfigRepository + + @MockK + private lateinit var tokenizationProcessor: TokenizationProcessor + + @MockK + private lateinit var recentUserActivityManager: RecentUserActivityManager + + private lateinit var viewModel: ProjectDetailsViewModel + + @Before + fun setUp() { + MockKAnnotations.init(this) + + every { authStore.signedInProjectId } returns PROJECT_ID + coEvery { recentUserActivityManager.getRecentUserActivity() } returns RECENT_USER_ACTIVITY } @Test fun `should initialize the live data correctly`() = runTest { + coEvery { configRepository.getProject(PROJECT_ID) } returns PROJECT every { tokenizationProcessor.decrypt( RECENT_USER_ACTIVITY.lastUserUsed as TokenizableString.Tokenized, @@ -71,8 +62,9 @@ class ProjectDetailsViewModelTest { PROJECT ) } returns RECENT_USER_ACTIVITY.lastUserUsed - val viewModel = ProjectDetailsViewModel( - configManager = configManager, + + viewModel = ProjectDetailsViewModel( + configRepository = configRepository, authStore = authStore, recentUserActivityManager = recentUserActivityManager, tokenizationProcessor = tokenizationProcessor @@ -84,11 +76,10 @@ class ProjectDetailsViewModelTest { @Test fun `Should handle exception by producing correct state`() = runTest { - val configManager = mockk { - coEvery { getProject(PROJECT_ID) } throws Exception() - } - val viewModel = ProjectDetailsViewModel( - configManager = configManager, + coEvery { configRepository.getProject(PROJECT_ID) } throws Exception() + + viewModel = ProjectDetailsViewModel( + configRepository = configRepository, authStore = authStore, recentUserActivityManager = recentUserActivityManager, tokenizationProcessor = tokenizationProcessor @@ -98,4 +89,30 @@ class ProjectDetailsViewModelTest { assertThat(viewModel.projectCardStateLiveData.value).isEqualTo(expectedState) } + companion object { + + private const val PROJECT_ID = "projectID" + private const val PROJECT_NAME = "name" + private const val LAST_SCANNER = "scanner" + private val LAST_USER = "user".asTokenizableEncrypted() + private val PROJECT = Project( + PROJECT_ID, + PROJECT_NAME, + "description", + "creator", + "bucket", + "", + tokenizationKeys = emptyMap() + ) + private val RECENT_USER_ACTIVITY = RecentUserActivity( + lastScannerVersion = "", + lastScannerUsed = LAST_SCANNER, + lastUserUsed = LAST_USER, + enrolmentsToday = 0, + identificationsToday = 0, + verificationsToday = 0, + lastActivityTime = 0 + ) + } + } diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/sync/SyncViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/sync/SyncViewModelTest.kt index 36b86049b3..260d6e451b 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/sync/SyncViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/main/sync/SyncViewModelTest.kt @@ -17,7 +17,8 @@ import com.simprints.feature.dashboard.views.SyncCardState.SyncProgress import com.simprints.feature.dashboard.views.SyncCardState.SyncTooManyRequests import com.simprints.feature.dashboard.views.SyncCardState.SyncTryAgain import com.simprints.infra.authlogic.AuthManager -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.DownSynchronizationConfiguration import com.simprints.infra.config.store.models.SynchronizationConfiguration @@ -27,7 +28,6 @@ import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.eventsync.status.models.EventSyncState import com.simprints.infra.eventsync.status.models.EventSyncWorkerState import com.simprints.infra.eventsync.status.models.EventSyncWorkerType -import com.simprints.infra.authstore.AuthStore import com.simprints.infra.network.ConnectivityTracker import com.simprints.infra.projectsecuritystore.SecurityStateRepository import com.simprints.infra.projectsecuritystore.securitystate.models.SecurityState @@ -73,7 +73,7 @@ class SyncViewModelTest { lateinit var connectivityTracker: ConnectivityTracker @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var timeHelper: TimeHelper @@ -93,7 +93,7 @@ class SyncViewModelTest { every { eventSyncManager.getLastSyncState() } returns syncState every { connectivityTracker.observeIsConnected() } returns isConnected - coEvery { configManager.getProjectConfiguration().synchronization } returns mockk { + coEvery { configRepository.getProjectConfiguration().synchronization } returns mockk { every { up.simprints } returns SimprintsUpSynchronizationConfiguration(kind = ALL) every { frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY_AND_ON_SESSION_START every { down.partitionType } returns DownSynchronizationConfiguration.PartitionType.MODULE @@ -155,7 +155,7 @@ class SyncViewModelTest { @Test fun `should post a SyncHasNoModules card state if the module selection is empty`() { - coEvery { configManager.getDeviceConfiguration() } returns DeviceConfiguration( + coEvery { configRepository.getDeviceConfiguration() } returns DeviceConfiguration( "", listOf(), "" @@ -168,7 +168,7 @@ class SyncViewModelTest { @Test fun `should post a SyncOffline card state if the device is not connected`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = false val syncCardLiveData = initViewModel().syncCardLiveData.getOrAwaitValue() @@ -177,7 +177,7 @@ class SyncViewModelTest { @Test fun `should post a SyncConnecting card state if the sync is running but not info are available`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = null val syncCardLiveData = initViewModel().syncCardLiveData.getOrAwaitValue() @@ -187,7 +187,7 @@ class SyncViewModelTest { @Test fun `should post a SyncDefault card state if there is no sync history`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState("", 0, 0, listOf(), listOf()) val syncCardLiveData = initViewModel().syncCardLiveData.getOrAwaitValue() @@ -197,7 +197,7 @@ class SyncViewModelTest { @Test fun `should post a SyncComplete card state if the sync is completed`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState( "", 0, 0, listOf(), @@ -215,7 +215,7 @@ class SyncViewModelTest { @Test fun `should post a SyncPendingUpload card state if there are records to upload`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration coEvery { eventSyncManager.countEventsToUpload(any(), any()) }.returns(flowOf(2)) isConnected.value = true @@ -234,7 +234,7 @@ class SyncViewModelTest { @Test fun `should post a SyncProgress card state if the sync is in progress`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState( "", 10, 40, listOf(), @@ -252,7 +252,7 @@ class SyncViewModelTest { @Test fun `should post a SyncConnecting card state if the sync is enqueued`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState( "", 10, 40, listOf(), @@ -270,7 +270,7 @@ class SyncViewModelTest { @Test fun `should post a SyncTooManyRequests card state if there are too many sync requests`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState( "", 10, 40, listOf(), listOf( @@ -287,7 +287,7 @@ class SyncViewModelTest { @Test fun `should post a SyncFailed card state if the sync fails because of cloud integration`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState( "", 10, 40, listOf(), listOf( @@ -304,7 +304,7 @@ class SyncViewModelTest { @Test fun `should post a SyncFailedBackendMaintenance card state if the sync fails because of cloud maintenance`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState( "", 10, 40, listOf(), @@ -322,7 +322,7 @@ class SyncViewModelTest { @Test fun `should post a SyncFailedBackendMaintenance with estimated outage card state if the sync fails because of cloud maintenance with outage`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState( "", 10, 40, listOf(), listOf( @@ -342,7 +342,7 @@ class SyncViewModelTest { @Test fun `should post a SyncTryAgain card state if the sync fails because of another thing`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration isConnected.value = true syncState.value = EventSyncState( "", 10, 40, listOf(), @@ -360,7 +360,7 @@ class SyncViewModelTest { @Test fun `should logout when project is ending and sync is complete`() { - coEvery { configManager.getDeviceConfiguration() } returns deviceConfiguration + coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration every { securityStateRepository.getSecurityStatusFromLocal() } returns SecurityState.Status.PROJECT_ENDING isConnected.value = true syncState.value = EventSyncState( @@ -383,7 +383,7 @@ class SyncViewModelTest { private fun initViewModel(): SyncViewModel = SyncViewModel( eventSyncManager = eventSyncManager, connectivityTracker = connectivityTracker, - configManager = configManager, + configRepository = configRepository, timeHelper = timeHelper, authStore = authStore, securityStateRepository = securityStateRepository, diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/SettingsViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/SettingsViewModelTest.kt index b67586f2ad..f404b65da8 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/SettingsViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/SettingsViewModelTest.kt @@ -2,14 +2,14 @@ package com.simprints.feature.dashboard.settings import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.assertThat -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.testtools.common.coroutines.TestCoroutineRule +import io.mockk.MockKAnnotations import io.mockk.coEvery -import io.mockk.every -import io.mockk.mockk +import io.mockk.impl.annotations.MockK import io.mockk.slot import kotlinx.coroutines.test.runTest import org.junit.Before @@ -18,10 +18,6 @@ import org.junit.Test class SettingsViewModelTest { - companion object { - private const val LANGUAGE = "fr" - } - @get:Rule val rule = InstantTaskExecutorRule() @@ -36,20 +32,20 @@ class SettingsViewModelTest { duplicateBiometricEnrolmentCheck = true, settingsPassword = SettingsPasswordConfig.Locked("1234"), ) - private val configManager = mockk { - coEvery { getProjectConfiguration() } returns mockk { - every { general } returns generalConfiguration - } - coEvery { getDeviceConfiguration() } returns mockk { - every { language } returns LANGUAGE - } - } + + @MockK + private lateinit var configRepository: ConfigRepository private lateinit var viewModel: SettingsViewModel @Before fun setup() { - viewModel = SettingsViewModel(configManager) + MockKAnnotations.init(this, relaxed = true) + + coEvery { configRepository.getProjectConfiguration().general } returns generalConfiguration + coEvery { configRepository.getDeviceConfiguration().language } returns LANGUAGE + + viewModel = SettingsViewModel(configRepository) } @Test @@ -63,7 +59,7 @@ class SettingsViewModelTest { fun `updateLanguagePreference should update the language`() = runTest { val updatedLanguage = "en" val updateConfigFn = slot DeviceConfiguration>() - coEvery { configManager.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit + coEvery { configRepository.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit viewModel.updateLanguagePreference(updatedLanguage) @@ -81,4 +77,10 @@ class SettingsViewModelTest { assertThat(viewModel.settingsLocked.value).isEqualTo(SettingsPasswordConfig.Unlocked) } + + companion object { + + private const val LANGUAGE = "fr" + } + } diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/about/AboutViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/about/AboutViewModelTest.kt index d628cf47fb..5599fc0366 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/about/AboutViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/about/AboutViewModelTest.kt @@ -5,7 +5,7 @@ import com.google.common.truth.Truth.assertThat import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.authlogic.AuthManager import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DownSynchronizationConfiguration import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.IdentificationConfiguration @@ -56,7 +56,7 @@ class AboutViewModelTest { private val authStore = mockk { every { signedInProjectId } returns PROJECT_ID } - private val configManager = mockk { + private val configRepository = mockk { coEvery { getProjectConfiguration() } returns buildProjectConfigurationMock() } @@ -68,7 +68,7 @@ class AboutViewModelTest { @Test fun `should initialize the live data correctly`() { val viewModel = AboutViewModel( - configManager = configManager, + configRepository = configRepository, authStore = authStore, eventSyncManager = eventSyncManager, recentUserActivityManager = recentUserActivityManager, @@ -185,11 +185,11 @@ class AboutViewModelTest { coEvery { eventSyncManager.countEventsToUpload(any(), any()) } returns flowOf( countEventsToUpload ) - coEvery { configManager.getProjectConfiguration() } returns buildProjectConfigurationMock( + coEvery { configRepository.getProjectConfiguration() } returns buildProjectConfigurationMock( upSyncKind ) return AboutViewModel( - configManager = configManager, + configRepository = configRepository, eventSyncManager = eventSyncManager, recentUserActivityManager = recentUserActivityManager, externalScope = CoroutineScope(testCoroutineRule.testCoroutineDispatcher), diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt index be5cee6b68..03a7151161 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/fingerselection/FingerSelectionViewModelTest.kt @@ -2,6 +2,7 @@ package com.simprints.feature.dashboard.settings.fingerselection import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Finger.LEFT_3RD_FINGER import com.simprints.infra.config.store.models.Finger.LEFT_4TH_FINGER import com.simprints.infra.config.store.models.Finger.LEFT_5TH_FINGER @@ -13,7 +14,6 @@ import com.simprints.infra.config.store.models.Finger.RIGHT_5TH_FINGER import com.simprints.infra.config.store.models.Finger.RIGHT_INDEX_FINGER import com.simprints.infra.config.store.models.Finger.RIGHT_THUMB import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.coEvery import io.mockk.every @@ -34,13 +34,11 @@ class FingerSelectionViewModelTest { private val fingerprintConfiguration = mockk { every { bioSdkConfiguration } returns bioSdkConfigurationMock } - private val configManager = mockk(relaxed = true) { - coEvery { getProjectConfiguration() } returns mockk { - every { fingerprint } returns fingerprintConfiguration - } + private val configRepository = mockk(relaxed = true) { + coEvery { getProjectConfiguration().fingerprint } returns fingerprintConfiguration } private val viewModel = FingerSelectionViewModel( - configManager, + configRepository, ) @Test diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModelTest.kt index c5adcd0108..bd27dd40d4 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/SyncInfoViewModelTest.kt @@ -7,7 +7,7 @@ import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.feature.dashboard.settings.syncinfo.modulecount.ModuleCount import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DownSynchronizationConfiguration import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.ProjectConfiguration @@ -43,6 +43,7 @@ import org.junit.Test class SyncInfoViewModelTest { companion object { + private const val PROJECT_ID = "projectId" } @@ -53,7 +54,7 @@ class SyncInfoViewModelTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepo: ConfigRepository @MockK private lateinit var enrolmentRecordRepository: EnrolmentRecordRepository @@ -92,9 +93,9 @@ class SyncInfoViewModelTest { stateLiveData = MutableLiveData() every { eventSyncManager.getLastSyncState() } returns stateLiveData - coEvery { configManager.getProject(PROJECT_ID) } returns project + coEvery { configRepo.getProject(PROJECT_ID) } returns project viewModel = SyncInfoViewModel( - configManager = configManager, + configRepository = configRepo, connectivityTracker = connectivityTracker, enrolmentRecordRepository = enrolmentRecordRepository, authStore = authStore, @@ -107,7 +108,7 @@ class SyncInfoViewModelTest { @Test fun `should initialize the configuration live data correctly`() = runTest { val configuration = mockk(relaxed = true) - coEvery { configManager.getProjectConfiguration() } returns configuration + coEvery { configRepo.getProjectConfiguration() } returns configuration viewModel.refreshInformation() @@ -152,7 +153,7 @@ class SyncInfoViewModelTest { val module2 = "module2".asTokenizableEncrypted() val numberForModule1 = 10 val numberForModule2 = 20 - coEvery { configManager.getDeviceConfiguration() } returns mockk { + coEvery { configRepo.getDeviceConfiguration() } returns mockk { every { selectedModules } returns listOf(module1, module2) } coEvery { @@ -197,7 +198,7 @@ class SyncInfoViewModelTest { val module1 = "module1".asTokenizableEncrypted() val creationForModules = 10 val deletionForModules = 5 - coEvery { configManager.getDeviceConfiguration() } returns mockk { + coEvery { configRepo.getDeviceConfiguration() } returns mockk { every { selectedModules } returns listOf(module1) } coEvery { @@ -330,7 +331,7 @@ class SyncInfoViewModelTest { @Test fun `emit correct sync availability when connection status changes`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepo.getProjectConfiguration() } returns mockk { every { synchronization } returns createMockDownSyncConfig( partitionType = DownSynchronizationConfiguration.PartitionType.MODULE, modules = listOf("module") @@ -348,7 +349,7 @@ class SyncInfoViewModelTest { @Test fun `emit correct sync availability when sync status changes`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepo.getProjectConfiguration() } returns mockk { every { synchronization } returns createMockDownSyncConfig( partitionType = DownSynchronizationConfiguration.PartitionType.MODULE, modules = listOf("module") @@ -391,7 +392,7 @@ class SyncInfoViewModelTest { @Test fun `emit correct sync availability when non-module config`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepo.getProjectConfiguration() } returns mockk { every { synchronization } returns createMockDownSyncConfig( partitionType = DownSynchronizationConfiguration.PartitionType.USER, ) @@ -405,7 +406,7 @@ class SyncInfoViewModelTest { @Test fun `emit correct sync availability when module config without modules`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepo.getProjectConfiguration() } returns mockk { every { synchronization } returns createMockDownSyncConfig( partitionType = DownSynchronizationConfiguration.PartitionType.MODULE, modules = emptyList() diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModelTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModelTest.kt index 6d089f08e1..449998094c 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModelTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/ModuleSelectionViewModelTest.kt @@ -11,11 +11,11 @@ import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.excepti import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository.Module import com.simprints.feature.dashboard.settings.syncinfo.moduleselection.repository.ModuleRepository import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.SettingsPasswordConfig import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.config.store.tokenization.TokenizationProcessor -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.eventsync.EventSyncManager import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.getOrAwaitValue @@ -44,7 +44,7 @@ class ModuleSelectionViewModelTest { private lateinit var eventSyncManager: EventSyncManager @MockK(relaxed = true) - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK(relaxed = true) private lateinit var tokenizationProcessor: TokenizationProcessor @@ -69,11 +69,11 @@ class ModuleSelectionViewModelTest { ) coEvery { repository.getModules() } returns modulesDefault coEvery { repository.getMaxNumberOfModules() } returns 2 - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general.settingsPassword } returns SettingsPasswordConfig.Locked("1234") } every { authStore.signedInProjectId } returns PROJECT_ID - coEvery { configManager.getProject(PROJECT_ID) } returns project + coEvery { configRepository.getProject(PROJECT_ID) } returns project modulesDefault.forEach { coEvery { tokenizationProcessor.decrypt( @@ -86,9 +86,9 @@ class ModuleSelectionViewModelTest { viewModel = ModuleSelectionViewModel( authStore = authStore, - repository = repository, + moduleRepository = repository, eventSyncManager = eventSyncManager, - configManager = configManager, + configRepository = configRepository, tokenizationProcessor = tokenizationProcessor, externalScope = CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) @@ -203,6 +203,7 @@ class ModuleSelectionViewModelTest { } companion object { + private const val PROJECT_ID = "projectId" } } diff --git a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImplTest.kt b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImplTest.kt index ed5c780f8c..8bd40cb338 100644 --- a/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImplTest.kt +++ b/feature/dashboard/src/test/java/com/simprints/feature/dashboard/settings/syncinfo/moduleselection/repository/ModuleRepositoryImplTest.kt @@ -3,16 +3,19 @@ package com.simprints.feature.dashboard.settings.syncinfo.moduleselection.reposi import com.google.common.truth.Truth.assertThat import com.simprints.core.domain.tokenization.TokenizableString import com.simprints.core.domain.tokenization.asTokenizableRaw -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.config.store.models.DownSynchronizationConfiguration import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.eventsync.EventSyncManager -import io.mockk.* +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every import io.mockk.impl.annotations.MockK - +import io.mockk.slot import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -26,7 +29,7 @@ class ModuleRepositoryImplTest { lateinit var projectConfiguration: ProjectConfiguration @MockK - lateinit var mockConfigManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var enrolmentRecordRepository: EnrolmentRecordRepository @@ -43,16 +46,16 @@ class ModuleRepositoryImplTest { every { projectConfiguration.general.modalities } returns listOf(GeneralConfiguration.Modality.FINGERPRINT) every { projectConfiguration.synchronization.down } returns downSynchronizationConfiguration - coEvery { mockConfigManager.getProjectConfiguration() } returns projectConfiguration + coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration every { downSynchronizationConfiguration.moduleOptions } returns listOf("a", "b", "c", "d").map(String::asTokenizableRaw) coEvery { - mockConfigManager.getDeviceConfiguration() + configRepository.getDeviceConfiguration() } returns DeviceConfiguration("", listOf("b", "c").map(TokenizableString::Tokenized), "") repository = ModuleRepositoryImpl( - mockConfigManager, + configRepository, enrolmentRecordRepository, eventSyncManager ) @@ -61,7 +64,7 @@ class ModuleRepositoryImplTest { @Test fun saveModules_shouldSaveSelectedModules() = runTest { val updateConfigFn = slot DeviceConfiguration>() - coEvery { mockConfigManager.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit + coEvery { configRepository.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit val modules = listOf( Module("1".asTokenizableRaw(), true), Module("2".asTokenizableRaw(), true), diff --git a/feature/enrol-last-biometric/build.gradle.kts b/feature/enrol-last-biometric/build.gradle.kts index 0b9ba6dcab..2f0944054f 100644 --- a/feature/enrol-last-biometric/build.gradle.kts +++ b/feature/enrol-last-biometric/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { implementation(project(":feature:alert")) implementation(project(":infra:event-sync")) - implementation(project(":infra:config-sync")) implementation(project(":infra:config-store")) implementation(project(":infra:events")) implementation(project(":infra:enrolment-records-store")) diff --git a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModel.kt b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModel.kt index 99a1579e84..faf6176ca5 100644 --- a/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModel.kt +++ b/feature/enrol-last-biometric/src/main/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModel.kt @@ -13,7 +13,7 @@ import com.simprints.feature.enrollast.screen.EnrolLastState.ErrorType.DUPLICATE import com.simprints.feature.enrollast.screen.EnrolLastState.ErrorType.GENERAL_ERROR import com.simprints.feature.enrollast.screen.usecase.BuildSubjectUseCase import com.simprints.feature.enrollast.screen.usecase.HasDuplicateEnrolmentsUseCase -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.store.domain.models.Subject import com.simprints.infra.enrolment.records.store.domain.models.SubjectAction @@ -31,7 +31,7 @@ import javax.inject.Inject @HiltViewModel internal class EnrolLastBiometricViewModel @Inject constructor( private val timeHelper: TimeHelper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val eventRepository: EventRepository, private val enrolmentRecordRepository: EnrolmentRecordRepository, private val hasDuplicateEnrolments: HasDuplicateEnrolmentsUseCase, @@ -53,7 +53,7 @@ internal class EnrolLastBiometricViewModel @Inject constructor( fun enrolBiometric(params: EnrolLastBiometricParams) = viewModelScope.launch { enrolWasAttempted = true - val projectConfig = configManager.getProjectConfiguration() + val projectConfig = configRepository.getProjectConfiguration() val modalities = projectConfig.general.modalities val previousLastEnrolmentResult = getPreviousEnrolmentResult(params.steps) diff --git a/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModelTest.kt b/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModelTest.kt index 785614cb01..7ce832a27f 100644 --- a/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModelTest.kt +++ b/feature/enrol-last-biometric/src/test/java/com/simprints/feature/enrollast/screen/EnrolLastBiometricViewModelTest.kt @@ -9,7 +9,7 @@ import com.simprints.feature.enrollast.EnrolLastBiometricParams import com.simprints.feature.enrollast.EnrolLastBiometricStepResult import com.simprints.feature.enrollast.screen.usecase.BuildSubjectUseCase import com.simprints.feature.enrollast.screen.usecase.HasDuplicateEnrolmentsUseCase -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.store.domain.models.Subject @@ -40,7 +40,7 @@ internal class EnrolLastBiometricViewModelTest { lateinit var timeHelper: TimeHelper @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var projectConfig: ProjectConfiguration @@ -67,7 +67,7 @@ internal class EnrolLastBiometricViewModelTest { fun setUp() { MockKAnnotations.init(this, relaxed = true) - coEvery { configManager.getProjectConfiguration() } returns projectConfig + coEvery { configRepository.getProjectConfiguration() } returns projectConfig every { projectConfig.general.modalities } returns emptyList() coEvery { eventRepository.getCurrentCaptureSessionEvent() } returns mockk { @@ -79,7 +79,7 @@ internal class EnrolLastBiometricViewModelTest { viewModel = EnrolLastBiometricViewModel( timeHelper, - configManager, + configRepository, eventRepository, enrolmentRecordRepository, hasDuplicateEnrolments, @@ -96,7 +96,7 @@ internal class EnrolLastBiometricViewModelTest { EnrolLastBiometricStepResult.EnrolLastBiometricsResult("previousSubjectId") ))) - coVerify(exactly = 1) { configManager.getProjectConfiguration() } + coVerify(exactly = 1) { configRepository.getProjectConfiguration() } } @Test diff --git a/feature/fetch-subject/build.gradle.kts b/feature/fetch-subject/build.gradle.kts index e7860c6c5d..98ebdf4fd4 100644 --- a/feature/fetch-subject/build.gradle.kts +++ b/feature/fetch-subject/build.gradle.kts @@ -16,6 +16,5 @@ dependencies { implementation(project(":infra:event-sync")) implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) } diff --git a/feature/fetch-subject/src/main/java/com/simprints/feature/fetchsubject/screen/FetchSubjectViewModel.kt b/feature/fetch-subject/src/main/java/com/simprints/feature/fetchsubject/screen/FetchSubjectViewModel.kt index ce071d6fce..51c0e76da9 100644 --- a/feature/fetch-subject/src/main/java/com/simprints/feature/fetchsubject/screen/FetchSubjectViewModel.kt +++ b/feature/fetch-subject/src/main/java/com/simprints/feature/fetchsubject/screen/FetchSubjectViewModel.kt @@ -9,7 +9,7 @@ import com.simprints.core.livedata.send import com.simprints.core.tools.time.TimeHelper import com.simprints.feature.fetchsubject.screen.usecase.FetchSubjectUseCase import com.simprints.feature.fetchsubject.screen.usecase.SaveSubjectFetchEventUseCase -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -19,7 +19,7 @@ internal class FetchSubjectViewModel @Inject constructor( private val timeHelper: TimeHelper, private val fetchSubjectUseCase: FetchSubjectUseCase, private val saveSubjectFetchEventUseCase: SaveSubjectFetchEventUseCase, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) : ViewModel() { val subjectState: LiveData> @@ -47,7 +47,7 @@ internal class FetchSubjectViewModel @Inject constructor( fun startExitForm() { viewModelScope.launch { - val modalities = configManager.getProjectConfiguration().general.modalities + val modalities = configRepository.getProjectConfiguration().general.modalities _subjectState.send(FetchSubjectState.ShowExitForm(modalities)) } } diff --git a/feature/fetch-subject/src/test/java/com/simprints/feature/fetchsubject/screen/FetchSubjectViewModelTest.kt b/feature/fetch-subject/src/test/java/com/simprints/feature/fetchsubject/screen/FetchSubjectViewModelTest.kt index 693ba377cf..4d9a73a90c 100644 --- a/feature/fetch-subject/src/test/java/com/simprints/feature/fetchsubject/screen/FetchSubjectViewModelTest.kt +++ b/feature/fetch-subject/src/test/java/com/simprints/feature/fetchsubject/screen/FetchSubjectViewModelTest.kt @@ -6,7 +6,7 @@ import com.jraska.livedata.test import com.simprints.core.tools.time.TimeHelper import com.simprints.feature.fetchsubject.screen.usecase.FetchSubjectUseCase import com.simprints.feature.fetchsubject.screen.usecase.SaveSubjectFetchEventUseCase -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.MockKAnnotations @@ -37,7 +37,7 @@ internal class FetchSubjectViewModelTest { lateinit var saveSubjectFetchEventUseCase: SaveSubjectFetchEventUseCase @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository private lateinit var viewModel: FetchSubjectViewModel @@ -51,7 +51,7 @@ internal class FetchSubjectViewModelTest { timeHelper, fetchSubjectUseCase, saveSubjectFetchEventUseCase, - configManager, + configRepository, ) } @@ -98,7 +98,7 @@ internal class FetchSubjectViewModelTest { @Test fun `startExitForm returns list of modalities`() { - coEvery { configManager.getProjectConfiguration().general.modalities } returns listOf( + coEvery { configRepository.getProjectConfiguration().general.modalities } returns listOf( GeneralConfiguration.Modality.FACE ) diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/CancelBackgroundSyncUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/CancelBackgroundSyncUseCase.kt index 5bed56e8aa..22b094ba54 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/CancelBackgroundSyncUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/CancelBackgroundSyncUseCase.kt @@ -1,6 +1,6 @@ package com.simprints.feature.logincheck.usecases -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.sync.ConfigurationScheduler import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.images.ImageUpSyncScheduler import javax.inject.Inject @@ -8,12 +8,12 @@ import javax.inject.Inject internal class CancelBackgroundSyncUseCase @Inject constructor( private val eventSyncManager: EventSyncManager, private val imageUpSyncScheduler: ImageUpSyncScheduler, - private val configManager: ConfigManager, + private val configScheduler: ConfigurationScheduler, ) { operator fun invoke() { eventSyncManager.cancelScheduledSync() imageUpSyncScheduler.cancelImageUpSync() - configManager.cancelScheduledSyncConfiguration() + configScheduler.cancelScheduledSync() } } diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCase.kt index 43cb6c8c27..a0b592e228 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCase.kt @@ -1,20 +1,20 @@ package com.simprints.feature.logincheck.usecases import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.LoggingConstants.CrashReportingCustomKeys import com.simprints.infra.logging.Simber import com.simprints.infra.orchestration.data.ActionRequest import javax.inject.Inject internal class ExtractCrashKeysUseCase @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val authStore: AuthStore, ) { suspend operator fun invoke(action: ActionRequest) { - val projectConfiguration = configManager.getProjectConfiguration() - val deviceConfiguration = configManager.getDeviceConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() + val deviceConfiguration = configRepository.getDeviceConfiguration() Simber.tag(CrashReportingCustomKeys.PROJECT_ID, true).i(authStore.signedInProjectId) Simber.tag(CrashReportingCustomKeys.USER_ID, true).i(action.userId.toString()) Simber.tag(CrashReportingCustomKeys.MODULE_IDS, true).i(deviceConfiguration.selectedModules.toString()) diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncIfNeededUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncIfNeededUseCase.kt index 715f5e8b3b..77cf904f13 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncIfNeededUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncIfNeededUseCase.kt @@ -1,8 +1,9 @@ package com.simprints.feature.logincheck.usecases import com.simprints.infra.authlogic.AuthManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SynchronizationConfiguration -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.sync.ConfigurationScheduler import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.images.ImageUpSyncScheduler import javax.inject.Inject @@ -10,17 +11,18 @@ import javax.inject.Inject internal class StartBackgroundSyncUseCase @Inject constructor( private val eventSyncManager: EventSyncManager, private val imageUpSyncScheduler: ImageUpSyncScheduler, - private val configManager: ConfigManager, + private val configScheduler: ConfigurationScheduler, + private val configRepository: ConfigRepository, private val authManager: AuthManager, ) { suspend operator fun invoke() { eventSyncManager.scheduleSync() imageUpSyncScheduler.scheduleImageUpSync() - configManager.scheduleSyncConfiguration() + configScheduler.scheduleSync() authManager.scheduleSecurityStateCheck() - val frequency = configManager.getProjectConfiguration().synchronization.frequency + val frequency = configRepository.getProjectConfiguration().synchronization.frequency if (frequency == SynchronizationConfiguration.Frequency.PERIODICALLY_AND_ON_SESSION_START) { eventSyncManager.sync() } diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCase.kt index f2e182a5d6..2514ec4bf1 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCase.kt @@ -1,14 +1,14 @@ package com.simprints.feature.logincheck.usecases import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.EventRepository import javax.inject.Inject internal class UpdateProjectInCurrentSessionUseCase @Inject constructor( private val eventRepository: EventRepository, private val authStore: AuthStore, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { suspend operator fun invoke() { @@ -16,10 +16,10 @@ internal class UpdateProjectInCurrentSessionUseCase @Inject constructor( val signedProjectId = authStore.signedInProjectId if (signedProjectId != currentSessionEvent.payload.projectId) { - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() currentSessionEvent.updateProjectId(signedProjectId) currentSessionEvent.updateModalities(projectConfiguration.general.modalities) - val deviceConfiguration = configManager.getDeviceConfiguration() + val deviceConfiguration = configRepository.getDeviceConfiguration() currentSessionEvent.updateLanguage(deviceConfiguration.language) eventRepository.addOrUpdateEvent(currentSessionEvent) } diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/CancelBackgroundSyncUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/CancelBackgroundSyncUseCaseTest.kt index 1782c2c99f..d2a58a8462 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/CancelBackgroundSyncUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/CancelBackgroundSyncUseCaseTest.kt @@ -1,6 +1,6 @@ package com.simprints.feature.logincheck.usecases -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.sync.ConfigurationScheduler import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.images.ImageUpSyncScheduler import io.mockk.MockKAnnotations @@ -18,7 +18,7 @@ class CancelBackgroundSyncUseCaseTest { lateinit var imageUpSyncScheduler: ImageUpSyncScheduler @MockK - lateinit var configManager: ConfigManager + lateinit var configScheduler: ConfigurationScheduler private lateinit var useCase: CancelBackgroundSyncUseCase @@ -29,7 +29,7 @@ class CancelBackgroundSyncUseCaseTest { useCase = CancelBackgroundSyncUseCase( eventSyncManager, imageUpSyncScheduler, - configManager + configScheduler ) } @@ -40,7 +40,7 @@ class CancelBackgroundSyncUseCaseTest { verify { eventSyncManager.cancelScheduledSync() imageUpSyncScheduler.cancelImageUpSync() - configManager.cancelScheduledSyncConfiguration() + configScheduler.cancelScheduledSync() } } } diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt index 2f4ae030fb..e6edf462e6 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt @@ -2,7 +2,7 @@ package com.simprints.feature.logincheck.usecases import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SynchronizationConfiguration import com.simprints.infra.logging.Simber import io.mockk.MockKAnnotations @@ -21,7 +21,7 @@ import org.junit.Test class ExtractCrashKeysUseCaseTest { @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var authStore: AuthStore @@ -33,7 +33,7 @@ class ExtractCrashKeysUseCaseTest { MockKAnnotations.init(this, relaxed = true) mockkObject(Simber) - useCase = ExtractCrashKeysUseCase(configManager, authStore) + useCase = ExtractCrashKeysUseCase(configRepository, authStore) } @After @@ -43,10 +43,10 @@ class ExtractCrashKeysUseCaseTest { @Test fun `Sets values to Simber`() = runTest { - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization.frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY } - coEvery { configManager.getDeviceConfiguration() } returns mockk { + coEvery { configRepository.getDeviceConfiguration() } returns mockk { every { selectedModules } returns listOf( "module1".asTokenizableRaw(), "module2".asTokenizableRaw() diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCaseTest.kt index d6ec3a5535..095da5783c 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/StartBackgroundSyncUseCaseTest.kt @@ -1,8 +1,9 @@ package com.simprints.feature.logincheck.usecases import com.simprints.infra.authlogic.AuthManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.SynchronizationConfiguration -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.sync.ConfigurationScheduler import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.images.ImageUpSyncScheduler import io.mockk.MockKAnnotations @@ -22,7 +23,10 @@ class StartBackgroundSyncUseCaseTest { lateinit var imageUpSyncScheduler: ImageUpSyncScheduler @MockK - lateinit var configManager: ConfigManager + lateinit var configScheduler: ConfigurationScheduler + + @MockK + lateinit var configRepository: ConfigRepository @MockK lateinit var authManager: AuthManager @@ -36,28 +40,29 @@ class StartBackgroundSyncUseCaseTest { useCase = StartBackgroundSyncUseCase( eventSyncManager, imageUpSyncScheduler, - configManager, + configScheduler, + configRepository, authManager, ) } @Test fun `Schedules all syncs when called`() = runTest { - coEvery { configManager.getProjectConfiguration().synchronization.frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY + coEvery { configRepository.getProjectConfiguration().synchronization.frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY useCase.invoke() verify { eventSyncManager.scheduleSync() imageUpSyncScheduler.scheduleImageUpSync() - configManager.scheduleSyncConfiguration() + configScheduler.scheduleSync() authManager.scheduleSecurityStateCheck() } } @Test fun `Starts event sync on start if required`() = runTest { - coEvery { configManager.getProjectConfiguration().synchronization.frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY_AND_ON_SESSION_START + coEvery { configRepository.getProjectConfiguration().synchronization.frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY_AND_ON_SESSION_START useCase.invoke() @@ -66,7 +71,7 @@ class StartBackgroundSyncUseCaseTest { @Test fun `Does not start event sync on start if not required`() = runTest { - coEvery { configManager.getProjectConfiguration().synchronization.frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY + coEvery { configRepository.getProjectConfiguration().synchronization.frequency } returns SynchronizationConfiguration.Frequency.PERIODICALLY useCase.invoke() diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCaseTest.kt index 2e4ccfe3f6..78d385ec17 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/UpdateProjectInCurrentSessionUseCaseTest.kt @@ -2,7 +2,7 @@ package com.simprints.feature.logincheck.usecases import com.google.common.truth.Truth.assertThat import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.session.DatabaseInfo import com.simprints.infra.events.event.domain.models.session.Device @@ -28,7 +28,7 @@ internal class UpdateProjectInCurrentSessionUseCaseTest { lateinit var authStore: AuthStore @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository lateinit var useCase: UpdateProjectInCurrentSessionUseCase @@ -37,11 +37,11 @@ internal class UpdateProjectInCurrentSessionUseCaseTest { MockKAnnotations.init(this, relaxed = true) every { authStore.signedInProjectId } returns SIGNED_PROJECT_ID - coEvery { configManager.getProjectConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general.modalities } returns emptyList() } - useCase = UpdateProjectInCurrentSessionUseCase(eventRepository, authStore, configManager) + useCase = UpdateProjectInCurrentSessionUseCase(eventRepository, authStore, configRepository) } @Test @@ -83,7 +83,7 @@ internal class UpdateProjectInCurrentSessionUseCaseTest { @Test fun `Update language in current session event when project ID updates`() = runTest { val language = "lang" - coEvery { configManager.getDeviceConfiguration() } returns mockk { + coEvery { configRepository.getDeviceConfiguration() } returns mockk { every { this@mockk.language } returns language } coEvery { eventRepository.getCurrentCaptureSessionEvent() } returns createBlankSessionEvent(OTHER_PROJECT_ID) diff --git a/feature/matcher/build.gradle.kts b/feature/matcher/build.gradle.kts index cbb107f7d1..3eb9f7f484 100644 --- a/feature/matcher/build.gradle.kts +++ b/feature/matcher/build.gradle.kts @@ -14,7 +14,6 @@ dependencies { implementation(project(":infra:enrolment-records-store")) implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":face:infra:face-bio-sdk")) implementation(project(":face:infra:roc-wrapper")) diff --git a/feature/matcher/src/main/java/com/simprints/matcher/usecases/FingerprintMatcherUseCase.kt b/feature/matcher/src/main/java/com/simprints/matcher/usecases/FingerprintMatcherUseCase.kt index b5e6b7857a..fa8fac9f00 100644 --- a/feature/matcher/src/main/java/com/simprints/matcher/usecases/FingerprintMatcherUseCase.kt +++ b/feature/matcher/src/main/java/com/simprints/matcher/usecases/FingerprintMatcherUseCase.kt @@ -7,10 +7,10 @@ import com.simprints.fingerprint.infra.basebiosdk.matching.domain.FingerIdentifi import com.simprints.fingerprint.infra.basebiosdk.matching.domain.Fingerprint import com.simprints.fingerprint.infra.basebiosdk.matching.domain.FingerprintIdentity import com.simprints.fingerprint.infra.biosdk.BioSdkWrapper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager -import com.simprints.infra.enrolment.records.store.domain.models.SubjectQuery import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository +import com.simprints.infra.enrolment.records.store.domain.models.SubjectQuery import com.simprints.infra.logging.LoggingConstants import com.simprints.matcher.FingerprintMatchResult import com.simprints.matcher.MatchParams @@ -24,7 +24,7 @@ import javax.inject.Inject internal class FingerprintMatcherUseCase @Inject constructor( private val enrolmentRecordRepository: EnrolmentRecordRepository, private val bioSdkWrapper: BioSdkWrapper, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val createRanges: CreateRangesUseCase, @DispatcherBG private val dispatcher: CoroutineDispatcher, ) : MatcherUseCase { @@ -89,7 +89,7 @@ internal class FingerprintMatcherUseCase @Inject constructor( isCrossFingerMatchingEnabled(flowType), ) - private suspend fun isCrossFingerMatchingEnabled(flowType: FlowType): Boolean = configManager + private suspend fun isCrossFingerMatchingEnabled(flowType: FlowType): Boolean = configRepository .takeIf { flowType == FlowType.VERIFY } ?.getProjectConfiguration() ?.fingerprint diff --git a/feature/matcher/src/main/java/com/simprints/matcher/usecases/SaveMatchEventUseCase.kt b/feature/matcher/src/main/java/com/simprints/matcher/usecases/SaveMatchEventUseCase.kt index f7638e69c4..ca9d164127 100644 --- a/feature/matcher/src/main/java/com/simprints/matcher/usecases/SaveMatchEventUseCase.kt +++ b/feature/matcher/src/main/java/com/simprints/matcher/usecases/SaveMatchEventUseCase.kt @@ -2,7 +2,7 @@ package com.simprints.matcher.usecases import com.simprints.core.ExternalScope import com.simprints.core.domain.common.FlowType -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.store.domain.models.SubjectQuery import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.FingerComparisonStrategy @@ -18,7 +18,7 @@ import com.simprints.infra.config.store.models.FingerprintConfiguration.FingerCo internal class SaveMatchEventUseCase @Inject constructor( private val eventRepository: EventRepository, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, @ExternalScope private val externalScope: CoroutineScope, ) { @@ -53,7 +53,7 @@ internal class SaveMatchEventUseCase @Inject constructor( } } - private suspend fun getFingerprintComparisonStrategy() = configManager.getProjectConfiguration() + private suspend fun getFingerprintComparisonStrategy() = configRepository.getProjectConfiguration() .fingerprint ?.bioSdkConfiguration ?.comparisonStrategyForVerification diff --git a/feature/matcher/src/test/java/com/simprints/matcher/usecases/FingerprintMatcherUseCaseTest.kt b/feature/matcher/src/test/java/com/simprints/matcher/usecases/FingerprintMatcherUseCaseTest.kt index 70fc4baf4f..7f5f056f49 100644 --- a/feature/matcher/src/test/java/com/simprints/matcher/usecases/FingerprintMatcherUseCaseTest.kt +++ b/feature/matcher/src/test/java/com/simprints/matcher/usecases/FingerprintMatcherUseCaseTest.kt @@ -6,7 +6,7 @@ import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.fingerprint.FingerprintSample import com.simprints.core.domain.fingerprint.IFingerIdentifier import com.simprints.fingerprint.infra.biosdk.BioSdkWrapper -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.store.domain.models.FingerprintIdentity import com.simprints.infra.enrolment.records.store.domain.models.SubjectQuery @@ -36,7 +36,7 @@ internal class FingerprintMatcherUseCaseTest { lateinit var bioSdkWrapper: BioSdkWrapper @MockK - lateinit var configManager: ConfigManager + lateinit var configRepository: ConfigRepository @MockK lateinit var createRangesUseCase: CreateRangesUseCase @@ -50,7 +50,7 @@ internal class FingerprintMatcherUseCaseTest { useCase = FingerprintMatcherUseCase( enrolmentRecordRepository, bioSdkWrapper, - configManager, + configRepository, createRangesUseCase, testCoroutineRule.testCoroutineDispatcher, ) diff --git a/feature/matcher/src/test/java/com/simprints/matcher/usecases/SaveMatchEventUseCaseTest.kt b/feature/matcher/src/test/java/com/simprints/matcher/usecases/SaveMatchEventUseCaseTest.kt index a5dc9afa77..d4a30e7522 100644 --- a/feature/matcher/src/test/java/com/simprints/matcher/usecases/SaveMatchEventUseCaseTest.kt +++ b/feature/matcher/src/test/java/com/simprints/matcher/usecases/SaveMatchEventUseCaseTest.kt @@ -3,8 +3,8 @@ package com.simprints.matcher.usecases import com.google.common.truth.Truth.assertThat import com.simprints.core.domain.common.FlowType import com.simprints.core.domain.fingerprint.IFingerIdentifier +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration.FingerComparisonStrategy -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.enrolment.records.store.domain.models.SubjectQuery import com.simprints.infra.events.EventRepository import com.simprints.infra.events.event.domain.models.OneToManyMatchEvent @@ -33,7 +33,7 @@ class SaveMatchEventUseCaseTest { private lateinit var eventRepository: EventRepository @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var useCase: SaveMatchEventUseCase @@ -45,12 +45,12 @@ class SaveMatchEventUseCaseTest { coEvery { eventRepository.addOrUpdateEvent(any()) } just Runs coEvery { - configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.comparisonStrategyForVerification + configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.comparisonStrategyForVerification } returns FingerComparisonStrategy.SAME_FINGER useCase = SaveMatchEventUseCase( eventRepository, - configManager, + configRepository, CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) } diff --git a/feature/orchestrator/build.gradle.kts b/feature/orchestrator/build.gradle.kts index e06d08812e..5f9e5c0a25 100644 --- a/feature/orchestrator/build.gradle.kts +++ b/feature/orchestrator/build.gradle.kts @@ -31,7 +31,6 @@ dependencies { implementation(project(":infra:enrolment-records-store")) implementation(project(":infra:recent-user-activity")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) implementation(project(":infra:event-sync")) implementation(project(":infra:images")) diff --git a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt index 344546233b..14bdb75339 100644 --- a/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt +++ b/feature/orchestrator/src/main/java/com/simprints/feature/orchestrator/OrchestratorViewModel.kt @@ -22,8 +22,8 @@ import com.simprints.feature.orchestrator.usecases.response.AppResponseBuilderUs import com.simprints.feature.orchestrator.usecases.steps.BuildStepsUseCase import com.simprints.feature.setup.LocationStore import com.simprints.fingerprint.capture.FingerprintCaptureResult +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.Simber import com.simprints.infra.orchestration.data.ActionRequest import com.simprints.matcher.MatchParams @@ -34,7 +34,7 @@ import javax.inject.Inject @HiltViewModel internal class OrchestratorViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val cache: OrchestratorCache, private val locationStore: LocationStore, private val stepsBuilder: BuildStepsUseCase, @@ -59,7 +59,7 @@ internal class OrchestratorViewModel @Inject constructor( private val _appResponse = MutableLiveData>() fun handleAction(action: ActionRequest) = viewModelScope.launch { - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() modalities = projectConfiguration.general.modalities.toSet() steps = stepsBuilder.build(action, projectConfiguration) @@ -114,7 +114,7 @@ internal class OrchestratorViewModel @Inject constructor( } private fun buildAppResponse() = viewModelScope.launch { - val projectConfiguration = configManager.getProjectConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() val cachedActionRequest = actionRequest val appResponse = appResponseBuilder( projectConfiguration, diff --git a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt index 057c259d76..8f375c04a8 100644 --- a/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt +++ b/feature/orchestrator/src/test/java/com/simprints/feature/orchestrator/OrchestratorViewModelTest.kt @@ -6,10 +6,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat import com.jraska.livedata.test import com.simprints.core.domain.common.FlowType +import com.simprints.core.domain.response.AppErrorReason import com.simprints.face.capture.FaceCaptureResult import com.simprints.feature.consent.ConsentResult import com.simprints.feature.orchestrator.cache.OrchestratorCache -import com.simprints.infra.orchestration.data.responses.AppErrorResponse import com.simprints.feature.orchestrator.steps.MatchStepStubPayload import com.simprints.feature.orchestrator.steps.Step import com.simprints.feature.orchestrator.steps.StepId @@ -24,9 +24,9 @@ import com.simprints.feature.orchestrator.usecases.steps.BuildStepsUseCase import com.simprints.feature.setup.LocationStore import com.simprints.feature.setup.SetupResult import com.simprints.fingerprint.capture.FingerprintCaptureResult -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.store.domain.models.SubjectQuery -import com.simprints.core.domain.response.AppErrorReason +import com.simprints.infra.orchestration.data.responses.AppErrorResponse import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.MockKAnnotations import io.mockk.coEvery @@ -52,7 +52,7 @@ internal class OrchestratorViewModelTest { val testCoroutineRule = TestCoroutineRule() @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var cache: OrchestratorCache @@ -89,7 +89,7 @@ internal class OrchestratorViewModelTest { MockKAnnotations.init(this, relaxed = true) viewModel = OrchestratorViewModel( - configManager, + configRepository, cache, locationStore, stepsBuilder, diff --git a/feature/setup/build.gradle.kts b/feature/setup/build.gradle.kts index a8588a93b0..ec0459f597 100644 --- a/feature/setup/build.gradle.kts +++ b/feature/setup/build.gradle.kts @@ -10,7 +10,6 @@ android { dependencies { implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(libs.playServices.location) implementation(libs.workManager.work) diff --git a/feature/setup/src/main/java/com/simprints/feature/setup/screen/SetupViewModel.kt b/feature/setup/src/main/java/com/simprints/feature/setup/screen/SetupViewModel.kt index 7edbfdf4f8..4a166ff0db 100644 --- a/feature/setup/src/main/java/com/simprints/feature/setup/screen/SetupViewModel.kt +++ b/feature/setup/src/main/java/com/simprints/feature/setup/screen/SetupViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.simprints.feature.setup.LocationStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -13,7 +13,7 @@ import javax.inject.Inject @HiltViewModel internal class SetupViewModel @Inject constructor( private val locationStore: LocationStore, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) : ViewModel() { val requestLocationPermission: LiveData @@ -45,5 +45,5 @@ internal class SetupViewModel @Inject constructor( } private suspend fun shouldCollectLocation() = - configManager.getProjectConfiguration().general.collectLocation + configRepository.getProjectConfiguration().general.collectLocation } diff --git a/feature/setup/src/test/java/com/simprints/feature/setup/screen/SetupViewModelTest.kt b/feature/setup/src/test/java/com/simprints/feature/setup/screen/SetupViewModelTest.kt index e5f23cdf5b..1ba826e702 100644 --- a/feature/setup/src/test/java/com/simprints/feature/setup/screen/SetupViewModelTest.kt +++ b/feature/setup/src/test/java/com/simprints/feature/setup/screen/SetupViewModelTest.kt @@ -3,7 +3,7 @@ package com.simprints.feature.setup.screen import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.jraska.livedata.test import com.simprints.feature.setup.LocationStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.coEvery import io.mockk.justRun @@ -23,13 +23,13 @@ class SetupViewModelTest { val testCoroutineRule = TestCoroutineRule() private val locationStore = mockk() - private val configManager = mockk() - private val viewModel = SetupViewModel(locationStore, configManager) + private val configRepository = mockk() + private val viewModel = SetupViewModel(locationStore, configRepository) @Test fun `should request location permission if collectLocation is enabled`() = runTest { // Given - coEvery { configManager.getProjectConfiguration().general.collectLocation } returns true + coEvery { configRepository.getProjectConfiguration().general.collectLocation } returns true // When viewModel.start() @@ -42,7 +42,7 @@ class SetupViewModelTest { @Test fun `should not request location permission if collectLocation is disabled`() = runTest { // Given - coEvery { configManager.getProjectConfiguration().general.collectLocation } returns false + coEvery { configRepository.getProjectConfiguration().general.collectLocation } returns false // when viewModel.start() @@ -69,7 +69,7 @@ class SetupViewModelTest { @Test fun `should request notification permission if collectLocation is disabled`() = runTest { // Given - coEvery { configManager.getProjectConfiguration().general.collectLocation } returns false + coEvery { configRepository.getProjectConfiguration().general.collectLocation } returns false // When viewModel.start() @@ -82,7 +82,7 @@ class SetupViewModelTest { @Test fun `should not request notification permission yet if collectLocation is enabled`() = runTest { // Given - coEvery { configManager.getProjectConfiguration().general.collectLocation } returns true + coEvery { configRepository.getProjectConfiguration().general.collectLocation } returns true // When viewModel.start() diff --git a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt index 8ee1efd724..d9156c16f8 100644 --- a/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt +++ b/fingerprint/capture/src/main/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModel.kt @@ -37,8 +37,8 @@ import com.simprints.fingerprint.infra.scanner.exceptions.safe.NoFingerDetectedE import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerDisconnectedException import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerOperationInterruptedException import com.simprints.fingerprint.infra.scanner.wrapper.ScannerWrapper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.images.model.Path import com.simprints.infra.images.model.SecuredImageRef import com.simprints.infra.logging.LoggingConstants.CrashReportTag.FINGER_CAPTURE @@ -56,7 +56,7 @@ import kotlin.math.min @HiltViewModel internal class FingerprintCaptureViewModel @Inject constructor( private val scannerManager: ScannerManager, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val timeHelper: TimeHelper, private val bioSdk: BioSdkWrapper, private val saveImage: SaveImageUseCase, @@ -156,7 +156,7 @@ internal class FingerprintCaptureViewModel @Inject constructor( bioSdk.initialize() // Configuration must be initialised when start returns for UI to be initialised correctly, // and since fetching happens on IO thread execution must be suspended until it is available - configuration = configManager.getProjectConfiguration().fingerprint!! + configuration = configRepository.getProjectConfiguration().fingerprint!! bioSdkConfiguration = configuration.bioSdkConfiguration } diff --git a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt index af0d704b33..50899a29b3 100644 --- a/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt +++ b/fingerprint/capture/src/test/java/com/simprints/fingerprint/capture/screen/FingerprintCaptureViewModelTest.kt @@ -29,10 +29,10 @@ import com.simprints.fingerprint.infra.scanner.exceptions.safe.NoFingerDetectedE import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerDisconnectedException import com.simprints.fingerprint.infra.scanner.wrapper.ScannerWrapper import com.simprints.fingerprint.testtools.FingerprintGenerator +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Vero1Configuration import com.simprints.infra.config.store.models.Vero2Configuration import com.simprints.infra.config.store.models.Vero2Configuration.ImageSavingStrategy -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.images.model.Path import com.simprints.testtools.common.coroutines.TestCoroutineRule import com.simprints.testtools.common.livedata.assertEventNotReceived @@ -72,7 +72,7 @@ class FingerprintCaptureViewModelTest { private lateinit var vero2Configuration: Vero2Configuration @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var scanner: ScannerWrapper @@ -105,7 +105,7 @@ class FingerprintCaptureViewModelTest { every { vero2Configuration.displayLiveFeedback } returns false every { vero2Configuration.captureStrategy } returns Vero2Configuration.CaptureStrategy.SECUGEN_ISO_1000_DPI every { vero2Configuration.imageSavingStrategy } returns ImageSavingStrategy.NEVER - coEvery { configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration } returns mockk { + coEvery { configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration } returns mockk { every { vero1 } returns Vero1Configuration(60) every { vero2 } returns vero2Configuration } @@ -122,7 +122,7 @@ class FingerprintCaptureViewModelTest { vm = FingerprintCaptureViewModel( scannerManager, - configManager, + configRepository, timeHelper, bioSdkWrapper, saveImageUseCase, diff --git a/fingerprint/connect/build.gradle.kts b/fingerprint/connect/build.gradle.kts index ada579c339..a63e7b92cf 100644 --- a/fingerprint/connect/build.gradle.kts +++ b/fingerprint/connect/build.gradle.kts @@ -10,7 +10,6 @@ android { dependencies { implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:events")) implementation(project(":infra:recent-user-activity")) diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModel.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModel.kt index c88c109c85..9b0b498fbc 100644 --- a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModel.kt +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ConnectScannerViewModel.kt @@ -21,8 +21,8 @@ import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerDisconnect import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerLowBatteryException import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerNotPairedException import com.simprints.fingerprint.infra.scanner.exceptions.unexpected.UnknownScannerIssueException +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.LoggingConstants import com.simprints.infra.logging.LoggingConstants.AnalyticsUserProperties import com.simprints.infra.logging.Simber @@ -34,7 +34,7 @@ import javax.inject.Inject @HiltViewModel internal class ConnectScannerViewModel @Inject constructor( - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val scannerManager: ScannerManager, private val nfcManager: NfcManager, private val recentUserActivityManager: RecentUserActivityManager, @@ -70,7 +70,7 @@ internal class ConnectScannerViewModel @Inject constructor( fun init(params: FingerprintConnectParams) = viewModelScope.launch { isReconnect = params.isReconnect - allowedGenerations = configManager.getProjectConfiguration() + allowedGenerations = configRepository.getProjectConfiguration() .fingerprint ?.allowedScanners .orEmpty() diff --git a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModel.kt b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModel.kt index 80242e6534..24ef75b8d2 100644 --- a/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModel.kt +++ b/fingerprint/connect/src/main/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModel.kt @@ -16,7 +16,7 @@ import com.simprints.fingerprint.infra.scanner.domain.ota.AvailableOta import com.simprints.fingerprint.infra.scanner.domain.ota.OtaRecoveryStrategy import com.simprints.fingerprint.infra.scanner.domain.ota.OtaRecoveryStrategy.* import com.simprints.fingerprint.infra.scanner.domain.ota.OtaStep -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.Simber import com.simprints.infra.network.exceptions.BackendMaintenanceException import com.simprints.infra.recent.user.activity.RecentUserActivityManager @@ -35,7 +35,7 @@ internal class OtaViewModel @Inject constructor( private val reportFirmwareUpdate: ReportFirmwareUpdateEventUseCase, private val timeHelper: TimeHelper, private val recentUserActivityManager: RecentUserActivityManager, - private val configManager: ConfigManager + private val configRepository: ConfigRepository ) : ViewModel() { val progress: LiveData @@ -93,7 +93,7 @@ internal class OtaViewModel @Inject constructor( private suspend fun targetVersions(availableOta: AvailableOta): String { val scannerVersion = recentUserActivityManager.getRecentUserActivity().lastScannerVersion val availableFirmwareVersions = - configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions + configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions return when (availableOta) { AvailableOta.CYPRESS -> availableFirmwareVersions?.get(scannerVersion)?.cypress ?: "" AvailableOta.STM -> availableFirmwareVersions?.get(scannerVersion)?.stm ?: "" 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 040c60dc46..f94433c4c0 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 @@ -26,8 +26,8 @@ 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.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity import com.simprints.testtools.common.coroutines.TestCoroutineRule @@ -35,15 +35,8 @@ import com.simprints.testtools.common.livedata.assertEventReceivedWithContent import com.simprints.testtools.common.livedata.assertEventReceivedWithContentAssertions import com.simprints.testtools.common.livedata.assertEventWithContentNeverReceived import com.simprints.testtools.common.livedata.testObserver -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coJustRun -import io.mockk.coVerify -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.MockK -import io.mockk.mockk -import io.mockk.slot -import io.mockk.verify import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule @@ -64,7 +57,7 @@ class ConnectScannerViewModelTest { private lateinit var fingerprintConfiguration: FingerprintConfiguration @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var bluetoothAdapter: ComponentBluetoothAdapter @@ -93,7 +86,7 @@ class ConnectScannerViewModelTest { FingerprintConfiguration.VeroGeneration.VERO_1, FingerprintConfiguration.VeroGeneration.VERO_2 ) - coEvery { configManager.getProjectConfiguration().fingerprint } returns fingerprintConfiguration + coEvery { configRepository.getProjectConfiguration().fingerprint } returns fingerprintConfiguration coJustRun { scannerFactory.initScannerOperationWrappers(any()) } scannerManager = ScannerManagerImpl( @@ -104,7 +97,7 @@ class ConnectScannerViewModelTest { mockk(relaxed = true), ) viewModel = ConnectScannerViewModel( - configManager, + configRepository, scannerManager, nfcManager, recentUserActivityManager, @@ -212,7 +205,7 @@ class ConnectScannerViewModelTest { fun start_noScannersPairedWithoutFingerprintConfigAndNfc_sendsSerialEntryIssueEvent() = runTest { setupBluetooth(numberOfPairedScanners = 0) setupNfc(doesDeviceHaveNfcCapability = false, isEnabled = true) - coEvery { configManager.getProjectConfiguration().fingerprint } returns null + coEvery { configRepository.getProjectConfiguration().fingerprint } returns null val connectScannerIssueObserver = viewModel.showScannerIssueScreen.testObserver() diff --git a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModelTest.kt b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModelTest.kt index b7733a51b8..c12558c3a9 100644 --- a/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModelTest.kt +++ b/fingerprint/connect/src/test/java/com/simprints/fingerprint/connect/screens/ota/OtaViewModelTest.kt @@ -13,8 +13,8 @@ import com.simprints.fingerprint.infra.scanner.domain.ota.StmOtaStep import com.simprints.fingerprint.infra.scanner.domain.ota.Un20OtaStep import com.simprints.fingerprint.infra.scanner.exceptions.safe.OtaFailedException import com.simprints.fingerprint.infra.scanner.wrapper.ScannerOtaOperationsWrapper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Vero2Configuration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.network.exceptions.BackendMaintenanceException import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity @@ -62,7 +62,7 @@ class OtaViewModelTest { private lateinit var recentUserActivityManager: RecentUserActivityManager @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var otaViewModel: OtaViewModel @@ -74,7 +74,7 @@ class OtaViewModelTest { coEvery { recentUserActivityManager.getRecentUserActivity() } returns RecentUserActivity(HARDWARE_VERSION, "", "".asTokenizableRaw(), 0, 0, 0, 0) - coEvery { configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions } returns mapOf( + coEvery { configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions } returns mapOf( HARDWARE_VERSION to Vero2Configuration.Vero2FirmwareVersions( NEW_CYPRESS_VERSION, NEW_STM_VERSION, @@ -92,7 +92,7 @@ class OtaViewModelTest { reportFirmwareUpdate, timeHelperMock, recentUserActivityManager, - configManager + configRepository ) } diff --git a/fingerprint/infra/scanner/build.gradle.kts b/fingerprint/infra/scanner/build.gradle.kts index e6ef7e5888..6a0b8898ab 100644 --- a/fingerprint/infra/scanner/build.gradle.kts +++ b/fingerprint/infra/scanner/build.gradle.kts @@ -34,7 +34,6 @@ dependencies { runtimeOnly(libs.jackson.core) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:auth-store")) implementation(project(":infra:recent-user-activity")) diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/ScannerPairingManager.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/ScannerPairingManager.kt index 0641edda51..22c72b1752 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/ScannerPairingManager.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/ScannerPairingManager.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.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.recent.user.activity.RecentUserActivityManager import javax.inject.Inject @@ -21,7 +21,7 @@ class ScannerPairingManager @Inject internal constructor( private val recentUserActivityManager: RecentUserActivityManager, private val scannerGenerationDeterminer: ScannerGenerationDeterminer, private val serialNumberConverter: SerialNumberConverter, - private val configManager: ConfigManager + private val configRepository: ConfigRepository ) { /** @@ -56,7 +56,7 @@ class ScannerPairingManager @Inject internal constructor( } private suspend fun isScannerGenerationValidForProject(address: String): Boolean = - configManager.getProjectConfiguration().fingerprint?.allowedScanners?.contains( + configRepository.getProjectConfiguration().fingerprint?.allowedScanners?.contains( scannerGenerationDeterminer.determineScannerGenerationFromSerialNumber( serialNumberConverter.convertMacAddressToSerialNumber(address) ) diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepository.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepository.kt index 2871fe3e01..2549eaf659 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepository.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepository.kt @@ -4,7 +4,7 @@ import com.simprints.fingerprint.infra.scanner.data.local.FirmwareLocalDataSourc import com.simprints.fingerprint.infra.scanner.data.remote.FirmwareRemoteDataSource import com.simprints.fingerprint.infra.scanner.domain.ota.DownloadableFirmwareVersion import com.simprints.fingerprint.infra.scanner.domain.ota.DownloadableFirmwareVersion.Chip -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.Simber import javax.inject.Inject @@ -16,7 +16,7 @@ import javax.inject.Inject class FirmwareRepository @Inject internal constructor( private val firmwareRemoteDataSource: FirmwareRemoteDataSource, private val firmwareLocalDataSource: FirmwareLocalDataSource, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { /** @@ -24,7 +24,7 @@ class FirmwareRepository @Inject internal constructor( * first checks the local version and matches that against the remote versions, then subsequently updating the rlocal versios that need to be updated. */ suspend fun updateStoredFirmwareFilesWithLatest() { - configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions?.keys?.forEach { hardwareVersion -> + configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions?.keys?.forEach { hardwareVersion -> updateStoredFirmwareFilesWithLatest(hardwareVersion) } } @@ -81,7 +81,7 @@ class FirmwareRepository @Inject internal constructor( val cypressOfficialVersions = mutableSetOf() val stmOfficialVersions = mutableSetOf() val un20OfficialVersions = mutableSetOf() - configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions?.entries?.forEach { + configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions?.entries?.forEach { cypressOfficialVersions.add(it.value.cypress) stmOfficialVersions.add(it.value.stm) un20OfficialVersions.add(it.value.un20) diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/remote/FirmwareRemoteDataSource.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/remote/FirmwareRemoteDataSource.kt index 2510007dfb..d5a7fa7710 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/remote/FirmwareRemoteDataSource.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/remote/FirmwareRemoteDataSource.kt @@ -3,7 +3,7 @@ package com.simprints.fingerprint.infra.scanner.data.remote import com.simprints.fingerprint.infra.scanner.data.remote.network.FingerprintFileDownloader import com.simprints.fingerprint.infra.scanner.domain.ota.DownloadableFirmwareVersion import com.simprints.fingerprint.infra.scanner.domain.versions.getAvailableVersionsForDownload -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.logging.Simber import javax.inject.Inject @@ -14,7 +14,7 @@ import javax.inject.Inject */ internal class FirmwareRemoteDataSource @Inject constructor( private val fingerprintFileDownloader: FingerprintFileDownloader, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, ) { /** @@ -24,7 +24,7 @@ internal class FirmwareRemoteDataSource @Inject constructor( hardwareVersion: String, localFirmwareVersions: Map> ): List = - configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions?.getAvailableVersionsForDownload( + configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions?.getAvailableVersionsForDownload( hardwareVersion, localFirmwareVersions ) ?: listOf() diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/worker/FirmwareFileUpdateScheduler.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/worker/FirmwareFileUpdateScheduler.kt index 4342075858..6f68a8da8b 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/worker/FirmwareFileUpdateScheduler.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/data/worker/FirmwareFileUpdateScheduler.kt @@ -9,8 +9,8 @@ import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager import com.simprints.core.ExternalScope import com.simprints.fingerprint.infra.scanner.BuildConfig +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -22,17 +22,17 @@ import javax.inject.Inject * firmware version, if any updates available, on the device. * * @property context the application context used for scheduling the worker - * @property configManager the configuration manager for checking the version of the connected Vero scanner + * @property configRepository the configuration manager for checking the version of the connected Vero scanner */ class FirmwareFileUpdateScheduler @Inject constructor( @ApplicationContext private val context: Context, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, @ExternalScope private val externalScope: CoroutineScope, ) { fun scheduleOrCancelWorkIfNecessary() { externalScope.launch { - if (configManager.getProjectConfiguration().fingerprint?.allowedScanners?.contains( + if (configRepository.getProjectConfiguration().fingerprint?.allowedScanners?.contains( FingerprintConfiguration.VeroGeneration.VERO_2 ) == true ) { @@ -66,6 +66,7 @@ class FirmwareFileUpdateScheduler @Inject constructor( .build() companion object { + const val WORK_NAME = "firmware-file-update-work" const val REPEAT_INTERVAL = BuildConfig.FIRMWARE_UPDATE_WORKER_INTERVAL_MINUTES val REPEAT_INTERVAL_UNIT = TimeUnit.MINUTES diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelper.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelper.kt index d758debc82..9982e82a51 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelper.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelper.kt @@ -9,8 +9,8 @@ import com.simprints.fingerprint.infra.scanner.domain.versions.ScannerVersion import com.simprints.fingerprint.infra.scanner.exceptions.safe.OtaAvailableException import com.simprints.fingerprint.infra.scanner.tools.BatteryLevelChecker import com.simprints.fingerprint.infra.scanner.v2.scanner.Scanner +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Vero2Configuration -import com.simprints.infra.config.sync.ConfigManager import kotlinx.coroutines.delay import kotlinx.coroutines.rx2.await import javax.inject.Inject @@ -22,13 +22,12 @@ import javax.inject.Inject internal class ScannerInitialSetupHelper @Inject constructor( private val connectionHelper: ConnectionHelper, private val batteryLevelChecker: BatteryLevelChecker, - private val configManager: ConfigManager, - private val firmwareLocalDataSource: FirmwareLocalDataSource + private val configRepository: ConfigRepository, + private val firmwareLocalDataSource: FirmwareLocalDataSource, ) { private lateinit var scannerVersion: ScannerVersion - /** * This method is responsible for checking if any firmware updates are available, the current * scanner firmware version [ScannerVersion] and the current battery information [BatteryInfo]. @@ -44,7 +43,7 @@ internal class ScannerInitialSetupHelper @Inject constructor( scanner: Scanner, macAddress: String, withScannerVersion: (ScannerVersion) -> Unit, - withBatteryInfo: (BatteryInfo) -> Unit + withBatteryInfo: (BatteryInfo) -> Unit, ) { delay(100) // Speculatively needed val unifiedVersionInfo = scanner.getVersionInformation().await() @@ -68,7 +67,7 @@ internal class ScannerInitialSetupHelper @Inject constructor( private suspend fun getBatteryInfo( scanner: Scanner, - withBatteryInfo: (BatteryInfo) -> Unit + withBatteryInfo: (BatteryInfo) -> Unit, ): BatteryInfo { val batteryPercent = scanner.getBatteryPercentCharge().await() val batteryVoltage = scanner.getBatteryVoltageMilliVolts().await() @@ -89,10 +88,10 @@ internal class ScannerInitialSetupHelper @Inject constructor( hardwareVersion: String, scanner: Scanner, macAddress: String, - batteryInfo: BatteryInfo + batteryInfo: BatteryInfo, ) { val availableVersions = - configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions?.get( + configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions?.get( hardwareVersion ) val availableOtas = determineAvailableOtas(scannerVersion.firmware, availableVersions) @@ -108,7 +107,7 @@ internal class ScannerInitialSetupHelper @Inject constructor( private suspend fun determineAvailableOtas( current: ScannerFirmwareVersions, - available: Vero2Configuration.Vero2FirmwareVersions? + available: Vero2Configuration.Vero2FirmwareVersions?, ): List { if (available == null) { return emptyList() diff --git a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactory.kt b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactory.kt index a059003532..50b01b7dc2 100644 --- a/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactory.kt +++ b/fingerprint/infra/scanner/src/main/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactory.kt @@ -12,8 +12,8 @@ import com.simprints.fingerprint.infra.scanner.tools.ScannerGenerationDeterminer import com.simprints.fingerprint.infra.scanner.tools.SerialNumberConverter import com.simprints.fingerprint.infra.scanner.v2.scanner.create import com.simprints.fingerprint.infra.scanner.v2.tools.ScannerUiHelper +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.logging.Simber import kotlinx.coroutines.CoroutineDispatcher import javax.inject.Inject @@ -24,7 +24,7 @@ import com.simprints.fingerprint.infra.scanner.v2.scanner.Scanner as ScannerV2 @Singleton class ScannerFactory @Inject internal constructor( private val bluetoothAdapter: ComponentBluetoothAdapter, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val scannerUiHelper: ScannerUiHelper, private val serialNumberConverter: SerialNumberConverter, private val scannerGenerationDeterminer: ScannerGenerationDeterminer, @@ -45,7 +45,7 @@ class ScannerFactory @Inject internal constructor( suspend fun initScannerOperationWrappers(macAddress: String) { val availableScannerGenerations = - configManager.getProjectConfiguration().fingerprint?.allowedScanners ?: listOf() + configRepository.getProjectConfiguration().fingerprint?.allowedScanners ?: listOf() val scannerGenerationToUse = when (availableScannerGenerations.size) { 1 -> availableScannerGenerations.single() 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 7c830c7b49..a4ca2c9b97 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 @@ -10,8 +10,8 @@ import com.simprints.fingerprint.infra.scanner.exceptions.safe.ScannerNotPairedE 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.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity import com.simprints.testtools.common.syntax.assertThrows @@ -46,7 +46,7 @@ class ScannerPairingManagerTest { coEvery { getRecentUserActivity() } returns recentUserActivity } private val fingerprintConfiguration = mockk() - private val configManager = mockk { + private val configRepository = mockk { coEvery { getProjectConfiguration() } returns mockk { every { fingerprint } returns fingerprintConfiguration } @@ -56,7 +56,7 @@ class ScannerPairingManagerTest { recentUserActivityManager, scannerGenerationDeterminerMock, serialNumberConverterMock, - configManager + configRepository ) @Test diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepositoryTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepositoryTest.kt index 705b655f92..e657868b37 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepositoryTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/FirmwareRepositoryTest.kt @@ -4,8 +4,8 @@ import com.simprints.fingerprint.infra.scanner.data.local.FirmwareLocalDataSourc import com.simprints.fingerprint.infra.scanner.data.remote.FirmwareRemoteDataSource import com.simprints.fingerprint.infra.scanner.domain.ota.DownloadableFirmwareVersion import com.simprints.fingerprint.infra.scanner.domain.versions.getAvailableVersionsForDownload +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Vero2Configuration -import com.simprints.infra.config.sync.ConfigManager import io.mockk.MockKAnnotations import io.mockk.Ordering import io.mockk.coEvery @@ -28,7 +28,7 @@ class FirmwareRepositoryTest { private lateinit var vero2Configuration: Vero2Configuration @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository private lateinit var firmwareRepository: FirmwareRepository @@ -37,7 +37,7 @@ class FirmwareRepositoryTest { MockKAnnotations.init(this, relaxed = true) coEvery { - configManager.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2 + configRepository.getProjectConfiguration().fingerprint?.bioSdkConfiguration?.vero2 } returns vero2Configuration every { vero2Configuration.firmwareVersions } returns mapOf( @@ -51,7 +51,7 @@ class FirmwareRepositoryTest { firmwareRepository = FirmwareRepository( firmwareRemoteDataSourceMock, firmwareLocalDataSourceMock, - configManager + configRepository ) } diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/remote/FirmwareRemoteDataSourceTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/remote/FirmwareRemoteDataSourceTest.kt index d39bb32ab8..dc9fe223af 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/remote/FirmwareRemoteDataSourceTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/remote/FirmwareRemoteDataSourceTest.kt @@ -4,8 +4,8 @@ import com.google.common.truth.Truth.assertThat import com.simprints.fingerprint.infra.scanner.data.FirmwareTestData import com.simprints.fingerprint.infra.scanner.data.remote.network.FingerprintFileDownloader import com.simprints.fingerprint.infra.scanner.domain.ota.DownloadableFirmwareVersion +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Vero2Configuration -import com.simprints.infra.config.sync.ConfigManager import io.mockk.coEvery import io.mockk.every import io.mockk.mockk @@ -15,7 +15,7 @@ import org.junit.Test class FirmwareRemoteDataSourceTest { private val fingerprintFileDownloaderMock: FingerprintFileDownloader = mockk() - private val fingerprintPreferencesMock = mockk { + private val fingerprintPreferencesMock = mockk { coEvery { getProjectConfiguration() } returns mockk { every { fingerprint?.bioSdkConfiguration?.vero2?.firmwareVersions } returns RESPONSE_MAP } diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/worker/FirmwareFileUpdateSchedulerTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/worker/FirmwareFileUpdateSchedulerTest.kt index fa8a7c7be6..c08df94500 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/worker/FirmwareFileUpdateSchedulerTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/data/worker/FirmwareFileUpdateSchedulerTest.kt @@ -1,8 +1,8 @@ package com.simprints.fingerprint.infra.scanner.data.worker import androidx.work.WorkManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.coroutines.TestCoroutineRule import io.mockk.coEvery import io.mockk.every @@ -24,7 +24,7 @@ class FirmwareFileUpdateSchedulerTest { private val workManagerMock = mockk() private val fingerprintConfiguration = mockk() - private val configManager = mockk { + private val configRepository = mockk { coEvery { getProjectConfiguration() } returns mockk { every { fingerprint } returns fingerprintConfiguration } @@ -33,7 +33,7 @@ class FirmwareFileUpdateSchedulerTest { private val firmwareFileUpdateScheduler = FirmwareFileUpdateScheduler( mockk(), - configManager, + configRepository, CoroutineScope(testCoroutineRule.testCoroutineDispatcher), ) diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelperTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelperTest.kt index 68084917fc..2dd3cdcf0c 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelperTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/helpers/ScannerInitialSetupHelperTest.kt @@ -14,8 +14,8 @@ import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.CypressFirm import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.ScannerInformation import com.simprints.fingerprint.infra.scanner.v2.domain.root.models.UnifiedVersionInformation import com.simprints.fingerprint.infra.scanner.v2.scanner.Scanner +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Vero2Configuration -import com.simprints.infra.config.sync.ConfigManager import com.simprints.testtools.common.syntax.assertThrows import io.mockk.coEvery import io.mockk.coVerify @@ -33,7 +33,7 @@ class ScannerInitialSetupHelperTest { private val connectionHelperMock = mockk() private val batteryLevelChecker = mockk() private val vero2Configuration = mockk() - private val configManager = mockk { + private val configRepository = mockk { coEvery { getProjectConfiguration() } returns mockk { every { fingerprint?.bioSdkConfiguration?.vero2 } returns vero2Configuration } @@ -42,7 +42,7 @@ class ScannerInitialSetupHelperTest { private val scannerInitialSetupHelper = ScannerInitialSetupHelper( connectionHelperMock, batteryLevelChecker, - configManager, + configRepository, firmwareLocalDataSource, ) diff --git a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactoryTest.kt b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactoryTest.kt index e4473598ca..1223ca1014 100644 --- a/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactoryTest.kt +++ b/fingerprint/infra/scanner/src/test/java/com/simprints/fingerprint/infra/scanner/wrapper/ScannerFactoryTest.kt @@ -6,7 +6,7 @@ import com.simprints.fingerprint.infra.scanner.component.bluetooth.ComponentBlue import com.simprints.fingerprint.infra.scanner.tools.ScannerGenerationDeterminer import com.simprints.fingerprint.infra.scanner.tools.SerialNumberConverter import com.simprints.fingerprint.infra.scanner.v2.tools.ScannerUiHelper -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.FingerprintConfiguration import io.mockk.MockKAnnotations import io.mockk.every @@ -25,7 +25,7 @@ class ScannerFactoryTest { private lateinit var componentBluetoothAdapter: ComponentBluetoothAdapter @MockK(relaxed = true) - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var scannerUiHelper: ScannerUiHelper @@ -44,7 +44,7 @@ class ScannerFactoryTest { MockKAnnotations.init(this) scannerFactory = ScannerFactory( componentBluetoothAdapter, - configManager, + configRepository, scannerUiHelper, serialNumberConverter, scannerGenerationDeterminer, diff --git a/id/src/main/java/com/simprints/id/ScheduleBackgroundSyncUseCase.kt b/id/src/main/java/com/simprints/id/ScheduleBackgroundSyncUseCase.kt index 4f3d2ae9da..21f231501b 100644 --- a/id/src/main/java/com/simprints/id/ScheduleBackgroundSyncUseCase.kt +++ b/id/src/main/java/com/simprints/id/ScheduleBackgroundSyncUseCase.kt @@ -3,7 +3,7 @@ package com.simprints.id import com.simprints.fingerprint.infra.scanner.data.worker.FirmwareFileUpdateScheduler import com.simprints.infra.authlogic.AuthManager import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.sync.ConfigurationScheduler import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.images.ImageUpSyncScheduler import javax.inject.Inject @@ -11,7 +11,7 @@ import javax.inject.Inject class ScheduleBackgroundSyncUseCase @Inject constructor( private val eventSyncManager: EventSyncManager, private val imageUpSyncScheduler: ImageUpSyncScheduler, - private val configManager: ConfigManager, + private val configScheduler: ConfigurationScheduler, private val authManager: AuthManager, private val authStore: AuthStore, private val firmwareFileUpdateScheduler: FirmwareFileUpdateScheduler, @@ -21,7 +21,7 @@ class ScheduleBackgroundSyncUseCase @Inject constructor( if (authStore.signedInProjectId.isNotEmpty()) { eventSyncManager.scheduleSync() imageUpSyncScheduler.scheduleImageUpSync() - configManager.scheduleSyncConfiguration() + configScheduler.scheduleSync() authManager.scheduleSecurityStateCheck() firmwareFileUpdateScheduler.scheduleOrCancelWorkIfNecessary() } diff --git a/id/src/test/java/com/simprints/id/ScheduleBackgroundSyncUseCaseTest.kt b/id/src/test/java/com/simprints/id/ScheduleBackgroundSyncUseCaseTest.kt index 6c605ecd96..4db7e100c2 100644 --- a/id/src/test/java/com/simprints/id/ScheduleBackgroundSyncUseCaseTest.kt +++ b/id/src/test/java/com/simprints/id/ScheduleBackgroundSyncUseCaseTest.kt @@ -3,18 +3,19 @@ package com.simprints.id import com.simprints.fingerprint.infra.scanner.data.worker.FirmwareFileUpdateScheduler import com.simprints.infra.authlogic.AuthManager import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.sync.ConfigurationScheduler import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.images.ImageUpSyncScheduler import io.mockk.MockKAnnotations -import io.mockk.verify import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.verify import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test class ScheduleBackgroundSyncUseCaseTest { + @MockK lateinit var eventSyncManager: EventSyncManager @@ -22,7 +23,7 @@ class ScheduleBackgroundSyncUseCaseTest { lateinit var imageUpSyncScheduler: ImageUpSyncScheduler @MockK - lateinit var configManager: ConfigManager + lateinit var configScheduler: ConfigurationScheduler @MockK lateinit var authManager: AuthManager @@ -42,7 +43,7 @@ class ScheduleBackgroundSyncUseCaseTest { useCase = ScheduleBackgroundSyncUseCase( eventSyncManager, imageUpSyncScheduler, - configManager, + configScheduler, authManager, authStore, firmwareFileUpdateScheduler, @@ -58,7 +59,7 @@ class ScheduleBackgroundSyncUseCaseTest { verify { eventSyncManager.scheduleSync() imageUpSyncScheduler.scheduleImageUpSync() - configManager.scheduleSyncConfiguration() + configScheduler.scheduleSync() authManager.scheduleSecurityStateCheck() firmwareFileUpdateScheduler.scheduleOrCancelWorkIfNecessary() } @@ -73,7 +74,7 @@ class ScheduleBackgroundSyncUseCaseTest { verify(exactly = 0) { eventSyncManager.scheduleSync() imageUpSyncScheduler.scheduleImageUpSync() - configManager.scheduleSyncConfiguration() + configScheduler.scheduleSync() authManager.scheduleSecurityStateCheck() firmwareFileUpdateScheduler.scheduleOrCancelWorkIfNecessary() } diff --git a/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticator.kt b/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticator.kt index 69db08d9a7..452947a803 100644 --- a/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticator.kt +++ b/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticator.kt @@ -8,7 +8,7 @@ import com.simprints.infra.authstore.domain.models.AuthRequest import com.simprints.infra.authstore.domain.models.AuthenticationData import com.simprints.infra.authstore.domain.models.Token import com.simprints.infra.authstore.exceptions.AuthRequestInvalidCredentialsException -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.network.exceptions.BackendMaintenanceException import com.simprints.infra.network.exceptions.SyncCloudIntegrationException import com.simprints.infra.security.SecurityManager @@ -19,7 +19,7 @@ import javax.inject.Inject internal class ProjectAuthenticator @Inject constructor( private val projectSecretManager: ProjectSecretManager, private val secureDataManager: SecurityManager, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, private val signerManager: SignerManager, private val authenticationRemoteDataSource: AuthenticationRemoteDataSource, private val integrityTokenRequester: IntegrityTokenRequester, @@ -41,7 +41,7 @@ internal class ProjectAuthenticator @Inject constructor( makeAuthRequest(prepareAuthRequestParameters(nonceScope, projectSecret), nonceScope) .signIn(nonceScope.projectId) - val config = configManager.getProjectConfiguration() + val config = configRepository.getProjectConfiguration() fetchProjectLongConsentTexts(config.general.languageOptions, config.projectId) } @@ -66,7 +66,7 @@ internal class ProjectAuthenticator @Inject constructor( private fun getEncryptedProjectSecret( projectSecret: String, - authenticationData: AuthenticationData + authenticationData: AuthenticationData, ): String = projectSecretManager.encryptProjectSecret( projectSecret, authenticationData.publicKey @@ -95,7 +95,7 @@ internal class ProjectAuthenticator @Inject constructor( private suspend fun fetchProjectLongConsentTexts(languages: List, projectId: String) { languages.forEach { language -> - configManager.getPrivacyNotice(projectId, language).collect() + configRepository.getPrivacyNotice(projectId, language).collect() } } } diff --git a/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/SignerManager.kt b/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/SignerManager.kt index caee54528b..5d5be5af4d 100644 --- a/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/SignerManager.kt +++ b/infra/auth-logic/src/main/java/com/simprints/infra/authlogic/authenticator/SignerManager.kt @@ -5,7 +5,8 @@ import com.simprints.fingerprint.infra.scanner.ScannerManager import com.simprints.infra.authlogic.worker.SecurityStateScheduler import com.simprints.infra.authstore.AuthStore import com.simprints.infra.authstore.domain.models.Token -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository +import com.simprints.infra.config.sync.ConfigurationScheduler import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.eventsync.EventSyncManager @@ -20,7 +21,8 @@ import kotlinx.coroutines.withContext import javax.inject.Inject internal class SignerManager @Inject constructor( - private val configManager: ConfigManager, + private val configScheduler: ConfigurationScheduler, + private val configRepository: ConfigRepository, private val authStore: AuthStore, private val eventSyncManager: EventSyncManager, private val securityStateScheduler: SecurityStateScheduler, @@ -41,14 +43,14 @@ internal class SignerManager @Inject constructor( try { // Store Firebase token so it can be used by ConfigManager authStore.storeFirebaseToken(token) - configManager.refreshProject(projectId) + configRepository.refreshProject(projectId) // Only store credentials if all other calls succeeded. This avoids the undefined state // where credentials are store (i.e. user is considered logged in) but project configuration // is missing authStore.storeCredentials(projectId) } catch (e: Exception) { authStore.clearFirebaseToken() - configManager.clearData() + configRepository.clearData() authStore.cleanCredentials() throw e @@ -63,11 +65,11 @@ internal class SignerManager @Inject constructor( // Cancel all background sync eventSyncManager.cancelScheduledSync() imageUpSyncScheduler.cancelImageUpSync() - configManager.cancelScheduledSyncConfiguration() + configScheduler.cancelScheduledSync() eventSyncManager.deleteSyncInfo() simNetwork.resetApiBaseUrl() - configManager.clearData() + configRepository.clearData() recentUserActivityManager.clearRecentActivity() deleteLocalData() diff --git a/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticatorTest.kt b/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticatorTest.kt index aee723d5ed..d931d3eb6c 100644 --- a/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticatorTest.kt +++ b/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/ProjectAuthenticatorTest.kt @@ -7,7 +7,7 @@ import com.simprints.infra.authlogic.integrity.exceptions.RequestingIntegrityTok import com.simprints.infra.authlogic.model.NonceScope import com.simprints.infra.authstore.domain.models.AuthenticationData import com.simprints.infra.authstore.domain.models.Token -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.GeneralConfiguration import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.network.exceptions.BackendMaintenanceException @@ -29,7 +29,7 @@ import java.io.IOException class ProjectAuthenticatorTest { @MockK - private lateinit var configManager: ConfigManager + private lateinit var configRepository: ConfigRepository @MockK private lateinit var secureDataManager: SecurityManager @@ -56,7 +56,7 @@ class ProjectAuthenticatorTest { authenticator = ProjectAuthenticator( projectSecretManager, secureDataManager, - configManager, + configRepository, signerManager, authenticationRemoteDataSource, integrityTokenRequester, @@ -134,12 +134,13 @@ class ProjectAuthenticatorTest { } @Test - fun `authenticate should fetch the correct long consents`() = runTest(StandardTestDispatcher()) { - authenticator.authenticate(NonceScope(PROJECT_ID, DEVICE_ID), PROJECT_SECRET) + fun `authenticate should fetch the correct long consents`() = + runTest(StandardTestDispatcher()) { + authenticator.authenticate(NonceScope(PROJECT_ID, DEVICE_ID), PROJECT_SECRET) - coVerify(exactly = 1) { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE_1) } - coVerify(exactly = 1) { configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE_2) } - } + coVerify(exactly = 1) { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE_1) } + coVerify(exactly = 1) { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE_2) } + } @Test fun integrityFailed_shouldThrowRightException() = runTest(StandardTestDispatcher()) { @@ -163,7 +164,7 @@ class ProjectAuthenticatorTest { authenticationRemoteDataSource.requestAuthToken(PROJECT_ID, DEVICE_ID, any()) } returns Token("", "", "", "") - coEvery { configManager.getProjectConfiguration() } returns ProjectConfiguration( + coEvery { configRepository.getProjectConfiguration() } returns ProjectConfiguration( PROJECT_ID, general = GeneralConfiguration( modalities = mockk(), @@ -179,12 +180,13 @@ class ProjectAuthenticatorTest { mockk(), mockk(), ) - coEvery { configManager.getPrivacyNotice(any(), any()) } returns emptyFlow() + coEvery { configRepository.getPrivacyNotice(any(), any()) } returns emptyFlow() coEvery { integrityTokenRequester.getToken(any()) } returns "token" } private companion object { + private const val PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCAmxhSp1nSNOkRianJtMEP6uEznURRKeLmnr5q/KJnMosVeSHCtFlsDeNrjaR9r90sUgn1oA++ixcu3h6sG4nq4BEgDHi0aHQnZrFNq+frd002ji5sb9dUM2n6M7z8PPjMNiy7xl//qDIbSuwMz9u5G1VjovE4Ej0E9x1HLmXHRQIDAQAB" private const val PROJECT_ID = "project_id" diff --git a/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/SignerManagerTest.kt b/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/SignerManagerTest.kt index 08e3a01892..f0311222c2 100644 --- a/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/SignerManagerTest.kt +++ b/infra/auth-logic/src/test/java/com/simprints/infra/authlogic/authenticator/SignerManagerTest.kt @@ -4,10 +4,11 @@ import com.simprints.fingerprint.infra.scanner.ScannerManager import com.simprints.infra.authlogic.worker.SecurityStateScheduler import com.simprints.infra.authstore.AuthStore import com.simprints.infra.authstore.domain.models.Token +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.Project import com.simprints.infra.config.store.models.ProjectConfiguration import com.simprints.infra.config.store.models.ProjectWithConfig -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.sync.ConfigurationScheduler import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.events.EventRepository import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID @@ -32,7 +33,10 @@ import org.junit.Test internal class SignerManagerTest { @MockK - lateinit var mockConfigManager: ConfigManager + lateinit var mockConfigScheduler: ConfigurationScheduler + + @MockK + lateinit var mockConfigManager: ConfigRepository @MockK lateinit var mockAuthStore: AuthStore @@ -78,6 +82,7 @@ internal class SignerManagerTest { MockKAnnotations.init(this, relaxed = true) signerManager = SignerManager( + mockConfigScheduler, mockConfigManager, mockAuthStore, mockEventSyncManager, @@ -185,7 +190,7 @@ internal class SignerManagerTest { coVerify { mockEventSyncManager.cancelScheduledSync() } verify { mockImageUpSyncScheduler.cancelImageUpSync() } - coVerify { mockConfigManager.cancelScheduledSyncConfiguration() } + coVerify { mockConfigScheduler.cancelScheduledSync() } } @Test diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepository.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepository.kt index eb863ecb49..2dea258443 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepository.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepository.kt @@ -11,7 +11,7 @@ interface ConfigRepository { suspend fun refreshProject(projectId: String): ProjectWithConfig suspend fun getProject(projectId: String): Project - suspend fun getConfiguration(): ProjectConfiguration + suspend fun getProjectConfiguration(): ProjectConfiguration suspend fun getDeviceConfiguration(): DeviceConfiguration suspend fun updateDeviceConfiguration(update: suspend (t: DeviceConfiguration) -> DeviceConfiguration) diff --git a/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepositoryImpl.kt b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepositoryImpl.kt index 77f1500093..ee3bc55de8 100644 --- a/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepositoryImpl.kt +++ b/infra/config-store/src/main/java/com/simprints/infra/config/store/ConfigRepositoryImpl.kt @@ -50,7 +50,7 @@ internal class ConfigRepositoryImpl @Inject constructor( } } - override suspend fun getConfiguration(): ProjectConfiguration { + override suspend fun getProjectConfiguration(): ProjectConfiguration { val localConfig = localDataSource.getProjectConfiguration() // If projectId is empty, configuration hasn't been downloaded yet return if (localConfig.projectId.isEmpty()) { diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt deleted file mode 100644 index e62d5473e7..0000000000 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManager.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.simprints.infra.config.sync - -import com.simprints.infra.config.store.models.DeviceConfiguration -import com.simprints.infra.config.store.models.PrivacyNoticeResult -import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.store.models.ProjectWithConfig -import kotlinx.coroutines.flow.Flow - -interface ConfigManager { - /** - * fetch the latest state of the project and save it locally - */ - suspend fun refreshProject(projectId: String): ProjectWithConfig - - /** - * get the project locally or if not present fetch it remotely - */ - suspend fun getProject(projectId: String): Project - - /** - * get the project configuration locally - */ - suspend fun getProjectConfiguration(): ProjectConfiguration - - /** - * fetch the current device configuration. - */ - suspend fun getDeviceConfiguration(): DeviceConfiguration - - /** - * update the device configuration - */ - suspend fun updateDeviceConfiguration(update: suspend (t: DeviceConfiguration) -> DeviceConfiguration) - - /** - * clears the project, project configuration and device configuration - */ - suspend fun clearData() - - suspend fun getPrivacyNotice(projectId: String, language: String): Flow - - fun scheduleSyncConfiguration() - fun cancelScheduledSyncConfiguration() -} diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManagerImpl.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManagerImpl.kt deleted file mode 100644 index 5004d20a15..0000000000 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManagerImpl.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.simprints.infra.config.sync - -import com.simprints.infra.config.store.ConfigRepository -import com.simprints.infra.config.store.models.DeviceConfiguration -import com.simprints.infra.config.store.models.PrivacyNoticeResult -import com.simprints.infra.config.store.models.Project -import com.simprints.infra.config.store.models.ProjectConfiguration -import com.simprints.infra.config.store.models.ProjectWithConfig -import com.simprints.infra.config.sync.worker.ConfigurationScheduler -import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository -import kotlinx.coroutines.flow.Flow -import javax.inject.Inject - -internal class ConfigManagerImpl @Inject constructor( - private val configRepository: ConfigRepository, - private val configurationScheduler: ConfigurationScheduler, - private val enrolmentRecordRepository: EnrolmentRecordRepository, -) : ConfigManager { - - override suspend fun refreshProject(projectId: String): ProjectWithConfig = - configRepository.refreshProject(projectId).also { (project, _) -> - enrolmentRecordRepository.tokenizeExistingRecords(project) - } - - override suspend fun getProject(projectId: String): Project = - configRepository.getProject(projectId) - - override suspend fun getProjectConfiguration(): ProjectConfiguration = - configRepository.getConfiguration() - - override suspend fun getDeviceConfiguration(): DeviceConfiguration = - configRepository.getDeviceConfiguration() - - override suspend fun updateDeviceConfiguration(update: suspend (t: DeviceConfiguration) -> DeviceConfiguration) = - configRepository.updateDeviceConfiguration(update) - - override fun scheduleSyncConfiguration() = - configurationScheduler.scheduleSync() - - override fun cancelScheduledSyncConfiguration() = - configurationScheduler.cancelScheduledSync() - - override suspend fun clearData() = - configRepository.clearData() - - override suspend fun getPrivacyNotice( - projectId: String, - language: String, - ): Flow = - configRepository.getPrivacyNotice(projectId, language) -} diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManagerModule.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManagerModule.kt index 0555c7dd6d..5528e29cb9 100644 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManagerModule.kt +++ b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigManagerModule.kt @@ -1,7 +1,5 @@ package com.simprints.infra.config.sync -import com.simprints.infra.config.sync.worker.ConfigurationScheduler -import com.simprints.infra.config.sync.worker.ConfigurationSchedulerImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -11,10 +9,6 @@ import dagger.hilt.components.SingletonComponent @InstallIn(SingletonComponent::class) abstract class ConfigManagerModule { - @Binds - internal abstract fun provideConfigManager(configManager: ConfigManagerImpl): ConfigManager - @Binds internal abstract fun provideConfigurationScheduler(configurationScheduler: ConfigurationSchedulerImpl): ConfigurationScheduler - -} \ No newline at end of file +} diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigurationScheduler.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigurationScheduler.kt new file mode 100644 index 0000000000..5601ae0206 --- /dev/null +++ b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigurationScheduler.kt @@ -0,0 +1,6 @@ +package com.simprints.infra.config.sync + +interface ConfigurationScheduler { + fun scheduleSync() + fun cancelScheduledSync() +} diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationSchedulerImpl.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigurationSchedulerImpl.kt similarity index 92% rename from infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationSchedulerImpl.kt rename to infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigurationSchedulerImpl.kt index f4b5f4ddc7..5c03667af8 100644 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationSchedulerImpl.kt +++ b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/ConfigurationSchedulerImpl.kt @@ -1,8 +1,8 @@ -package com.simprints.infra.config.sync.worker +package com.simprints.infra.config.sync import android.content.Context import androidx.work.* -import com.simprints.infra.config.sync.BuildConfig +import com.simprints.infra.config.sync.worker.ConfigurationWorker import dagger.hilt.android.qualifiers.ApplicationContext import java.util.concurrent.TimeUnit import javax.inject.Inject diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationScheduler.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationScheduler.kt deleted file mode 100644 index 8b51580e49..0000000000 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationScheduler.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.simprints.infra.config.sync.worker - -internal interface ConfigurationScheduler { - fun scheduleSync() - fun cancelScheduledSync() -} diff --git a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationWorker.kt b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationWorker.kt index 676eeb3f10..7917eaf526 100644 --- a/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationWorker.kt +++ b/infra/config-sync/src/main/java/com/simprints/infra/config/sync/worker/ConfigurationWorker.kt @@ -4,9 +4,9 @@ import android.content.Context import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker import androidx.work.WorkerParameters -import com.simprints.infra.logging.Simber import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository +import com.simprints.infra.logging.Simber import dagger.assisted.Assisted import dagger.assisted.AssistedInject @@ -15,7 +15,7 @@ internal class ConfigurationWorker @AssistedInject constructor( @Assisted context: Context, @Assisted params: WorkerParameters, private val authStore: AuthStore, - private val configManager: ConfigManager + private val configRepository: ConfigRepository ) : CoroutineWorker(context, params) { private val tag = "ConfigurationWorker" @@ -27,7 +27,7 @@ internal class ConfigurationWorker @AssistedInject constructor( if (projectId.isEmpty()) { Result.failure() } else { - configManager.refreshProject(projectId) + configRepository.refreshProject(projectId) Simber.tag(tag).i("Successfully refresh the project configuration") Result.success() } diff --git a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerImplTest.kt b/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerImplTest.kt deleted file mode 100644 index a4e640b322..0000000000 --- a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigManagerImplTest.kt +++ /dev/null @@ -1,102 +0,0 @@ -package com.simprints.infra.config.sync - -import com.google.common.truth.Truth.assertThat -import com.simprints.infra.config.store.ConfigRepository -import com.simprints.infra.config.store.models.DeviceConfiguration -import com.simprints.infra.config.store.models.ProjectWithConfig -import com.simprints.infra.config.sync.testtools.deviceConfiguration -import com.simprints.infra.config.sync.testtools.project -import com.simprints.infra.config.sync.testtools.projectConfiguration -import com.simprints.infra.config.sync.worker.ConfigurationScheduler -import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.mockk -import kotlinx.coroutines.test.runTest -import org.junit.Test - -class ConfigManagerImplTest { - - companion object { - private const val PROJECT_ID = "projectId" - private const val LANGUAGE = "fr" - } - - private val configRepository = mockk(relaxed = true) - private val configurationScheduler = mockk(relaxed = true) - private val enrolmentRecordRepository = mockk(relaxed = true) - private val configManager = ConfigManagerImpl( - configRepository = configRepository, - configurationScheduler = configurationScheduler, - enrolmentRecordRepository = enrolmentRecordRepository - ) - - @Test - fun `refreshProject should call the correct method`() = runTest { - coEvery { configRepository.refreshProject(PROJECT_ID) } returns ProjectWithConfig(project, projectConfiguration) - - val refreshedProject = configManager.refreshProject(PROJECT_ID) - assertThat(refreshedProject.project).isEqualTo(project) - assertThat(refreshedProject.configuration).isEqualTo(projectConfiguration) - } - - @Test - fun `getProject should call the correct method`() = runTest { - coEvery { configRepository.getProject(PROJECT_ID) } returns project - - val gottenProject = configManager.getProject(PROJECT_ID) - assertThat(gottenProject).isEqualTo(project) - } - - @Test - fun `getProjectConfiguration should call the correct method`() = runTest { - coEvery { configRepository.getConfiguration() } returns projectConfiguration - - val gottenProjectConfiguration = configManager.getProjectConfiguration() - assertThat(gottenProjectConfiguration).isEqualTo(projectConfiguration) - } - - @Test - fun `getDeviceConfiguration should call the correct method`() = runTest { - coEvery { configRepository.getDeviceConfiguration() } returns deviceConfiguration - - val gottenDeviceConfiguration = configManager.getDeviceConfiguration() - assertThat(gottenDeviceConfiguration).isEqualTo(deviceConfiguration) - } - - @Test - fun `updateDeviceConfiguration should call the correct method`() = runTest { - val update: (c: DeviceConfiguration) -> DeviceConfiguration = { - it - } - - configManager.updateDeviceConfiguration(update) - coVerify(exactly = 1) { configRepository.updateDeviceConfiguration(update) } - } - - @Test - fun `scheduleSyncConfiguration should call the correct method`() = runTest { - configManager.scheduleSyncConfiguration() - - coVerify(exactly = 1) { configurationScheduler.scheduleSync() } - } - - @Test - fun `cancelScheduledSyncConfiguration should call the correct method`() = runTest { - configManager.cancelScheduledSyncConfiguration() - - coVerify(exactly = 1) { configurationScheduler.cancelScheduledSync() } - } - - @Test - fun `clearData should call the correct method`() = runTest { - configManager.clearData() - coVerify(exactly = 1) { configRepository.clearData() } - } - - @Test - fun `getPrivacyNotice should call the correct method`() = runTest { - configManager.getPrivacyNotice(PROJECT_ID, LANGUAGE) - coVerify(exactly = 1) { configRepository.getPrivacyNotice(PROJECT_ID, LANGUAGE) } - } -} diff --git a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/worker/ConfigurationSchedulerImplTest.kt b/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigurationSchedulerImplTest.kt similarity index 96% rename from infra/config-sync/src/test/java/com/simprints/infra/config/sync/worker/ConfigurationSchedulerImplTest.kt rename to infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigurationSchedulerImplTest.kt index 798ba95c0e..5a0819bc2c 100644 --- a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/worker/ConfigurationSchedulerImplTest.kt +++ b/infra/config-sync/src/test/java/com/simprints/infra/config/sync/ConfigurationSchedulerImplTest.kt @@ -1,4 +1,4 @@ -package com.simprints.infra.config.sync.worker +package com.simprints.infra.config.sync import android.content.Context import androidx.work.ExistingPeriodicWorkPolicy diff --git a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/worker/ConfigurationWorkerTest.kt b/infra/config-sync/src/test/java/com/simprints/infra/config/sync/worker/ConfigurationWorkerTest.kt index 3ac6f5d0b2..b5612addba 100644 --- a/infra/config-sync/src/test/java/com/simprints/infra/config/sync/worker/ConfigurationWorkerTest.kt +++ b/infra/config-sync/src/test/java/com/simprints/infra/config/sync/worker/ConfigurationWorkerTest.kt @@ -3,31 +3,40 @@ package com.simprints.infra.config.sync.worker import androidx.work.ListenableWorker import com.google.common.truth.Truth.assertThat import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.ProjectWithConfig -import com.simprints.infra.config.sync.ConfigManager import com.simprints.infra.config.sync.testtools.project import com.simprints.infra.config.sync.testtools.projectConfiguration +import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.every +import io.mockk.impl.annotations.MockK import io.mockk.mockk import kotlinx.coroutines.test.runTest +import org.junit.Before import org.junit.Test -class ConfigurationWorkerTest { +class ProjectConfigDownSyncWorkerTest { - companion object { + @MockK + private lateinit var authStore: AuthStore - private const val PROJECT_ID = "projectId" - } + @MockK + private lateinit var configRepository: ConfigRepository - private val authStore = mockk() - private val configManager = mockk(relaxed = true) - private val configurationWorker = ConfigurationWorker( - context = mockk(), - params = mockk(relaxed = true), - authStore = authStore, - configManager = configManager - ) + private lateinit var configurationWorker: ConfigurationWorker + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + + configurationWorker = ConfigurationWorker( + context = mockk(), + params = mockk(relaxed = true), + authStore = authStore, + configRepository = configRepository + ) + } @Test fun `should fail if the signed in project id is empty`() = runTest { @@ -40,7 +49,7 @@ class ConfigurationWorkerTest { @Test fun `should fail if the config service throws an exception`() = runTest { every { authStore.signedInProjectId } returns PROJECT_ID - coEvery { configManager.refreshProject(PROJECT_ID) } throws Exception() + coEvery { configRepository.refreshProject(PROJECT_ID) } throws Exception() val result = configurationWorker.doWork() assertThat(result).isEqualTo(ListenableWorker.Result.failure()) @@ -49,9 +58,14 @@ class ConfigurationWorkerTest { @Test fun `should succeed if the config service doesn't throw an exception`() = runTest { every { authStore.signedInProjectId } returns PROJECT_ID - coEvery { configManager.refreshProject(PROJECT_ID) } returns ProjectWithConfig(project, projectConfiguration) + coEvery { configRepository.refreshProject(PROJECT_ID) } returns ProjectWithConfig(project, projectConfiguration) val result = configurationWorker.doWork() assertThat(result).isEqualTo(ListenableWorker.Result.success()) } + + companion object { + + private const val PROJECT_ID = "projectId" + } } diff --git a/infra/enrolment-records-sync/build.gradle.kts b/infra/enrolment-records-sync/build.gradle.kts index e6dff5dddf..80456036a9 100644 --- a/infra/enrolment-records-sync/build.gradle.kts +++ b/infra/enrolment-records-sync/build.gradle.kts @@ -10,7 +10,6 @@ android { dependencies { implementation(project(":infra:config-store")) implementation(project(":infra:enrolment-records-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:auth-store")) implementation(project(":infra:realm")) diff --git a/infra/enrolment-records-sync/src/main/java/com/simprints/infra/enrolment/records/sync/worker/EnrolmentRecordWorker.kt b/infra/enrolment-records-sync/src/main/java/com/simprints/infra/enrolment/records/sync/worker/EnrolmentRecordWorker.kt index cb7ae4db58..9de62520bb 100644 --- a/infra/enrolment-records-sync/src/main/java/com/simprints/infra/enrolment/records/sync/worker/EnrolmentRecordWorker.kt +++ b/infra/enrolment-records-sync/src/main/java/com/simprints/infra/enrolment/records/sync/worker/EnrolmentRecordWorker.kt @@ -5,7 +5,7 @@ import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.simprints.core.DispatcherIO -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import dagger.assisted.Assisted import dagger.assisted.AssistedInject @@ -16,8 +16,8 @@ import kotlinx.coroutines.withContext class EnrolmentRecordWorker @AssistedInject constructor( @Assisted context: Context, @Assisted params: WorkerParameters, - private val repository: EnrolmentRecordRepository, - private val configManager: ConfigManager, + private val enrolmentRecordRepository: EnrolmentRecordRepository, + private val configRepository: ConfigRepository, @DispatcherIO private val dispatcher: CoroutineDispatcher, ) : CoroutineWorker(context, params) { @@ -31,9 +31,9 @@ class EnrolmentRecordWorker @AssistedInject constructor( inputData.getStringArray(EnrolmentRecordSchedulerImpl.INPUT_SUBJECT_IDS_NAME) ?: throw IllegalArgumentException("input required") - repository.uploadRecords(subjectIds.toList()) + enrolmentRecordRepository.uploadRecords(subjectIds.toList()) - configManager.updateDeviceConfiguration { + configRepository.updateDeviceConfiguration { it.apply { it.lastInstructionId = instructionId } } diff --git a/infra/enrolment-records-sync/src/test/java/com/simprints/infra/enrolment/records/worker/EnrolmentRecordWorkerTest.kt b/infra/enrolment-records-sync/src/test/java/com/simprints/infra/enrolment/records/worker/EnrolmentRecordWorkerTest.kt index 36a0383a04..36077c24cb 100644 --- a/infra/enrolment-records-sync/src/test/java/com/simprints/infra/enrolment/records/worker/EnrolmentRecordWorkerTest.kt +++ b/infra/enrolment-records-sync/src/test/java/com/simprints/infra/enrolment/records/worker/EnrolmentRecordWorkerTest.kt @@ -3,7 +3,7 @@ package com.simprints.infra.enrolment.records.worker import androidx.work.WorkerParameters import androidx.work.workDataOf import com.google.common.truth.Truth.assertThat -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.enrolment.records.store.EnrolmentRecordRepository import com.simprints.infra.enrolment.records.sync.worker.EnrolmentRecordSchedulerImpl @@ -21,7 +21,7 @@ class EnrolmentRecordWorkerTest { } private val repository = mockk(relaxed = true) - private val configManager = mockk() + private val configRepository = mockk() private val params = mockk(relaxed = true) { every { inputData } returns workDataOf( EnrolmentRecordSchedulerImpl.INPUT_ID_NAME to INSTRUCTION_ID, @@ -32,7 +32,7 @@ class EnrolmentRecordWorkerTest { mockk(relaxed = true), params, repository, - configManager, + configRepository, UnconfinedTestDispatcher(), ) @@ -40,7 +40,7 @@ class EnrolmentRecordWorkerTest { @Test fun `should do work correctly`() = runTest { val updateConfigFn = slot DeviceConfiguration>() - coEvery { configManager.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit + coEvery { configRepository.updateDeviceConfiguration(capture(updateConfigFn)) } returns Unit worker.doWork() diff --git a/infra/event-sync/build.gradle.kts b/infra/event-sync/build.gradle.kts index d236219bf3..f99b6da3bd 100644 --- a/infra/event-sync/build.gradle.kts +++ b/infra/event-sync/build.gradle.kts @@ -40,7 +40,6 @@ dependencies { implementation(project(":infra:images")) implementation(project(":infra:events")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(project(":infra:auth-store")) implementation(project(":infra:enrolment-records-store")) implementation(project(":infra:project-security-store")) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/EventSyncManagerImpl.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/EventSyncManagerImpl.kt index 3bf66b67f8..200b9c7143 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/EventSyncManagerImpl.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/EventSyncManagerImpl.kt @@ -133,7 +133,7 @@ internal class EventSyncManagerImpl @Inject constructor( eventRepository.observeEventCount(projectId, type) override suspend fun countEventsToDownload(): DownSyncCounts { - val projectConfig = configRepository.getConfiguration() + val projectConfig = configRepository.getProjectConfiguration() val deviceConfig = configRepository.getDeviceConfiguration() val downSyncScope = downSyncScopeRepository.getDownSyncScope( @@ -166,7 +166,7 @@ internal class EventSyncManagerImpl @Inject constructor( val op = EventDownSyncOperation(RemoteEventQuery( projectId = projectId, subjectId = subjectId, - modes = getProjectModes(configRepository.getConfiguration()), + modes = getProjectModes(configRepository.getProjectConfiguration()), )) downSyncTask.downSync(this, op).toList() } @@ -177,7 +177,7 @@ internal class EventSyncManagerImpl @Inject constructor( override suspend fun deleteModules(unselectedModules: List) { downSyncScopeRepository.deleteOperations( unselectedModules, - modes = getProjectModes(configRepository.getConfiguration()), + modes = getProjectModes(configRepository.getProjectConfiguration()), ) } diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/EventDownSyncWorkersBuilder.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/EventDownSyncWorkersBuilder.kt index e5fe8699e6..7fb2a1eb10 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/EventDownSyncWorkersBuilder.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/down/EventDownSyncWorkersBuilder.kt @@ -24,7 +24,7 @@ internal class EventDownSyncWorkersBuilder @Inject constructor( ) { suspend fun buildDownSyncWorkerChain(uniqueSyncId: String?): List { - val projectConfiguration = configRepository.getConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() val deviceConfiguration = configRepository.getDeviceConfiguration() val downSyncScope = downSyncScopeRepository.getDownSyncScope( diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt index 595d25e474..e61801e9d6 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorker.kt @@ -60,7 +60,7 @@ internal class EventSyncMasterWorker @AssistedInject constructor( try { crashlyticsLog("Start") showProgressNotification() - val configuration = configRepository.getConfiguration() + val configuration = configRepository.getProjectConfiguration() if (!configuration.canSyncDataToSimprints() && !isEventDownSyncAllowed()) return@withContext success( message = "Can't sync to SimprintsID, skip" @@ -115,7 +115,7 @@ internal class EventSyncMasterWorker @AssistedInject constructor( val isProjectPaused = securityStateRepository.getSecurityStatusFromLocal() == SecurityState.Status.PROJECT_PAUSED val isDownSyncConfigEnabled = - with(configRepository.getConfiguration().synchronization) { + with(configRepository.getProjectConfiguration().synchronization) { frequency != SynchronizationConfiguration.Frequency.ONLY_PERIODICALLY_UP_SYNC } return !isProjectPaused && isDownSyncConfigEnabled diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTask.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTask.kt index 8011594f38..c2623d61b9 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTask.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTask.kt @@ -46,7 +46,7 @@ internal class EventUpSyncTask @Inject constructor( } } - val config = configRepository.getConfiguration() + val config = configRepository.getProjectConfiguration() var lastOperation = operation.copy() var count = 0 try { diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/EventSyncManagerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/EventSyncManagerTest.kt index ff2983bfaf..1fb00aebc4 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/EventSyncManagerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/EventSyncManagerTest.kt @@ -77,7 +77,7 @@ internal class EventSyncManagerTest { mockkStatic(WorkManager::class) every { WorkManager.getInstance(ctx) } returns workManager - coEvery { configRepository.getConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general.modalities } returns listOf() every { synchronization.down.partitionType.toDomain() } returns Partitioning.MODULE } diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/EventDownSyncWorkersBuilderTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/EventDownSyncWorkersBuilderTest.kt index fe307c7d42..24f91e450b 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/EventDownSyncWorkersBuilderTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/down/EventDownSyncWorkersBuilderTest.kt @@ -59,7 +59,7 @@ class EventDownSyncWorkersBuilderTest { SELECTED_MODULE, "" ) - coEvery { configRepository.getConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns generalConfiguration every { synchronization } returns mockk { every { down } returns downSyncConfiguration diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt index 2012dda49b..45865c7f75 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/master/EventSyncMasterWorkerTest.kt @@ -113,7 +113,7 @@ internal class EventSyncMasterWorkerTest { every { synchronizationConfiguration.up.simprints } returns bfsidUpSynchronizationConfiguration every { projectConfiguration.synchronization } returns synchronizationConfiguration - coEvery { configRepository.getConfiguration() } returns projectConfiguration + coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration masterWorker = EventSyncMasterWorker( appContext = ctx, @@ -240,7 +240,7 @@ internal class EventSyncMasterWorkerTest { @Test fun `doWork should fail if there is an exception`() = runTest { - coEvery { configRepository.getConfiguration() } throws Throwable() + coEvery { configRepository.getProjectConfiguration() } throws Throwable() val result = masterWorker.doWork() assertThat(result).isEqualTo(ListenableWorker.Result.failure()) @@ -274,7 +274,7 @@ internal class EventSyncMasterWorkerTest { syncConfig: SynchronizationConfiguration.Frequency ): ListenableWorker.Result { coEvery { securityStateRepository.getSecurityStatusFromLocal() } returns securityStatus - coEvery { configRepository.getConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { synchronization } returns mockk { every { frequency } returns syncConfig every { up.simprints.kind } returns UpSynchronizationConfiguration.UpSynchronizationKind.NONE diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTaskTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTaskTest.kt index 5cb9bcbd93..7049ead645 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTaskTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/sync/up/tasks/EventUpSyncTaskTest.kt @@ -80,7 +80,7 @@ internal class EventUpSyncTaskTest { every { authStore.signedInProjectId } returns DEFAULT_PROJECT_ID every { projectConfiguration.synchronization } returns synchronizationConfiguration - coEvery { configRepository.getConfiguration() } returns projectConfiguration + coEvery { configRepository.getProjectConfiguration() } returns projectConfiguration eventUpSyncTask = EventUpSyncTask( authStore = authStore, diff --git a/infra/events/src/main/java/com/simprints/infra/events/EventRepositoryImpl.kt b/infra/events/src/main/java/com/simprints/infra/events/EventRepositoryImpl.kt index 4819e3eb76..6c01f5101b 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/EventRepositoryImpl.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/EventRepositoryImpl.kt @@ -56,7 +56,7 @@ internal open class EventRepositoryImpl @Inject constructor( closeAllSessions(NEW_SESSION) return reportException { - val projectConfiguration = configRepository.getConfiguration() + val projectConfiguration = configRepository.getProjectConfiguration() val deviceConfiguration = configRepository.getDeviceConfiguration() val sessionCount = eventLocalDataSource.count(type = SESSION_CAPTURE) val sessionCaptureEvent = SessionCaptureEvent( diff --git a/infra/events/src/test/java/com/simprints/infra/events/EventRepositoryImplTest.kt b/infra/events/src/test/java/com/simprints/infra/events/EventRepositoryImplTest.kt index 19e3ceefb0..cf266ad1e7 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/EventRepositoryImplTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/EventRepositoryImplTest.kt @@ -69,7 +69,7 @@ internal class EventRepositoryImplTest { every { authStore.signedInProjectId } returns DEFAULT_PROJECT_ID every { sessionDataCache.eventCache } returns mutableMapOf() every { sessionEventValidatorsFactory.build() } returns arrayOf(eventValidator) - coEvery { configRepository.getConfiguration() } returns mockk { + coEvery { configRepository.getProjectConfiguration() } returns mockk { every { general } returns mockk { every { modalities } returns listOf(Modality.FINGERPRINT, Modality.FACE) } diff --git a/infra/images/build.gradle.kts b/infra/images/build.gradle.kts index eda9fc0399..ff130498ee 100644 --- a/infra/images/build.gradle.kts +++ b/infra/images/build.gradle.kts @@ -23,7 +23,6 @@ android { dependencies { implementation(project(":infra:auth-store")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) // Firebase implementation(libs.firebase.storage) diff --git a/infra/images/src/main/java/com/simprints/infra/images/remote/ImageRemoteDataSourceImpl.kt b/infra/images/src/main/java/com/simprints/infra/images/remote/ImageRemoteDataSourceImpl.kt index ca57f5aacb..b54d396a12 100644 --- a/infra/images/src/main/java/com/simprints/infra/images/remote/ImageRemoteDataSourceImpl.kt +++ b/infra/images/src/main/java/com/simprints/infra/images/remote/ImageRemoteDataSourceImpl.kt @@ -1,22 +1,22 @@ package com.simprints.infra.images.remote import com.google.firebase.storage.FirebaseStorage -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.images.model.SecuredImageRef import com.simprints.infra.logging.Simber -import com.simprints.infra.authstore.AuthStore import kotlinx.coroutines.tasks.await import java.io.FileInputStream import javax.inject.Inject internal class ImageRemoteDataSourceImpl @Inject constructor( - private val imageUrlProvider: ConfigManager, - private val authStore: AuthStore + private val imageUrlProvider: ConfigRepository, + private val authStore: AuthStore, ) : ImageRemoteDataSource { override suspend fun uploadImage( imageStream: FileInputStream, - imageRef: SecuredImageRef + imageRef: SecuredImageRef, ): UploadResult { val firebaseProjectName = authStore.getLegacyAppFallback().options.projectId diff --git a/infra/images/src/test/java/com/simprints/infra/images/remote/ImageRemoteDataSourceImplTest.kt b/infra/images/src/test/java/com/simprints/infra/images/remote/ImageRemoteDataSourceImplTest.kt index eb74055fea..59b76fb2a9 100644 --- a/infra/images/src/test/java/com/simprints/infra/images/remote/ImageRemoteDataSourceImplTest.kt +++ b/infra/images/src/test/java/com/simprints/infra/images/remote/ImageRemoteDataSourceImplTest.kt @@ -1,15 +1,21 @@ package com.simprints.infra.images.remote import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat import com.google.firebase.storage.FirebaseStorage -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.authstore.AuthStore +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.images.model.SecuredImageRef +import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.every +import io.mockk.impl.annotations.MockK import io.mockk.mockk import io.mockk.mockkStatic +import io.mockk.unmockkStatic import kotlinx.coroutines.tasks.await import kotlinx.coroutines.test.runTest +import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -19,84 +25,81 @@ import java.io.FileInputStream @RunWith(AndroidJUnit4::class) class ImageRemoteDataSourceImplTest { + @MockK + private lateinit var configRepo: ConfigRepository + + @MockK + private lateinit var authStore: AuthStore + + @MockK + private lateinit var mockImageStream: FileInputStream + + @MockK + private lateinit var mockSecuredImageRef: SecuredImageRef + + private lateinit var remoteDataSource: ImageRemoteDataSourceImpl + @Before fun setup() { + MockKAnnotations.init(this, relaxed = true) + + every { mockSecuredImageRef.relativePath.parts } returns arrayOf("Test1") + + remoteDataSource = ImageRemoteDataSourceImpl(configRepo, authStore) + // We need to mock statics and global extensions mockkStatic(FirebaseStorage::class) mockkStatic("kotlinx.coroutines.tasks.TasksKt") } + @After + fun tearDown() { + // Make sure static objects are unmocked + unmockkStatic(FirebaseStorage::class) + unmockkStatic("kotlinx.coroutines.tasks.TasksKt") + } @Test fun `test image upload flow`() = runTest { + coEvery { configRepo.getProject(any()).imageBucket } returns "gs://`simprints-dev.appspot.com" + every { authStore.getLegacyAppFallback().options.projectId } returns "projectId" + every { authStore.signedInProjectId } returns "projectId" - val imgUrlProviderMock = mockk { - coEvery { getProject(any()).imageBucket } returns "gs://`simprints-dev.appspot.com" - } - - val authStoreMock = mockk(relaxed = true) { - every { getLegacyAppFallback() } returns mockk(relaxed = true) - every { getLegacyAppFallback().options.projectId } returns "projectId" - every { signedInProjectId } returns "projectId" - } - - val storageMock = setupStoragemockk() + val storageMock = setupStorageMock() every { FirebaseStorage.getInstance(any(), any()) } returns storageMock - val remoteDataSource = ImageRemoteDataSourceImpl(imgUrlProviderMock, authStoreMock) - val imageStreamMock = mockk(relaxed = true) - - val securedImageRefMock = mockk(relaxed = true) { - every { relativePath.parts } returns arrayOf("Test1") - } - - val result = remoteDataSource.uploadImage(imageStreamMock, securedImageRefMock) + val result = remoteDataSource.uploadImage(mockImageStream, mockSecuredImageRef) - assert(result.isUploadSuccessful()) + assertThat(result.isUploadSuccessful()).isTrue() } @Test fun `null project returns failed upload`() = runTest { + every { authStore.getLegacyAppFallback().options.projectId } returns null - val imgUrlProviderMock = mockk() - - val authStoreMock = mockk(relaxed = true) { - every { getLegacyAppFallback().options.projectId } returns null - } + val result = remoteDataSource.uploadImage(mockImageStream, mockSecuredImageRef) - val remoteDataSource = ImageRemoteDataSourceImpl(imgUrlProviderMock, authStoreMock) - val rtn = remoteDataSource.uploadImage(mockk(), mockk()) - - assert(!rtn.isUploadSuccessful()) + assertThat(result.isUploadSuccessful()).isFalse() } @Test fun `null storage bucket returns failed upload`() = runTest { + coEvery { configRepo.getProject(any()).imageBucket } returns "" + every { authStore.getLegacyAppFallback().options.projectId } returns "projectId" - val imgUrlProviderMock = mockk { - coEvery { getProject(any()).imageBucket } returns "" - } - - val authStoreMock = mockk(relaxed = true) { - every { getLegacyAppFallback().options.projectId } returns "projectId" - } - - val remoteDataSource = ImageRemoteDataSourceImpl(imgUrlProviderMock, authStoreMock) - val rtn = remoteDataSource.uploadImage(mockk(), mockk()) + val result = remoteDataSource.uploadImage(mockImageStream, mockSecuredImageRef) - assert(!rtn.isUploadSuccessful()) + assertThat(result.isUploadSuccessful()).isFalse() } - private fun setupStoragemockk() = mockk(relaxed = true) { - every { reference } returns mockk { - every { child(any()) } returns mockk { - every { path } returns "testPath" - every { putStream(any()) } returns mockk { - coEvery { await() } returns mockk { - every { task } returns mockk { - every { isSuccessful } returns true - } + private fun setupStorageMock() = mockk(relaxed = true) { + every { reference.child(any()) } returns mockk { + every { path } returns "testPath" + every { putStream(any()) } returns mockk { + coEvery { await() } returns mockk { + every { task } returns mockk { + every { isSuccessful } returns true } } } diff --git a/infra/project-security-store/build.gradle.kts b/infra/project-security-store/build.gradle.kts index a6f1230346..00193fca2a 100644 --- a/infra/project-security-store/build.gradle.kts +++ b/infra/project-security-store/build.gradle.kts @@ -10,7 +10,6 @@ android { dependencies { implementation(project(":infra:auth-store")) implementation(project(":infra:config-store")) - implementation(project(":infra:config-sync")) implementation(libs.retrofit.core) implementation(libs.workManager.work) diff --git a/infra/project-security-store/src/main/java/com/simprints/infra/projectsecuritystore/securitystate/repo/remote/SecurityStateRemoteDataSource.kt b/infra/project-security-store/src/main/java/com/simprints/infra/projectsecuritystore/securitystate/repo/remote/SecurityStateRemoteDataSource.kt index b4be95f8e7..716f5cf076 100644 --- a/infra/project-security-store/src/main/java/com/simprints/infra/projectsecuritystore/securitystate/repo/remote/SecurityStateRemoteDataSource.kt +++ b/infra/project-security-store/src/main/java/com/simprints/infra/projectsecuritystore/securitystate/repo/remote/SecurityStateRemoteDataSource.kt @@ -1,21 +1,21 @@ package com.simprints.infra.projectsecuritystore.securitystate.repo.remote import com.simprints.core.DeviceID -import com.simprints.infra.projectsecuritystore.securitystate.models.SecurityState import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.network.SimNetwork +import com.simprints.infra.projectsecuritystore.securitystate.models.SecurityState import javax.inject.Inject internal class SecurityStateRemoteDataSource @Inject constructor( private val authStore: AuthStore, - private val configManager: ConfigManager, + private val configRepository: ConfigRepository, @DeviceID private val deviceId: String ) { suspend fun getSecurityState(): SecurityState { val projectId = authStore.signedInProjectId - val deviceConfiguration = configManager.getDeviceConfiguration() + val deviceConfiguration = configRepository.getDeviceConfiguration() return getClient().executeCall { it.requestSecurityState( diff --git a/infra/project-security-store/src/test/java/com/simprints/infra/projectsecuritystore/securitystate/repo/remote/SecurityStateRemoteDataSourceTest.kt b/infra/project-security-store/src/test/java/com/simprints/infra/projectsecuritystore/securitystate/repo/remote/SecurityStateRemoteDataSourceTest.kt index 9a36166695..af14f1304f 100644 --- a/infra/project-security-store/src/test/java/com/simprints/infra/projectsecuritystore/securitystate/repo/remote/SecurityStateRemoteDataSourceTest.kt +++ b/infra/project-security-store/src/test/java/com/simprints/infra/projectsecuritystore/securitystate/repo/remote/SecurityStateRemoteDataSourceTest.kt @@ -2,7 +2,7 @@ package com.simprints.infra.projectsecuritystore.securitystate.repo.remote import com.google.common.truth.Truth.assertThat import com.simprints.infra.authstore.AuthStore -import com.simprints.infra.config.sync.ConfigManager +import com.simprints.infra.config.store.ConfigRepository import com.simprints.infra.config.store.models.DeviceConfiguration import com.simprints.infra.network.SimNetwork import com.simprints.infra.network.exceptions.BackendMaintenanceException @@ -29,7 +29,7 @@ class SecurityStateRemoteDataSourceTest { private val authStore = mockk() private val remoteInterface = mockk() - private val configManager = mockk { + private val configRepository = mockk { coEvery { getDeviceConfiguration() } returns DeviceConfiguration( "", listOf(), @@ -37,7 +37,7 @@ class SecurityStateRemoteDataSourceTest { ) } private val simApiClient = mockk>() - private val securityStateRemoteDataSource = SecurityStateRemoteDataSource(authStore, configManager, DEVICE_ID) + private val securityStateRemoteDataSource = SecurityStateRemoteDataSource(authStore, configRepository, DEVICE_ID) @Before fun setUp() {