From 21cf96fbe9c403c67d6de10b3fe30b8841e93659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=E2=89=A1ZRS?= <12814349+LZRS@users.noreply.github.com> Date: Sat, 24 Feb 2024 03:34:35 +0300 Subject: [PATCH] Update spotless to 6.25.0 --- android/buildSrc/src/main/kotlin/Deps.kt | 2 +- android/dataclerk/build.gradle.kts | 303 +++++------ .../dataclerk/DataClerkApplication.kt | 2 +- .../dataclerk/DataClerkConfigService.kt | 14 +- .../dataclerk/di/DataClerkLoginService.kt | 2 +- .../fhircore/dataclerk/ui/home/HomeScreen.kt | 33 +- .../dataclerk/ui/home/HomeViewModel.kt | 4 +- .../fhircore/dataclerk/ui/home/PatientList.kt | 14 +- .../dataclerk/ui/main/AppDataStore.kt | 20 +- .../dataclerk/ui/main/AppMainActivity.kt | 28 +- .../dataclerk/ui/main/AppMainEvent.kt | 10 +- .../dataclerk/ui/main/AppMainUiState.kt | 2 +- .../dataclerk/ui/main/AppMainViewModel.kt | 20 +- .../fhircore/dataclerk/ui/main/AppScreen.kt | 14 +- .../dataclerk/ui/patient/PatientDetail.kt | 12 +- .../dataclerk/ui/patient/PatientScreen.kt | 25 +- .../dataclerk/ui/patient/PatientViewModel.kt | 45 +- .../fhircore/dataclerk/ui/search/Search.kt | 29 +- .../search/{State.kt => SearchModelState.kt} | 2 +- .../dataclerk/ui/search/SearchViewModel.kt | 1 + .../fhircore/dataclerk/ui/theme/Theme.kt | 8 +- .../dtree/fhircore/dataclerk/ui/theme/Type.kt | 8 +- android/engine/build.gradle.kts | 476 +++++++++--------- .../fhircore/engine/appfeature/AppFeature.kt | 3 + .../appfeature/model/AppFeatureConfig.kt | 2 +- .../engine/appfeature/model/AppTarget.kt | 2 +- .../engine/appfeature/model/FeatureConfig.kt | 2 +- .../engine/appfeature/model/HealthModule.kt | 2 +- .../MissedFHIRAppointmentsWorker.kt | 4 +- ...roposedWelcomeServiceAppointmentsWorker.kt | 6 +- .../engine/auth/AccountAuthenticator.kt | 33 +- .../fhircore/engine/auth/AuthCredentials.kt | 2 +- .../engine/configuration/Configuration.kt | 2 +- .../configuration/ConfigurationRegistry.kt | 81 ++- .../engine/configuration/FhirConfiguration.kt | 2 +- .../configuration/WorkflowConfigurations.kt | 4 +- .../app/AppConfigClassification.kt | 3 +- .../app/ApplicationConfiguration.kt | 8 +- .../configuration/app/AuthConfiguration.kt | 2 +- .../engine/configuration/app/ConfigService.kt | 8 +- .../app/RegistrySyncParamConfigService.kt | 3 +- .../view/BottomNavigationConfiguration.kt | 4 +- .../view/DataFiltersConfiguration.kt | 6 +- .../configuration/view/FormConfiguration.kt | 4 +- .../ImmunizationProfileViewConfiguration.kt | 6 +- .../view/LoginViewConfiguration.kt | 10 +- .../view/PinViewConfiguration.kt | 8 +- .../view/RegisterViewConfiguration.kt | 6 +- .../fhircore/engine/cql/CqlLibraryHelper.kt | 6 +- .../fhircore/engine/cql/LibraryEvaluator.kt | 44 +- .../fhircore/engine/cql/LibraryLoaderExt.kt | 9 +- .../data/domain/util/PaginatedDataSource.kt | 2 +- .../engine/data/local/DefaultRepository.kt | 16 +- .../engine/data/local/RegisterFilter.kt | 12 +- .../local/register/AppRegisterRepository.kt | 54 +- .../register/dao/AncPatientRegisterDao.kt | 36 +- .../register/dao/AppointmentRegisterDao.kt | 68 +-- .../register/dao/DefaultPatientRegisterDao.kt | 42 +- .../local/register/dao/FamilyRegisterDao.kt | 102 ++-- .../data/local/register/dao/HivRegisterDao.kt | 98 ++-- .../register/dao/HomeTracingRegisterDao.kt | 4 +- .../register/dao/PhoneTracingRegisterDao.kt | 4 +- .../local/register/dao/RegisterDaoFactory.kt | 4 +- .../local/register/dao/TracingRegisterDao.kt | 83 +-- .../data/local/tracing/TracingRepository.kt | 74 +-- .../engine/data/remote/auth/OAuthService.kt | 2 +- .../fhir/resource/FhirResourceConverter.kt | 2 +- .../fhir/resource/FhirResourceDataSource.kt | 4 +- .../fhir/resource/FhirResourceService.kt | 8 +- .../remote/model/response/OAuthResponse.kt | 2 +- .../data/remote/model/response/UserInfo.kt | 2 +- .../data/remote/shared/TokenAuthenticator.kt | 56 ++- .../fhircore/engine/di/CoreModule.kt | 6 +- .../fhircore/engine/di/DispatcherModule.kt | 2 +- .../fhircore/engine/di/FhirEngineModule.kt | 8 +- .../fhircore/engine/di/NetworkModule.kt | 12 +- .../domain/model/FamilyMemberProfileData.kt | 2 +- .../engine/domain/model/HealthStatus.kt | 3 +- .../engine/domain/model/OverflowMenuItem.kt | 2 +- .../engine/domain/model/ProfileData.kt | 10 +- .../engine/domain/model/RegisterData.kt | 10 +- .../engine/domain/model/SideMenuOption.kt | 2 +- .../fhircore/engine/domain/model/Tracing.kt | 2 +- .../engine/domain/model/VisitStatus.kt | 2 +- .../engine/domain/repository/RegisterDao.kt | 6 +- .../domain/repository/RegisterRepository.kt | 13 +- .../engine/domain/util/DataLoadState.kt | 2 + .../navigation/NavigationBottomSheet.kt | 2 +- .../navigation/RegisterBottomSheetViews.kt | 22 +- .../engine/p2p/dao/BaseP2PTransferDao.kt | 22 +- .../engine/p2p/dao/P2PReceiverTransferDao.kt | 7 +- .../engine/p2p/dao/P2PSenderTransferDao.kt | 17 +- .../fhircore/engine/sync/AppSyncWorker.kt | 7 +- .../fhircore/engine/sync/SyncBroadcaster.kt | 9 +- .../engine/sync/SyncListenerManager.kt | 84 ++-- .../engine/task/FhirCarePlanGenerator.kt | 46 +- .../engine/task/FhirTaskPlanWorker.kt | 7 +- .../WelcomeServiceBackToCarePlanWorker.kt | 79 +-- .../ui/appsetting/AppSettingActivity.kt | 5 +- .../engine/ui/appsetting/AppSettingScreen.kt | 27 +- .../ui/appsetting/AppSettingViewModel.kt | 9 +- .../fhircore/engine/ui/base/AlertDialogue.kt | 37 +- .../ui/base/BaseMultiLanguageActivity.kt | 2 +- .../ui/base/BaseRecyclerListViewAdapter.kt | 13 +- .../components/CircularPercentageIndicator.kt | 8 +- .../ui/components/CircularProgressBar.kt | 2 +- .../engine/ui/components/EmptyState.kt | 4 +- .../engine/ui/components/ErrorMessage.kt | 12 +- .../engine/ui/components/FormButton.kt | 19 +- .../engine/ui/components/LoadingIndicator.kt | 2 +- .../ui/components/PaginatedRegisterViews.kt | 12 +- .../fhircore/engine/ui/components/PinView.kt | 15 +- .../engine/ui/components/Separator.kt | 2 +- .../ui/components/register/LoaderView.kt | 12 +- .../ui/components/register/NoResultsView.kt | 6 +- .../ui/components/register/RegisterFooter.kt | 15 +- .../ui/components/register/RegisterHeader.kt | 2 +- .../fhircore/engine/ui/login/LoginActivity.kt | 4 +- .../fhircore/engine/ui/login/LoginError.kt | 2 +- .../engine/ui/login/LoginErrorState.kt | 2 +- .../fhircore/engine/ui/login/LoginScreen.kt | 70 +-- .../engine/ui/login/LoginViewModel.kt | 25 +- .../engine/ui/pin/PinLoginActivity.kt | 4 +- .../fhircore/engine/ui/pin/PinLoginScreen.kt | 53 +- .../engine/ui/pin/PinSetupActivity.kt | 6 +- .../fhircore/engine/ui/pin/PinSetupScreen.kt | 46 +- .../fhircore/engine/ui/pin/PinViewModel.kt | 3 +- .../ui/questionnaire/ExtractionProgress.kt | 1 + .../ui/questionnaire/QuestionnaireActivity.kt | 103 ++-- .../ui/questionnaire/QuestionnaireConfig.kt | 3 +- ...olderFactoryMatchersProviderFactoryImpl.kt | 6 +- .../QuestionnaireNotFoundException.kt | 3 +- .../ui/questionnaire/QuestionnaireType.kt | 4 +- .../questionnaire/QuestionnaireViewModel.kt | 114 +++-- .../ui/register/BaseRegisterActivity.kt | 75 +-- .../ui/register/BaseRegisterFragment.kt | 3 +- .../ui/register/ComposeRegisterFragment.kt | 2 +- .../ui/register/RegisterDataViewModel.kt | 9 +- .../engine/ui/register/RegisterViewModel.kt | 4 +- .../ui/register/model/RegisterFilterType.kt | 2 +- .../ui/register/model/SideMenuOption.kt | 9 +- .../engine/ui/settings/DevViewModel.kt | 20 +- .../fhircore/engine/ui/settings/InfoCard.kt | 12 +- .../engine/ui/settings/ProfileData.kt | 2 +- .../engine/ui/settings/SettingsScreen.kt | 26 +- .../engine/ui/settings/SettingsViewModel.kt | 28 +- .../engine/ui/settings/views/DevMenu.kt | 17 +- .../engine/ui/settings/views/ViewResources.kt | 13 +- .../fhircore/engine/ui/theme/Themes.kt | 5 +- .../ui/userprofile/UserProfileFragment.kt | 6 +- .../ui/userprofile/UserProfileScreen.kt | 29 +- .../ui/userprofile/UserProfileViewModel.kt | 4 +- .../fhircore/engine/util/AppDataStore.kt | 7 +- .../fhircore/engine/util/DateUtils.kt | 7 +- .../engine/util/DispatcherProvider.kt | 3 + .../fhircore/engine/util/FileUtil.kt | 5 +- .../engine/util/SecureSharedPreference.kt | 4 +- .../fhircore/engine/util/SecurityUtil.kt | 7 +- .../engine/util/SharedPreferenceKey.kt | 2 +- .../engine/util/SharedPreferencesHelper.kt | 5 +- .../fhircore/engine/util/TracingHelpers.kt | 3 +- .../util/extension/AndroidExtensions.kt | 6 +- .../util/extension/ApplicationExtension.kt | 23 +- .../util/extension/CarePlanExtension.kt | 14 +- .../util/extension/DateTimeExtension.kt | 5 +- .../util/extension/FhirContextExtension.kt | 2 +- .../util/extension/FhirEngineExtension.kt | 19 +- .../engine/util/extension/PatientExtension.kt | 73 ++- .../util/extension/QuestionnaireExtension.kt | 23 +- .../util/extension/ReferenceExtension.kt | 5 +- .../util/extension/ResourceExtension.kt | 14 +- .../engine/util/extension/SearchExtension.kt | 10 +- .../engine/util/extension/TaskExtension.kt | 14 +- .../engine/util/extension/ViewExtension.kt | 10 +- .../fhircore/engine/app/AppConfigService.kt | 12 +- .../fhircore/engine/app/ConfigServiceTest.kt | 4 +- .../{FakeKeystore.kt => FakeKeyStore.kt} | 23 +- .../fhircore/engine/app/fakes/FakeModel.kt | 2 +- .../fhircore/engine/app/fakes/Faker.kt | 10 +- .../appfeature/AppFeatureManagerTest.kt | 3 +- .../engine/appfeature/AppFeatureTest.kt | 6 +- .../appfeature/model/AppFeatureConfigTest.kt | 2 +- .../appfeature/model/FeatureConfigTest.kt | 4 +- .../MissedFHIRAppointmentsWorkerTest.kt | 6 +- .../engine/auth/AccountAuthenticatorTest.kt | 23 +- .../engine/auth/TokenAuthenticatorTest.kt | 40 +- .../ConfigurationRegistryTest.kt | 7 +- .../app/ApplicationConfigurationTest.kt | 12 +- .../app/AuthConfigurationTest.kt | 2 +- .../view/LoginViewConfigurationTest.kt | 4 +- .../view/PinViewConfigurationTest.kt | 4 +- .../view/RegisterViewConfigurationTest.kt | 4 +- .../engine/cql/CqlLibraryHelperTest.kt | 6 +- .../engine/cql/LibraryEvaluatorTest.kt | 25 +- .../domain/util/PaginatedDataSourceTest.kt | 6 +- .../data/local/DefaultRepositoryTest.kt | 118 ++--- .../register/AppRegisterRepositoryTest.kt | 25 +- .../dao/AppointmentRegisterDaoTest.kt | 24 +- .../local/register/dao/HivRegisterDaoTest.kt | 137 ++--- .../register/dao/RegisterDaoFactoryTest.kt | 2 +- .../register/dao/TracingRegisterDaoTest.kt | 81 +-- .../local/tracing/TracingRepositoryTest.kt | 48 +- .../resource/FhirResourceDataSourceTest.kt | 11 +- .../fhir/resource/ReferenceUrlResolverTest.kt | 13 +- .../shared/FhirResourceConverterTest.kt | 7 +- .../engine/domain/model/HealthStatusTest.kt | 5 +- .../engine/domain/model/ProfileDataTest.kt | 23 +- .../engine/domain/model/RegisterDataTest.kt | 25 +- .../navigation/NavigationBottomSheetTest.kt | 2 +- .../RegisterBottomSheetViewsKtTest.kt | 2 +- .../engine/p2p/dao/BaseP2PTransferDaoTest.kt | 47 +- .../p2p/dao/P2PReceiverTransferDaoTest.kt | 20 +- .../p2p/dao/P2PSenderTransferDaoTest.kt | 22 +- .../fhircore/engine/rule/CoroutineTestRule.kt | 3 + .../fhircore/engine/sync/AppSyncWorkerTest.kt | 7 +- .../engine/sync/SyncBroadcasterTest.kt | 20 +- .../engine/task/FhirCarePlanGeneratorTest.kt | 30 +- .../engine/task/FhirTaskPlanWorkerTest.kt | 8 +- .../WelcomeServiceBackToCarePlanWorkerTest.kt | 20 +- .../engine/ui/RegisterViewModelTest.kt | 4 +- .../ui/appsetting/AppSettingActivityTest.kt | 33 +- .../ui/appsetting/AppSettingViewModelTest.kt | 21 +- .../engine/ui/base/AlertDialogueTest.kt | 26 +- .../ui/components/ErrorMessageKtTest.kt | 2 +- .../engine/ui/components/LoaderViewKtTest.kt | 3 +- .../engine/ui/components/LoginScreenTest.kt | 34 +- .../ui/components/LoginScreenWithLogoTest.kt | 34 +- .../PaginatedRegisterViewsKtTest.kt | 23 +- .../engine/ui/components/PinViewTest.kt | 2 +- .../engine/ui/login/LoginActivityTest.kt | 18 +- .../engine/ui/login/LoginScreenTest.kt | 24 +- .../engine/ui/login/LoginViewModelTest.kt | 36 +- .../engine/ui/pin/PinLoginActivityTest.kt | 2 +- .../engine/ui/pin/PinLoginScreenTest.kt | 24 +- .../engine/ui/pin/PinSetupScreenTest.kt | 22 +- .../engine/ui/pin/PinViewModelTest.kt | 13 +- .../QuestionnaireActivityTest.kt | 125 ++--- .../QuestionnaireNotFoundExceptionTest.kt | 4 +- .../QuestionnaireViewModelTest.kt | 149 +++--- .../ui/register/BaseRegisterActivityTest.kt | 125 ++--- .../ui/register/BaseRegisterFragmentTest.kt | 23 +- .../register/ComposeRegisterFragmentTest.kt | 16 +- .../ui/register/RegisterDataViewModelTest.kt | 13 +- .../engine/ui/settings/InfoCardTest.kt | 1 + .../ui/settings/SettingsScreenKtTest.kt | 1 + .../ui/userprofile/UserProfileFragmentTest.kt | 4 +- .../userprofile/UserProfileViewModelTest.kt | 4 +- .../fhircore/engine/util/FileUtilTest.kt | 2 +- .../engine/util/SecureSharedPreferenceTest.kt | 2 +- .../engine/util/SecurityUtilKtTest.kt | 1 - .../util/SharedPreferencesHelperTest.kt | 11 +- .../extension/AndroidExtensionApi24Test.kt | 2 +- .../extension/ApplicationExtensionTest.kt | 15 +- .../util/extension/CarePlanExtensionTest.kt | 56 +-- .../util/extension/PatientExtensionTest.kt | 36 +- .../extension/QuestionnaireExtensionTest.kt | 12 +- .../util/extension/ResourceExtensionTest.kt | 73 ++- .../util/extension/TaskExtensionTest.kt | 12 +- .../util/extension/ViewExtensionTest.kt | 24 +- .../fhirpath/FhirPathDataExtractorTest.kt | 2 +- .../helper/TransformSupportServicesTest.kt | 41 +- android/quest/build.gradle.kts | 406 +++++++-------- .../fhircore/quest/QuestApplication.kt | 15 +- .../fhircore/quest/QuestConfigService.kt | 14 +- .../view/DataDetailsListViewConfiguration.kt | 6 +- .../view/DetailViewConfiguration.kt | 2 +- .../PatientRegisterRowViewConfiguration.kt | 12 +- .../view/QuestBottomNavigationActions.kt | 2 +- .../ResultDetailsNavigationConfiguration.kt | 2 +- .../quest/data/generic/BasePagingSource.kt | 4 +- .../patient/HivPatientGuardianRepository.kt | 2 +- .../quest/data/patient/PatientRepository.kt | 133 ++--- .../quest/data/patient/model/DetailsModel.kt | 2 +- .../quest/data/patient/model/PatientModels.kt | 12 +- .../patient/model/PatientPagingSourceState.kt | 2 +- .../data/register/RegisterPagingSource.kt | 10 +- .../MeasureReportPatientsPagingSource.kt | 6 +- .../report/measure/MeasureReportRepository.kt | 4 +- .../measure/models/MeasureReportRowData.kt | 2 +- .../quest/data/task/PatientTaskRepository.kt | 18 +- .../quest/data/task/model/PatientTaskItem.kt | 2 +- .../quest/navigation/MainNavigationScreen.kt | 17 +- .../MeasureReportNavigationScreen.kt | 3 + .../quest/navigation/NavigationArg.kt | 7 +- .../quest/navigation/OverflowMenuFactory.kt | 30 +- .../quest/navigation/SideMenuOptionFactory.kt | 10 +- .../fhircore/quest/ui/Components.kt | 14 +- .../quest/ui/StandardRegisterScreen.kt | 24 +- .../quest/ui/StandardRegisterViewModel.kt | 3 + .../register/AppointmentFilterOptions.kt | 13 +- .../register/AppointmentRegisterScreen.kt | 58 ++- .../register/AppointmentRegisterViewModel.kt | 34 +- .../ui/family/profile/FamilyProfileEvent.kt | 4 +- .../ui/family/profile/FamilyProfileScreen.kt | 75 +-- .../family/profile/FamilyProfileViewModel.kt | 38 +- .../components/ChangeFamilyHeadBottomSheet.kt | 39 +- .../components/FamilyMemberBottomSheet.kt | 34 +- .../profile/components/FamilyProfileRow.kt | 56 +-- .../profile/components/FamilyProfileTopBar.kt | 10 +- .../profile/model/FamilyBottomSheetAction.kt | 2 +- .../profile/model/FamilyMemberViewState.kt | 6 +- ...RemoveFamilyEntityQuestionnaireActivity.kt | 2 +- .../RemoveFamilyQuestionnaireActivity.kt | 4 +- .../remove/family/RemoveFamilyViewModel.kt | 8 +- ...RemoveFamilyMemberQuestionnaireActivity.kt | 4 +- .../member/RemoveFamilyMemberViewModel.kt | 2 +- .../quest/ui/login/QuestLoginService.kt | 8 +- .../fhircore/quest/ui/main/AppMainActivity.kt | 39 +- .../fhircore/quest/ui/main/AppMainEvent.kt | 6 + .../fhircore/quest/ui/main/AppMainScreen.kt | 82 +-- .../fhircore/quest/ui/main/AppMainUiState.kt | 6 +- .../quest/ui/main/AppMainViewModel.kt | 13 +- .../quest/ui/main/components/AppDrawer.kt | 61 +-- .../ui/main/components/BottomScreenSection.kt | 66 +-- .../ui/main/components/TopScreenSection.kt | 9 +- .../patient/details/ListDataDetailScreen.kt | 74 +-- .../details/ListDataDetailViewModel.kt | 16 +- .../details/QuestPatientDetailActivity.kt | 41 +- .../QuestionnaireDataDetailActivity.kt | 8 +- .../ui/patient/details/SimpleDetailsScreen.kt | 118 +++-- .../patient/details/SimpleDetailsViewModel.kt | 6 +- .../ui/patient/profile/PatientProfileEvent.kt | 2 +- .../patient/profile/PatientProfileScreen.kt | 59 ++- .../profile/PatientProfileViewModel.kt | 92 ++-- .../childcontact/ChildContactPagingSource.kt | 9 +- .../ChildContactsProfileScreen.kt | 14 +- .../profile/components/PersonalData.kt | 18 +- .../components/ProfileActionableItem.kt | 114 +++-- .../patient/profile/components/ProfileCard.kt | 30 +- .../GuardianNotOnARTProfileScreen.kt | 39 +- .../GuardianNotOnARTProfileViewModel.kt | 15 +- .../guardians/GuardianRegisterUiState.kt | 4 +- .../guardians/GuardianRegisterViewModel.kt | 15 +- .../guardians/GuardiansRegisterScreen.kt | 20 +- .../ui/patient/register/PatientItemMapper.kt | 4 +- .../register/PatientRegisterActivity.kt | 16 +- .../register/PatientRegisterFragment.kt | 19 +- .../patient/register/PatientRegisterScreen.kt | 36 +- .../register/PatientRegisterViewModel.kt | 29 +- .../components/HivPatientRegisterListRow.kt | 26 +- .../register/components/PatientListItem.kt | 28 +- .../components/PatientRegisterList.kt | 12 +- .../register/components/RegisterList.kt | 8 +- .../register/components/RegisterListRow.kt | 70 +-- .../remove/HivPatientQuestionnaireActivity.kt | 2 +- .../ui/report/measure/MeasureReportEvent.kt | 9 +- .../report/measure/MeasureReportMainScreen.kt | 19 +- .../report/measure/MeasureReportViewModel.kt | 88 ++-- .../measure/ReportTypeSelectorUiState.kt | 2 +- .../measure/components/DateRangeItem.kt | 4 +- .../measure/components/DateSelectionBox.kt | 16 +- .../MeasureReportIndividualResultView.kt | 24 +- .../components/MeasureReportPatientRow.kt | 16 +- .../MeasureReportPopulationResultView.kt | 14 +- .../measure/components/MeasureReportRow.kt | 14 +- .../measure/components/PatientSelector.kt | 18 +- .../models/MeasureReportIndividualResult.kt | 2 +- .../models/MeasureReportPopulationResult.kt | 2 +- .../measure/models/MeasureReportTypeData.kt | 2 +- .../screens/MeasureReportListScreen.kt | 6 +- .../screens/MeasureReportPatientsScreen.kt | 12 +- .../screens/MeasureReportResultScreen.kt | 41 +- .../screens/ReportTypeSelectorScreen.kt | 56 +-- .../quest/ui/shared/components/SearchBar.kt | 14 +- .../models/MeasureReportPatientViewData.kt | 2 +- .../ui/shared/models/PatientProfileRowItem.kt | 2 +- .../models/PatientProfileViewSection.kt | 2 +- ...tProfileViewData.kt => ProfileViewData.kt} | 4 +- .../ui/shared/models/RegisterViewData.kt | 2 +- .../quest/ui/task/PatientTaskFragment.kt | 15 +- .../quest/ui/task/PatientTaskItemMapper.kt | 2 +- .../ui/task/components/PatientTaskList.kt | 15 +- .../ui/task/components/PatientTaskListItem.kt | 28 +- .../components/{layouts.kt => Layouts.kt} | 7 +- .../ui/tracing/components/TracingDataList.kt | 17 +- .../details/TracingHistoryDetailsScreen.kt | 14 +- .../details/TracingHistoryDetailsViewModel.kt | 7 +- .../ui/tracing/history/TracingHistoryEvent.kt | 2 +- .../tracing/history/TracingHistoryScreen.kt | 14 +- .../history/TracingHistoryViewModel.kt | 7 +- .../tracing/outcomes/TracingOutcomesEvent.kt | 2 +- .../tracing/outcomes/TracingOutcomesScreen.kt | 8 +- .../outcomes/TracingOutcomesViewModel.kt | 6 +- .../ui/tracing/profile/TracingProfileEvent.kt | 4 +- .../tracing/profile/TracingProfileScreen.kt | 103 ++-- .../profile/TracingProfileViewModel.kt | 27 +- .../tracing/register/TracingFilterOptions.kt | 23 +- .../tracing/register/TracingRegisterScreen.kt | 52 +- .../register/TracingRegisterViewModel.kt | 44 +- .../fhircore/quest/util/FhirPathUtil.kt | 3 +- .../quest/util/GeneralListViewModel.kt | 2 + .../fhircore/quest/util/PatientUtil.kt | 41 +- .../quest/util/QuestConfigClassification.kt | 4 +- .../MeasureReportPatientViewDataMapper.kt | 2 +- .../util/mappers/ProfileViewDataMapper.kt | 52 +- .../util/mappers/RegisterViewDataMapper.kt | 47 +- .../util/mappers/TracingFilterMappers.kt | 6 +- .../fhircore/quest/CqlContentTest.kt | 55 +- .../fhircore/quest/QuestConfigServiceTest.kt | 3 +- .../fhircore/quest/RegisterContentTest.kt | 17 +- .../{FakeKeystore.kt => FakeKeyStore.kt} | 23 +- .../fhircore/quest/app/fakes/Faker.kt | 39 +- .../view/DetailViewConfigurationTest.kt | 7 +- ...esultDetailsNavigationConfigurationTest.kt | 6 +- .../quest/coroutine/CoroutineTestRule.kt | 3 + .../quest/data/PatientRepositoryTest.kt | 71 +-- .../quest/data/PatientTaskRepositoryTest.kt | 6 +- .../data/task/model/PatientTaskItemTest.kt | 4 +- .../navigation/OverflowMenuFactoryTest.kt | 7 +- .../quest/robolectric/FhircoreTestRunner.kt | 1 + .../quest/robolectric/RobolectricTest.kt | 15 +- .../details/ListDataDetailScreenTest.kt | 33 +- .../details/ListDataDetailViewModelTest.kt | 36 +- .../details/QuestPatientDetailActivityTest.kt | 57 ++- ...estionnaireDataDetailDetailActivityTest.kt | 6 +- .../details/SimpleDetailsActivityTest.kt | 12 +- .../details/SimpleDetailsScreenTest.kt | 5 +- .../details/SimpleDetailsViewModelTest.kt | 6 +- .../ui/patient/register/PatientMapperTest.kt | 2 +- .../register/PatientRegisterActivityTest.kt | 28 +- .../register/PatientRegisterFragmentTest.kt | 22 +- .../register/PatientRegisterListTest.kt | 8 +- .../register/components/PatientRowTest.kt | 9 +- .../quest/ui/task/PatientTaskFragmentTest.kt | 10 +- .../ui/task/PatientTaskItemMapperTest.kt | 2 +- .../components/PatientTaskListItemTest.kt | 18 +- .../fhircore/quest/util/PatientUtilTest.kt | 12 +- .../util/mappers/ProfileViewDataMapperTest.kt | 43 +- 428 files changed, 5003 insertions(+), 4440 deletions(-) rename android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/{State.kt => SearchModelState.kt} (95%) rename android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/{FakeKeystore.kt => FakeKeyStore.kt} (97%) rename android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/{PatientProfileViewData.kt => ProfileViewData.kt} (98%) rename android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/{layouts.kt => Layouts.kt} (93%) rename android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/{FakeKeystore.kt => FakeKeyStore.kt} (97%) diff --git a/android/buildSrc/src/main/kotlin/Deps.kt b/android/buildSrc/src/main/kotlin/Deps.kt index 588e4731ae..39fa3fb3aa 100644 --- a/android/buildSrc/src/main/kotlin/Deps.kt +++ b/android/buildSrc/src/main/kotlin/Deps.kt @@ -40,7 +40,7 @@ object Deps { const val retrofit = "2.7.2" const val robolectric = "4.9.2" const val room = "2.4.2" - const val spotless = "5.11.0" + const val spotless = "6.25.0" const val truth = "1.0.1" const val work = "2.7.1" const val json_tools = "1.13" diff --git a/android/dataclerk/build.gradle.kts b/android/dataclerk/build.gradle.kts index 9824035382..9f2a0debaa 100644 --- a/android/dataclerk/build.gradle.kts +++ b/android/dataclerk/build.gradle.kts @@ -1,169 +1,180 @@ plugins { - `fhir-properties` - id("com.android.application") - id("kotlin-android") - id("kotlin-kapt") - id("de.mannodermaus.android-junit5") version "1.9.3.0" - id("org.jetbrains.dokka") - id("org.jetbrains.kotlin.plugin.serialization") - id("dagger.hilt.android.plugin") - id("org.jetbrains.kotlin.android") - id("com.google.firebase.firebase-perf") - id("com.google.gms.google-services") - id("com.google.firebase.crashlytics") + `fhir-properties` + id("com.android.application") + id("kotlin-android") + id("kotlin-kapt") + id("de.mannodermaus.android-junit5") version "1.9.3.0" + id("org.jetbrains.dokka") + id("org.jetbrains.kotlin.plugin.serialization") + id("dagger.hilt.android.plugin") + id("org.jetbrains.kotlin.android") + id("com.google.firebase.firebase-perf") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") } -kotlin { - jvmToolchain(17) -} +kotlin { jvmToolchain(17) } android { - namespace = "org.dtree.fhircore.dataclerk" - compileSdk = Deps.sdk_versions.compile_sdk - - defaultConfig { - applicationId = "org.dtree.fhircore.dataclerk" - minSdk = Deps.sdk_versions.min_sdk - targetSdk = Deps.sdk_versions.target_sdk - versionCode = 4 - versionName = "1.0.1" - multiDexEnabled = true - - buildConfigField("boolean", "SKIP_AUTH_CHECK", "false") - buildConfigField("String", "FHIR_BASE_URL", """"${project.extra["FHIR_BASE_URL"]}"""") - buildConfigField("String", "OAUTH_BASE_URL", """"${project.extra["OAUTH_BASE_URL"]}"""") - buildConfigField("String", "OAUTH_CIENT_ID", """"${project.extra["OAUTH_CIENT_ID"]}"""") - buildConfigField("String", "OAUTH_CLIENT_SECRET", """"${project.extra["OAUTH_CLIENT_SECRET"]}"""") - buildConfigField("String", "OAUTH_SCOPE", """"${project.extra["OAUTH_SCOPE"]}"""") - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary = true - } + namespace = "org.dtree.fhircore.dataclerk" + compileSdk = Deps.sdk_versions.compile_sdk + + defaultConfig { + applicationId = "org.dtree.fhircore.dataclerk" + minSdk = Deps.sdk_versions.min_sdk + targetSdk = Deps.sdk_versions.target_sdk + versionCode = 4 + versionName = "1.0.1" + multiDexEnabled = true + + buildConfigField("boolean", "SKIP_AUTH_CHECK", "false") + buildConfigField("String", "FHIR_BASE_URL", """"${project.extra["FHIR_BASE_URL"]}"""") + buildConfigField("String", "OAUTH_BASE_URL", """"${project.extra["OAUTH_BASE_URL"]}"""") + buildConfigField("String", "OAUTH_CIENT_ID", """"${project.extra["OAUTH_CIENT_ID"]}"""") + buildConfigField( + "String", + "OAUTH_CLIENT_SECRET", + """"${project.extra["OAUTH_CLIENT_SECRET"]}"""", + ) + buildConfigField("String", "OAUTH_SCOPE", """"${project.extra["OAUTH_SCOPE"]}"""") + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { useSupportLibrary = true } + } + + // signingConfigs { + // release { + // + // v1SigningEnabled false + // v2SigningEnabled true + // + // keyAlias System.getenv("KEYSTORE_ALIAS")?: project.KEYSTORE_ALIAS + // keyPassword System.getenv("KEY_PASSWORD") ?: project.KEY_PASSWORD + // storePassword System.getenv("KEYSTORE_PASSWORD") ?: project.KEYSTORE_PASSWORD + // storeFile file(System.getProperty("user.home") + "/fhircore.keystore.jks") + // } + // } + + buildTypes { + debug { + // enableUnitTestCoverage true + resValue("string", "authenticator_account_type", "\"${android.defaultConfig.applicationId}\"") } - -// signingConfigs { -// release { -// -// v1SigningEnabled false -// v2SigningEnabled true -// -// keyAlias System.getenv("KEYSTORE_ALIAS")?: project.KEYSTORE_ALIAS -// keyPassword System.getenv("KEY_PASSWORD") ?: project.KEY_PASSWORD -// storePassword System.getenv("KEYSTORE_PASSWORD") ?: project.KEYSTORE_PASSWORD -// storeFile file(System.getProperty("user.home") + "/fhircore.keystore.jks") -// } -// } - - buildTypes { - debug { -// enableUnitTestCoverage true - resValue("string", "authenticator_account_type", "\"${android.defaultConfig.applicationId}\"") - } - release { - resValue("string", "authenticator_account_type", "\"${android.defaultConfig.applicationId}\"") -// minifyEnabled false -// proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" -// signingConfig signingConfigs.release -// firebaseCrashlytics { -// nativeSymbolUploadEnabled false -// } - } + release { + resValue("string", "authenticator_account_type", "\"${android.defaultConfig.applicationId}\"") + // minifyEnabled false + // proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), + // "proguard-rules.pro" + // signingConfig signingConfigs.release + // firebaseCrashlytics { + // nativeSymbolUploadEnabled false + // } } + } - compileOptions { - isCoreLibraryDesugaringEnabled = true - } + compileOptions { isCoreLibraryDesugaringEnabled = true } - kotlinOptions { - freeCompilerArgs = listOf("-Xjvm-default=all-compatibility", "-opt-in=kotlin.RequiresOptIn") - } + kotlinOptions { + freeCompilerArgs = listOf("-Xjvm-default=all-compatibility", "-opt-in=kotlin.RequiresOptIn") + } - buildFeatures { - compose = true - buildConfig = true - } + buildFeatures { + compose = true + buildConfig = true + } - composeOptions { - kotlinCompilerExtensionVersion = "1.4.8" - } + composeOptions { kotlinCompilerExtensionVersion = "1.4.8" } - testOptions { - execution = "ANDROIDX_TEST_ORCHESTRATOR" - animationsDisabled = true - - unitTests { - isIncludeAndroidResources = true - isReturnDefaultValues = true - all { -// beforeTest { -// println("${it.className} > ${it.name} STARTED") -// } - } - } + testOptions { + execution = "ANDROIDX_TEST_ORCHESTRATOR" + animationsDisabled = true + + unitTests { + isIncludeAndroidResources = true + isReturnDefaultValues = true + all { + // beforeTest { + // println("${it.className} > ${it.name} STARTED") + // } + } } - packaging { - resources { - excludes += listOf("META-INF/ASL-2.0.txt", "META-INF/LGPL-3.0.txt", "license.html", "readme.html", "META-INF/DEPENDENCIES", "META-INF/LICENSE", "META-INF/LICENSE.txt", "META-INF/license.txt", "META-INF/license.html", "META-INF/LICENSE.md", "META-INF/NOTICE", "META-INF/NOTICE.txt", "META-INF/NOTICE.md", "META-INF/notice.txt", "META-INF/ASL2.0", "META-INF/ASL-2.0.txt", "META-INF/LGPL-3.0.txt", "META-INF/sun-jaxb.episode", "META-INF/*.kotlin_module", "META-INF/AL2.0", "META-INF/LGPL2.1") - } + } + packaging { + resources { + excludes += + listOf( + "META-INF/ASL-2.0.txt", + "META-INF/LGPL-3.0.txt", + "license.html", + "readme.html", + "META-INF/DEPENDENCIES", + "META-INF/LICENSE", + "META-INF/LICENSE.txt", + "META-INF/license.txt", + "META-INF/license.html", + "META-INF/LICENSE.md", + "META-INF/NOTICE", + "META-INF/NOTICE.txt", + "META-INF/NOTICE.md", + "META-INF/notice.txt", + "META-INF/ASL2.0", + "META-INF/ASL-2.0.txt", + "META-INF/LGPL-3.0.txt", + "META-INF/sun-jaxb.episode", + "META-INF/*.kotlin_module", + "META-INF/AL2.0", + "META-INF/LGPL2.1", + ) } + } + configurations.configureEach { + resolutionStrategy { force("ca.uhn.hapi.fhir:org.hl7.fhir.utilities:5.5.7") } + } - configurations.configureEach { - resolutionStrategy { - force("ca.uhn.hapi.fhir:org.hl7.fhir.utilities:5.5.7") - } - } + lint { abortOnError = false } - lint { - abortOnError = false - } - - testCoverage { jacocoVersion = Deps.versions.jacoco_tool } + testCoverage { jacocoVersion = Deps.versions.jacoco_tool } } dependencies { - coreLibraryDesugaring(Deps.desugar) - implementation(project(":engine")) - - implementation("androidx.core:core-ktx:1.8.0") - implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0")) - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.3.1") - implementation("androidx.activity:activity-compose:1.5.1") - - implementation(Deps.accompanist.swiperefresh) - - implementation(platform("androidx.compose:compose-bom:2022.10.00")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material3:material3") - implementation("androidx.paging:paging-compose:3.2.0") - - //Hilt - Dependency Injection - implementation("com.google.dagger:hilt-android:${Deps.versions.hiltVersion}") - kapt("com.google.dagger:hilt-compiler:${Deps.versions.hiltVersion}") - - // analytics - implementation(platform("com.google.firebase:firebase-bom:31.2.0")) - - implementation("com.google.firebase:firebase-perf-ktx") - implementation("com.google.firebase:firebase-crashlytics-ktx") - implementation("com.google.firebase:firebase-analytics-ktx") - - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2022.10.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") - debugImplementation("androidx.compose.ui:ui-test-manifest") + coreLibraryDesugaring(Deps.desugar) + implementation(project(":engine")) + + implementation("androidx.core:core-ktx:1.8.0") + implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0")) + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.3.1") + implementation("androidx.activity:activity-compose:1.5.1") + + implementation(Deps.accompanist.swiperefresh) + + implementation(platform("androidx.compose:compose-bom:2022.10.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3") + implementation("androidx.paging:paging-compose:3.2.0") + + // Hilt - Dependency Injection + implementation("com.google.dagger:hilt-android:${Deps.versions.hiltVersion}") + kapt("com.google.dagger:hilt-compiler:${Deps.versions.hiltVersion}") + + // analytics + implementation(platform("com.google.firebase:firebase-bom:31.2.0")) + + implementation("com.google.firebase:firebase-perf-ktx") + implementation("com.google.firebase:firebase-crashlytics-ktx") + implementation("com.google.firebase:firebase-analytics-ktx") + + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2022.10.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") } -kapt { - correctErrorTypes = true -} +kapt { correctErrorTypes = true } -hilt { - enableAggregatingTask = true -} \ No newline at end of file +hilt { enableAggregatingTask = true } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/DataClerkApplication.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/DataClerkApplication.kt index c14ce58729..fc9746ccf6 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/DataClerkApplication.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/DataClerkApplication.kt @@ -58,7 +58,7 @@ class DataClerkApplication : Application(), DataCaptureConfig.Provider, Configur urlResolver = referenceUrlResolver, xFhirQueryResolver = xFhirQueryResolver, questionnaireItemViewHolderFactoryMatchersProviderFactory = - QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl + QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl, ) return configuration as DataCaptureConfig } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/DataClerkConfigService.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/DataClerkConfigService.kt index c2bdf0b211..27d283049e 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/DataClerkConfigService.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/DataClerkConfigService.kt @@ -37,7 +37,7 @@ class DataClerkConfigService @Inject constructor(@ApplicationContext val context oauthServerBaseUrl = BuildConfig.OAUTH_BASE_URL, clientId = BuildConfig.OAUTH_CIENT_ID, clientSecret = BuildConfig.OAUTH_CLIENT_SECRET, - accountType = BuildConfig.APPLICATION_ID + accountType = BuildConfig.APPLICATION_ID, ) override fun defineResourceTags() = @@ -48,7 +48,7 @@ class DataClerkConfigService @Inject constructor(@ApplicationContext val context Coding().apply { system = context.getString(R.string.sync_strategy_careteam_system) display = context.getString(R.string.sync_strategy_careteam_display) - } + }, ), ResourceTag( type = ResourceType.Location.name, @@ -56,7 +56,7 @@ class DataClerkConfigService @Inject constructor(@ApplicationContext val context Coding().apply { system = context.getString(R.string.sync_strategy_location_system) display = context.getString(R.string.sync_strategy_location_display) - } + }, ), ResourceTag( type = ResourceType.Organization.name, @@ -64,7 +64,7 @@ class DataClerkConfigService @Inject constructor(@ApplicationContext val context Coding().apply { system = context.getString(R.string.sync_strategy_organization_system) display = context.getString(R.string.sync_strategy_organization_display) - } + }, ), ResourceTag( type = SharedPreferenceKey.PRACTITIONER_ID.name, @@ -73,7 +73,7 @@ class DataClerkConfigService @Inject constructor(@ApplicationContext val context system = context.getString(R.string.sync_strategy_practitioner_system) display = context.getString(R.string.sync_strategy_practitioner_display) }, - isResource = false + isResource = false, ), ResourceTag( type = SharedPreferenceKey.APP_ID.name, @@ -82,7 +82,7 @@ class DataClerkConfigService @Inject constructor(@ApplicationContext val context system = context.getString(R.string.sync_strategy_appid_system) display = context.getString(R.string.application_id) }, - isResource = false - ) + isResource = false, + ), ) } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/di/DataClerkLoginService.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/di/DataClerkLoginService.kt index ba67e6f7ea..84ee521603 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/di/DataClerkLoginService.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/di/DataClerkLoginService.kt @@ -31,7 +31,7 @@ class DataClerkLoginService @Inject constructor() : LoginService { startActivity( Intent(loginActivity, AppMainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - } + }, ) finish() } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/HomeScreen.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/HomeScreen.kt index 3204cf36c0..52c636b43f 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/HomeScreen.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/HomeScreen.kt @@ -67,7 +67,7 @@ fun HomeScreen( val patientRegistrationLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult(), - onResult = {} + onResult = {}, ) val syncState by appMainViewModel.syncSharedFlow.collectAsState(initial = null) val refreshKey by appMainViewModel.refreshHash @@ -108,7 +108,7 @@ fun HomeScreen( contentDescription = "Search", ) } - } + }, ) SyncStatusBar( syncState = syncState, @@ -116,18 +116,21 @@ fun HomeScreen( } }, bottomBar = { - if (!appState.isInitialSync) + if (!appState.isInitialSync) { Button( onClick = { patientRegistrationLauncher.launch(appMainViewModel.openForm(context)) }, - modifier = Modifier.fillMaxWidth() - ) { Text(text = appState.registrationButton) } - } + modifier = Modifier.fillMaxWidth(), + ) { + Text(text = appState.registrationButton) + } + } + }, ) { paddingValues -> Column(Modifier.padding(paddingValues)) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { val count by homeViewModel.patientCount Text(text = "Patients: $count") @@ -161,21 +164,25 @@ fun AppScreenBody(syncState: SyncJobStatus?, sync: () -> Unit) { Row() { Button( onClick = sync, - enabled = !(syncState is SyncJobStatus.InProgress || syncState is SyncJobStatus.Started) + enabled = !(syncState is SyncJobStatus.InProgress || syncState is SyncJobStatus.Started), ) { when (syncState) { - is SyncJobStatus.InProgress, is SyncJobStatus.Started -> { + is SyncJobStatus.InProgress, + is SyncJobStatus.Started, -> { Text( text = - if (syncState is SyncJobStatus.Started) stringResource(R.string.syncing_initiated) - else - "${(syncState as SyncJobStatus.InProgress).syncOperation.name.lowercase()}ing...", + if (syncState is SyncJobStatus.Started) { + stringResource(R.string.syncing_initiated) + } else { + "${(syncState as SyncJobStatus.InProgress).syncOperation.name.lowercase()}ing..." + }, ) } is SyncJobStatus.Finished -> { Text(text = "Sync (finished)") } - is SyncJobStatus.Glitch, is SyncJobStatus.Failed -> { + is SyncJobStatus.Glitch, + is SyncJobStatus.Failed, -> { Text(text = "Sync (failed)") } else -> { diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/HomeViewModel.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/HomeViewModel.kt index cebc5b2d4b..ba2dce84da 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/HomeViewModel.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/HomeViewModel.kt @@ -38,16 +38,18 @@ class HomeViewModel @Inject constructor(private val dataStore: AppDataStore) : V val patientCount = mutableStateOf(0L) var patientsPaging: MutableStateFlow>> = MutableStateFlow(emptyFlow()) + init { refresh() } + private fun getPatients() = Pager( config = PagingConfig( pageSize = 20, ), - pagingSourceFactory = { PatientPagingSource(dataStore) } + pagingSourceFactory = { PatientPagingSource(dataStore) }, ) .flow .cachedIn(viewModelScope) diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/PatientList.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/PatientList.kt index 85e1092cfe..0b01c75b07 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/PatientList.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/home/PatientList.kt @@ -68,7 +68,7 @@ fun PatientList(viewModel: HomeViewModel, navigate: (PatientItem) -> Unit) { item { ErrorMessage( message = state.error.also { Timber.e(it) }.localizedMessage!!, - onClickRetry = { patients.retry() } + onClickRetry = { patients.retry() }, ) } } @@ -92,7 +92,7 @@ fun PatientList(viewModel: HomeViewModel, navigate: (PatientItem) -> Unit) { item { ErrorMessage( message = state.error.also { Timber.e(it) }.localizedMessage!!, - onClickRetry = { patients.retry() } + onClickRetry = { patients.retry() }, ) } } @@ -120,25 +120,25 @@ fun PatientItemCard(patient: PatientItem, onClick: () -> Unit) { Column(Modifier.padding(Constants.defaultCardPadding).fillMaxWidth()) { Text( text = patient.name, - style = MaterialTheme.typography.labelLarge.copy(fontWeight = FontWeight.Bold) + style = MaterialTheme.typography.labelLarge.copy(fontWeight = FontWeight.Bold), ) Row( Modifier.fillMaxWidth().padding(top = 8.dp), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Box( modifier = Modifier.background( color = MaterialTheme.colorScheme.primary, - shape = RoundedCornerShape(8.dp) + shape = RoundedCornerShape(8.dp), ) - .padding(8.dp) + .padding(8.dp), ) { Text( text = "Id: #${patient.id}", style = - MaterialTheme.typography.labelSmall.copy(color = MaterialTheme.colorScheme.onPrimary) + MaterialTheme.typography.labelSmall.copy(color = MaterialTheme.colorScheme.onPrimary), ) } Text(text = getFormattedAge(patient, LocalContext.current.resources)) diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppDataStore.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppDataStore.kt index 4d51a0df15..fa7275389a 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppDataStore.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppDataStore.kt @@ -53,7 +53,7 @@ class AppDataStore constructor( private val fhirEngine: FhirEngine, private val configurationRegistry: ConfigurationRegistry, - val defaultRepository: DefaultRepository + val defaultRepository: DefaultRepository, ) { private val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser() @@ -89,7 +89,7 @@ constructor( suspend fun patientCount(): Long { return fhirEngine.count( - Search(ResourceType.Patient).apply { filter(Patient.ACTIVE, { value = of(true) }) } + Search(ResourceType.Patient).apply { filter(Patient.ACTIVE, { value = of(true) }) }, ) } @@ -101,7 +101,7 @@ constructor( { modifier = StringFilterModifier.CONTAINS value = text - } + }, ) filter(Patient.IDENTIFIER, { value = of(Identifier().apply { value = text }) }) operation = Operation.OR @@ -127,14 +127,14 @@ data class PatientItem( val chwAssigned: String, val healthStatus: HealthStatus, val practitioners: List? = null, - val dateCreated: Date? = null + val dateCreated: Date? = null, ) data class AddressData( val district: String = "", val state: String = "", val text: String = "", - val fullAddress: String = "" + val fullAddress: String = "", ) internal fun Patient.toPatientItem(configuration: ApplicationConfiguration): PatientItem { @@ -142,9 +142,11 @@ internal fun Patient.toPatientItem(configuration: ApplicationConfiguration): Pat val isActive = active val gender = if (hasGenderElement()) genderElement.valueAsString else "" val dob = - if (hasBirthDateElement()) + if (hasBirthDateElement()) { LocalDate.parse(birthDateElement.valueAsString, DateTimeFormatter.ISO_DATE) - else null + } else { + null + } return PatientItem( id = this.extractOfficialIdentifier() ?: "N/A", resourceId = this.logicalId, @@ -162,8 +164,8 @@ internal fun Patient.toPatientItem(configuration: ApplicationConfiguration): Pat district = this.extractWithFhirPath("Patient.address.district"), state = this.extractWithFhirPath("Patient.address.state"), text = this.extractWithFhirPath("Patient.address.text"), - fullAddress = this.extractAddress() + fullAddress = this.extractAddress(), ), - dateCreated = this.meta.lastUpdated + dateCreated = this.meta.lastUpdated, ) } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainActivity.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainActivity.kt index b9a7ad6daa..ba09c8e0c6 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainActivity.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainActivity.kt @@ -42,8 +42,10 @@ import timber.log.Timber class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { private val appMainViewModel by viewModels() private val homeViewModel by viewModels() + @Inject lateinit var syncBroadcaster: SyncBroadcaster var lastSyncState: SyncJobStatus? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -70,7 +72,7 @@ class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { } is SyncJobStatus.InProgress -> { Timber.d( - "Syncing in progress: ${state.syncOperation.name} ${state.completed.div(max(state.total, 1).toDouble()).times(100)}%" + "Syncing in progress: ${state.syncOperation.name} ${state.completed.div(max(state.total, 1).toDouble()).times(100)}%", ) appMainViewModel.onEvent(AppMainEvent.UpdateSyncState(state, null)) } @@ -79,11 +81,12 @@ class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { Timber.w( (if (state?.exceptions != null) state.exceptions else emptyList()).joinToString { it.exception.message.toString() - } + }, ) } is SyncJobStatus.Failed -> { - if (!state?.exceptions.isNullOrEmpty() && + if ( + !state?.exceptions.isNullOrEmpty() && state.exceptions.first().resourceType == ResourceType.Flag ) { if (lastSyncState !is SyncJobStatus.Failed) { @@ -100,13 +103,15 @@ class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { AppMainEvent.UpdateSyncState( state, lastSyncTime = - if (!appMainViewModel.retrieveLastSyncTimestamp().isNullOrEmpty()) + if (!appMainViewModel.retrieveLastSyncTimestamp().isNullOrEmpty()) { getString( org.smartregister.fhircore.engine.R.string.last_sync_timestamp, - appMainViewModel.retrieveLastSyncTimestamp() + appMainViewModel.retrieveLastSyncTimestamp(), ) - else null - ) + } else { + null + }, + ), ) } is SyncJobStatus.Finished -> { @@ -119,9 +124,9 @@ class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { state, getString( org.smartregister.fhircore.engine.R.string.last_sync_timestamp, - formatLastSyncTimestamp(state.timestamp) - ) - ) + formatLastSyncTimestamp(state.timestamp), + ), + ), ) updateLastSyncTimestamp(state.timestamp) } @@ -134,9 +139,10 @@ class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) + if (resultCode == Activity.RESULT_OK) { data?.getStringExtra(QuestionnaireActivity.QUESTIONNAIRE_BACK_REFERENCE_KEY)?.let { appMainViewModel.onTaskComplete() } + } } } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainEvent.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainEvent.kt index e3a959dfd8..714a9ab895 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainEvent.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainEvent.kt @@ -25,18 +25,24 @@ sealed class AppMainEvent(val state: SyncJobStatus) { data class SwitchLanguage( val syncState: SyncJobStatus, val language: Language, - val context: Context + val context: Context, ) : AppMainEvent(syncState) + data class DeviceToDeviceSync(val syncState: SyncJobStatus, val context: Context) : AppMainEvent(syncState) + data class Logout(val syncState: SyncJobStatus, val context: Context) : AppMainEvent(syncState) + data class SyncData(val syncState: SyncJobStatus, val launchManualAuth: (Intent) -> Unit) : AppMainEvent(syncState) + data class ResumeSync(val syncState: SyncJobStatus) : AppMainEvent(syncState) + data class UpdateSyncState(val syncState: SyncJobStatus, val lastSyncTime: String?) : AppMainEvent(syncState) + data class RefreshAuthToken( val syncState: SyncJobStatus, - val launchManualAuth: (Intent) -> Unit + val launchManualAuth: (Intent) -> Unit, ) : AppMainEvent(syncState) } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainUiState.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainUiState.kt index 9b19f5e808..76e326fe90 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainUiState.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainUiState.kt @@ -45,6 +45,6 @@ fun appMainUiStateOf( currentLanguage = currentLanguage, languages = languages, isInitialSync = isInitialSync, - registrationButton = registrationButton + registrationButton = registrationButton, ) } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainViewModel.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainViewModel.kt index fd8ccfdd77..3ab0907d4a 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainViewModel.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppMainViewModel.kt @@ -54,7 +54,7 @@ constructor( private val configurationRegistry: ConfigurationRegistry, private val sharedPreferencesHelper: SharedPreferencesHelper, private val secureSharedPreference: SecureSharedPreference, - private val dataStore: AppDataStore + private val dataStore: AppDataStore, ) : ViewModel() { private val patientRegisterConfiguration: RegisterViewConfiguration by lazy { @@ -77,7 +77,7 @@ constructor( lastSyncTime = retrieveLastSyncTimestamp() ?: "", languages = configurationRegistry.fetchLanguages(), isInitialSync = syncBroadcaster.isInitialSync(), - registrationButton = patientRegisterConfiguration.newClientButtonText + registrationButton = patientRegisterConfiguration.newClientButtonText, ) } @@ -86,7 +86,7 @@ constructor( private fun loadCurrentLanguage() = Locale.forLanguageTag( - sharedPreferencesHelper.read(SharedPreferenceKey.LANG.name, Locale.UK.toLanguageTag())!! + sharedPreferencesHelper.read(SharedPreferenceKey.LANG.name, Locale.UK.toLanguageTag())!!, ) .displayName @@ -110,9 +110,9 @@ constructor( text = if (isArtClient) "client-already-on-art" else "exposed-infant" addCoding(artCode) } - } + }, ), - ) + ), ) } @@ -122,18 +122,19 @@ constructor( when (event) { is AppMainEvent.UpdateSyncState -> { when (event.state) { - is SyncJobStatus.Finished, is SyncJobStatus.Failed -> { + is SyncJobStatus.Finished, + is SyncJobStatus.Failed, -> { val lastSyncTime = event.lastSyncTime ?: (retrieveLastSyncTimestamp() ?: "") appMainUiState.value = appMainUiState.value.copy( lastSyncTime = lastSyncTime, - isInitialSync = lastSyncTime.isEmpty() + isInitialSync = lastSyncTime.isEmpty(), ) } else -> appMainUiState.value = appMainUiState.value.copy( - lastSyncTime = event.lastSyncTime ?: appMainUiState.value.lastSyncTime + lastSyncTime = event.lastSyncTime ?: appMainUiState.value.lastSyncTime, ) } } @@ -149,12 +150,11 @@ constructor( fun updateLastSyncTimestamp(timestamp: OffsetDateTime) { sharedPreferencesHelper.write( SharedPreferenceKey.LAST_SYNC_TIMESTAMP.name, - formatLastSyncTimestamp(timestamp) + formatLastSyncTimestamp(timestamp), ) } fun formatLastSyncTimestamp(timestamp: OffsetDateTime): String { - val syncTimestampFormatter = SimpleDateFormat(SYNC_TIMESTAMP_INPUT_FORMAT, Locale.getDefault()).apply { timeZone = TimeZone.getDefault() diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppScreen.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppScreen.kt index 11ec55cc07..0e1a2c91f3 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppScreen.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/main/AppScreen.kt @@ -33,7 +33,7 @@ import org.smartregister.fhircore.engine.ui.settings.SettingsScreen fun AppScreen( appMainViewModel: AppMainViewModel, homeViewModel: HomeViewModel = hiltViewModel(), - sync: () -> Unit + sync: () -> Unit, ) { val navController = rememberNavController() NavHost(navController = navController, startDestination = "home") { @@ -43,13 +43,17 @@ fun AppScreen( homeViewModel = homeViewModel, navController = navController, sync = sync, - search = { navController.navigate("search") } - ) { navController.navigate("patient/${it.resourceId}") } + search = { navController.navigate("search") }, + ) { + navController.navigate("patient/${it.resourceId}") + } } composable( "patient/{patientId}", - arguments = listOf(navArgument("patientId") { type = NavType.StringType }) - ) { PatientScreen(navController, appMainViewModel = appMainViewModel) } + arguments = listOf(navArgument("patientId") { type = NavType.StringType }), + ) { + PatientScreen(navController, appMainViewModel = appMainViewModel) + } composable("search") { SearchScreen(navHostController = navController) } composable("info") { SettingsScreen(navController = navController) } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientDetail.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientDetail.kt index f8a6a499f7..2314ac166f 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientDetail.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientDetail.kt @@ -21,14 +21,18 @@ import org.hl7.fhir.r4.model.Resource sealed class PatientDetailScreenState { object Loading : PatientDetailScreenState() + data class Success(val patientDetail: PatientItem, val detailsData: List) : PatientDetailScreenState() + data class Error(val message: String) : PatientDetailScreenState() } sealed class ResourcePropertyState { object Loading : ResourcePropertyState() + data class Success(val resource: Resource) : ResourcePropertyState() + data class Error(val message: String) : ResourcePropertyState() } @@ -40,25 +44,25 @@ interface PatientDetailData { data class PatientDetailHeader( val header: String, override val firstInGroup: Boolean = false, - override val lastInGroup: Boolean = false + override val lastInGroup: Boolean = false, ) : PatientDetailData data class PatientDetailProperty( val patientProperty: PatientProperty, override val firstInGroup: Boolean = false, - override val lastInGroup: Boolean = false + override val lastInGroup: Boolean = false, ) : PatientDetailData data class PatientDetailOverview( val patient: PatientItem, override val firstInGroup: Boolean = false, - override val lastInGroup: Boolean = false + override val lastInGroup: Boolean = false, ) : PatientDetailData data class PatientReferenceProperty( val patientProperty: PatientProperty, override val firstInGroup: Boolean = false, - override val lastInGroup: Boolean = false + override val lastInGroup: Boolean = false, ) : PatientDetailData data class PatientProperty(val header: String, val value: String) diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientScreen.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientScreen.kt index 8828acf38b..0073d2bbed 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientScreen.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientScreen.kt @@ -65,7 +65,7 @@ import org.hl7.fhir.r4.model.Practitioner fun PatientScreen( navController: NavController, appMainViewModel: AppMainViewModel, - patientViewModel: PatientViewModel = hiltViewModel() + patientViewModel: PatientViewModel = hiltViewModel(), ) { val state by patientViewModel.screenState.collectAsState() @@ -93,9 +93,9 @@ fun PatientScreen( Text(text = (state as PatientDetailScreenState.Success).patientDetail.name) } }, - actions = {} + actions = {}, ) - } + }, ) { paddingValues -> Column(Modifier.padding(paddingValues).fillMaxSize()) { PatientDetailsTab(state, patientViewModel) @@ -106,7 +106,7 @@ fun PatientScreen( @Composable fun PatientDetailsTab( state: PatientDetailScreenState, - patientViewModel: PatientViewModel = hiltViewModel() + patientViewModel: PatientViewModel = hiltViewModel(), ) { val list by patientViewModel.resourceMapStatus val context = LocalContext.current @@ -114,7 +114,7 @@ fun PatientDetailsTab( LazyColumn( verticalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues(8.dp), - modifier = Modifier.fillMaxSize() + modifier = Modifier.fillMaxSize(), ) { items(state.detailsData) { data -> when (data) { @@ -139,13 +139,12 @@ fun PatientDetailsCardViewBinding(data: PatientDetailHeader) { @Composable fun PatientDetailsHeaderBinding(data: PatientDetailOverview, editPatient: () -> Unit = {}) { - Card(modifier = Modifier.fillMaxWidth()) { Column(Modifier.padding(Constants.defaultCardPadding)) { Text( text = data.patient.name, style = - MaterialTheme.typography.titleLarge.copy(fontSize = 24.sp, fontStyle = FontStyle.Normal) + MaterialTheme.typography.titleLarge.copy(fontSize = 24.sp, fontStyle = FontStyle.Normal), ) Row(Modifier.padding(8.dp)) { Text(text = "Type", style = MaterialTheme.typography.bodyMedium) @@ -166,13 +165,13 @@ fun PatientListItemViewBinding(data: PatientDetailProperty) { Column(Modifier.padding(Constants.defaultCardPadding)) { Text( text = data.patientProperty.header, - style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Bold) + style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Bold), ) Box(modifier = Modifier.height(8.dp)) Text( text = data.patientProperty.value, style = MaterialTheme.typography.bodyMedium, - maxLines = 1 + maxLines = 1, ) } } @@ -181,7 +180,7 @@ fun PatientListItemViewBinding(data: PatientDetailProperty) { @Composable fun PatientReferencePropertyBinding( data: PatientReferenceProperty, - value: MutableStateFlow + value: MutableStateFlow, ) { val state by value.collectAsState() @@ -189,14 +188,14 @@ fun PatientReferencePropertyBinding( Column(Modifier.padding(Constants.defaultCardPadding)) { Text( text = data.patientProperty.header, - style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Bold) + style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Bold), ) Box(modifier = Modifier.height(8.dp)) if (state is ResourcePropertyState.Error) { Text( text = (state as ResourcePropertyState.Error).message, style = MaterialTheme.typography.bodyMedium, - maxLines = 1 + maxLines = 1, ) } else if (state is ResourcePropertyState.Success) { val resource = (state as ResourcePropertyState.Success).resource @@ -204,7 +203,7 @@ fun PatientReferencePropertyBinding( Text( text = resource.extractName(), style = MaterialTheme.typography.bodyMedium, - maxLines = 1 + maxLines = 1, ) } } else { diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientViewModel.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientViewModel.kt index 9d628cce6f..ca6abed50d 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientViewModel.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/patient/PatientViewModel.kt @@ -46,12 +46,13 @@ class PatientViewModel constructor( savedStateHandle: SavedStateHandle, private val appDataStore: AppDataStore, - @ApplicationContext val context: Context + @ApplicationContext val context: Context, ) : ViewModel() { private val patientId = savedStateHandle.get("patientId") ?: "" val screenState = MutableStateFlow(PatientDetailScreenState.Loading) val resourceMapStatus: MutableState>> = mutableStateOf(mapOf()) + init { fetchPatient() } @@ -67,30 +68,30 @@ constructor( data.add(PatientDetailOverview(patientItem, firstInGroup = true)) data.add( PatientDetailProperty( - PatientProperty("Last Updated", patientItem.dateCreated?.toHumanDisplay() ?: "") - ) + PatientProperty("Last Updated", patientItem.dateCreated?.toHumanDisplay() ?: ""), + ), ) data.add(PatientDetailProperty(PatientProperty("HCC/ArtNumber", patientItem.id))) data.add( PatientDetailProperty( - PatientProperty(getString(R.string.patient_property_mobile), patientItem.phone) - ) + PatientProperty(getString(R.string.patient_property_mobile), patientItem.phone), + ), ) data.add( PatientDetailProperty( PatientProperty( getString(R.string.patient_property_dob), - patientItem.dob?.localizedString ?: "" - ) - ) + patientItem.dob?.localizedString ?: "", + ), + ), ) data.add( PatientDetailProperty( PatientProperty( getString(R.string.patient_property_age), - getFormattedAge(patient, context.resources) - ) - ) + getFormattedAge(patient, context.resources), + ), + ), ) data.add( PatientDetailProperty( @@ -98,22 +99,22 @@ constructor( getString(R.string.patient_property_gender), patientItem.gender.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() - } + }, ), - lastInGroup = true - ) + lastInGroup = true, + ), ) val address = patientItem.addressData.fullAddress data.add( PatientDetailProperty( PatientProperty( getString(R.string.patient_property_address), - address.ifBlank { "N/A" } - ) - ) + address.ifBlank { "N/A" }, + ), + ), ) data.add( - PatientReferenceProperty(PatientProperty("CHW Assigned", patientItem.chwAssigned)) + PatientReferenceProperty(PatientProperty("CHW Assigned", patientItem.chwAssigned)), ) if (patientItem.chwAssigned.isNotBlank()) { hashList.add(patientItem.chwAssigned) @@ -153,12 +154,13 @@ constructor( } private fun getString(resId: Int) = context.resources.getString(resId) + fun editPatient(context: Context) { QuestionnaireActivity.launchQuestionnaire( context = context, questionnaireId = EDIT_PROFILE_FORM, clientIdentifier = patientId, - questionnaireType = QuestionnaireType.EDIT + questionnaireType = QuestionnaireType.EDIT, ) } @@ -172,6 +174,7 @@ private fun isAndroidIcuSupported() = true val LocalDate.localizedString: String get() { val date = Date.from(atStartOfDay(ZoneId.systemDefault())?.toInstant()) - return if (isAndroidIcuSupported()) DateFormat.getDateInstance(DateFormat.DEFAULT).format(date) - else SimpleDateFormat.getDateInstance(DateFormat.DEFAULT, Locale.getDefault()).format(date) + return if (isAndroidIcuSupported()) { + DateFormat.getDateInstance(DateFormat.DEFAULT).format(date) + } else SimpleDateFormat.getDateInstance(DateFormat.DEFAULT, Locale.getDefault()).format(date) } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/Search.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/Search.kt index 345e0822a7..a215f517d5 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/Search.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/Search.kt @@ -68,18 +68,19 @@ import org.dtree.fhircore.dataclerk.ui.home.PatientItemCard @Composable fun SearchScreen( navHostController: NavHostController, - viewModel: SearchViewModel = hiltViewModel() + viewModel: SearchViewModel = hiltViewModel(), ) { - val userSearchModelState by viewModel.userSearchModelState.collectAsState( - initial = SearchModelState.Empty - ) + val userSearchModelState by + viewModel.userSearchModelState.collectAsState( + initial = SearchModelState.Empty, + ) SearchBarUI( searchText = userSearchModelState.searchText, placeholderText = "Search Patients", onSearchTextChanged = { viewModel.onSearchChanged(it) }, onClearClick = { viewModel.onClearClick() }, onNavigateBack = { navHostController.popBackStack() }, - matchesFound = userSearchModelState.patients.isNotEmpty() + matchesFound = userSearchModelState.patients.isNotEmpty(), ) { LazyColumn( verticalArrangement = Arrangement.spacedBy(8.dp), @@ -88,7 +89,7 @@ fun SearchScreen( items(items = userSearchModelState.patients) { patient -> PatientItemCard( patient, - onClick = { navHostController.navigate("patient/${patient.resourceId}") } + onClick = { navHostController.navigate("patient/${patient.resourceId}") }, ) } } @@ -104,9 +105,8 @@ fun SearchBarUI( onClearClick: () -> Unit = {}, onNavigateBack: () -> Unit = {}, matchesFound: Boolean, - results: (@Composable() () -> Unit) = {} + results: (@Composable() () -> Unit) = {}, ) { - Box { Column(modifier = Modifier.fillMaxSize()) { SearchBar(searchText, placeholderText, onSearchTextChanged, onClearClick, onNavigateBack) @@ -132,7 +132,7 @@ fun SearchBar( placeholderText: String = "", onSearchTextChanged: (String) -> Unit = {}, onClearClick: () -> Unit = {}, - onNavigateBack: () -> Unit = {} + onNavigateBack: () -> Unit = {}, ) { var showClearButton by remember { mutableStateOf(false) } val keyboardController = LocalSoftwareKeyboardController.current @@ -160,7 +160,7 @@ fun SearchBar( focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, containerColor = Color.Transparent, - cursorColor = LocalContentColor.current.copy(alpha = LocalContentAlpha.current) + cursorColor = LocalContentColor.current.copy(alpha = LocalContentAlpha.current), ), trailingIcon = { AnimatedVisibility(visible = showClearButton, enter = fadeIn(), exit = fadeOut()) { @@ -174,7 +174,7 @@ fun SearchBar( keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done), keyboardActions = KeyboardActions(onDone = { keyboardController?.hide() }), ) - } + }, ) LaunchedEffect(Unit) { focusRequester.requestFocus() } @@ -182,10 +182,11 @@ fun SearchBar( @Composable fun NoSearchResults() { - Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, - horizontalAlignment = CenterHorizontally - ) { Text("No matches found") } + horizontalAlignment = CenterHorizontally, + ) { + Text("No matches found") + } } diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/State.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/SearchModelState.kt similarity index 95% rename from android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/State.kt rename to android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/SearchModelState.kt index d1bc24e3bc..4a1afa0ce2 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/State.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/SearchModelState.kt @@ -21,7 +21,7 @@ import org.dtree.fhircore.dataclerk.ui.main.PatientItem data class SearchModelState( val searchText: String = "", val patients: List = arrayListOf(), - val showProgressBar: Boolean = false + val showProgressBar: Boolean = false, ) { companion object { diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/SearchViewModel.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/SearchViewModel.kt index b4eab27ac9..699754922b 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/SearchViewModel.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/search/SearchViewModel.kt @@ -36,6 +36,7 @@ class SearchViewModel @Inject constructor(private val dataStore: AppDataStore) : combine(searchText, showProgressBar, matchedPatients) { text, progress, patients -> SearchModelState(searchText = text, patients = patients, showProgressBar = progress) } + fun onSearchChanged(text: String) { Timber.e(text) searchText.value = text diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/theme/Theme.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/theme/Theme.kt index 7f475c6c2b..0777390346 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/theme/Theme.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/theme/Theme.kt @@ -38,7 +38,7 @@ private val LightColorScheme = lightColorScheme( primary = Purple40, secondary = PurpleGrey40, - tertiary = Pink40 + tertiary = Pink40, /* Other default colors to override background = Color(0xFFFFFBFE), @@ -48,15 +48,15 @@ private val LightColorScheme = onTertiary = Color.White, onBackground = Color(0xFF1C1B1F), onSurface = Color(0xFF1C1B1F), - */ - ) + */ + ) @Composable fun FhircoreandroidTheme( darkTheme: Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+ dynamicColor: Boolean = true, - content: (@Composable() () -> Unit) + content: (@Composable() () -> Unit), ) { val colorScheme = when { diff --git a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/theme/Type.kt b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/theme/Type.kt index d8fa29d06c..0dce6fee80 100644 --- a/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/theme/Type.kt +++ b/android/dataclerk/src/main/java/org/dtree/fhircore/dataclerk/ui/theme/Type.kt @@ -31,8 +31,8 @@ val Typography = fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) + letterSpacing = 0.5.sp, + ), /* Other default text styles to override titleLarge = TextStyle( fontFamily = FontFamily.Default, @@ -48,5 +48,5 @@ val Typography = lineHeight = 16.sp, letterSpacing = 0.5.sp ) - */ - ) + */ + ) diff --git a/android/engine/build.gradle.kts b/android/engine/build.gradle.kts index c7b71d45cf..b18836d4d8 100644 --- a/android/engine/build.gradle.kts +++ b/android/engine/build.gradle.kts @@ -1,257 +1,259 @@ -//import DependenciesKt +// import DependenciesKt plugins { - `fhir-jacoco-report` - id("com.android.library") - id("kotlin-android") - id("kotlin-kapt") - id("org.jetbrains.kotlin.plugin.serialization") - id("de.mannodermaus.android-junit5") version "1.9.3.0" - id("dagger.hilt.android.plugin") - id("org.jetbrains.kotlin.android") + `fhir-jacoco-report` + id("com.android.library") + id("kotlin-android") + id("kotlin-kapt") + id("org.jetbrains.kotlin.plugin.serialization") + id("de.mannodermaus.android-junit5") version "1.9.3.0" + id("dagger.hilt.android.plugin") + id("org.jetbrains.kotlin.android") } -kotlin { - jvmToolchain(17) -} +kotlin { jvmToolchain(17) } android { - namespace = "org.smartregister.fhircore.engine" - compileSdk = Deps.sdk_versions.compile_sdk - - defaultConfig { - minSdk = Deps.sdk_versions.min_sdk - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - debug { - enableUnitTestCoverage = true - } - release { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - } - kotlinOptions { - freeCompilerArgs = listOf("-Xjvm-default=all-compatibility", "-opt-in=kotlin.RequiresOptIn") + namespace = "org.smartregister.fhircore.engine" + compileSdk = Deps.sdk_versions.compile_sdk + + defaultConfig { + minSdk = Deps.sdk_versions.min_sdk + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + debug { enableUnitTestCoverage = true } + release { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } - buildFeatures { - compose = true - viewBinding = true - dataBinding = true - buildConfig = true + } + compileOptions { isCoreLibraryDesugaringEnabled = true } + kotlinOptions { + freeCompilerArgs = listOf("-Xjvm-default=all-compatibility", "-opt-in=kotlin.RequiresOptIn") + } + buildFeatures { + compose = true + viewBinding = true + dataBinding = true + buildConfig = true + } + composeOptions { kotlinCompilerExtensionVersion = "1.4.8" } + + // CQL + configurations { + all { + exclude(group = "org.eclipse.persistence") + exclude(group = "javax.activation", module = "activation") + exclude(group = "javax", module = "javaee-api") + exclude(group = "xml-apis") } - composeOptions { - kotlinCompilerExtensionVersion = "1.4.8" + } + packaging { + resources { + excludes += + listOf( + "license.html", + "readme.html", + "META-INF/DEPENDENCIES", + "META-INF/LICENSE", + "META-INF/LICENSE.txt", + "META-INF/license.txt", + "META-INF/license.html", + "META-INF/LICENSE.md", + "META-INF/NOTICE", + "META-INF/NOTICE.txt", + "META-INF/NOTICE.md", + "META-INF/notice.txt", + "META-INF/ASL2.0", + "META-INF/ASL-2.0.txt", + "META-INF/LGPL-3.0.txt", + "META-INF/sun-jaxb.episode", + "META-INF/*.kotlin_module", + ) } + } - //CQL - configurations { - all{ - exclude(group = "org.eclipse.persistence") - exclude(group = "javax.activation", module = "activation") - exclude(group = "javax", module = "javaee-api") - exclude(group = "xml-apis") - } - } - packaging { - resources { - excludes += listOf("license.html", "readme.html", "META-INF/DEPENDENCIES", "META-INF/LICENSE", "META-INF/LICENSE.txt", "META-INF/license.txt", "META-INF/license.html", "META-INF/LICENSE.md", "META-INF/NOTICE", "META-INF/NOTICE.txt", "META-INF/NOTICE.md", "META-INF/notice.txt", "META-INF/ASL2.0", "META-INF/ASL-2.0.txt", "META-INF/LGPL-3.0.txt", "META-INF/sun-jaxb.episode", "META-INF/*.kotlin_module") - } - } - - testOptions { - execution = "ANDROIDX_TEST_ORCHESTRATOR" - animationsDisabled = true + testOptions { + execution = "ANDROIDX_TEST_ORCHESTRATOR" + animationsDisabled = true - unitTests { - isIncludeAndroidResources = true - isReturnDefaultValues = true - } + unitTests { + isIncludeAndroidResources = true + isReturnDefaultValues = true } + } - configurations.configureEach { - resolutionStrategy { - force("ca.uhn.hapi.fhir:org.hl7.fhir.utilities:5.5.7") - } - } + configurations.configureEach { + resolutionStrategy { force("ca.uhn.hapi.fhir:org.hl7.fhir.utilities:5.5.7") } + } - testCoverage { jacocoVersion = Deps.versions.jacoco_tool } + testCoverage { jacocoVersion = Deps.versions.jacoco_tool } } dependencies { - - implementation("androidx.preference:preference-ktx:1.2.0") - coreLibraryDesugaring(Deps.desugar) - - api("androidx.core:core-ktx:1.9.0") - api("androidx.appcompat:appcompat:1.6.1") - api("com.google.android.material:material:1.8.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") - implementation("androidx.constraintlayout:constraintlayout-compose:1.0.1") - implementation("androidx.fragment:fragment-ktx:1.5.5") - implementation("io.jsonwebtoken:jjwt:0.9.1") - implementation("androidx.security:security-crypto:1.1.0-alpha03") - implementation("org.smartregister:fhir-common-utils:1.0.0-SNAPSHOT") - implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") - implementation("com.squareup.okhttp3:okhttp:4.9.1") - implementation("androidx.cardview:cardview:1.0.0") - implementation("joda-time:joda-time:2.10.14") - implementation("androidx.paging:paging-runtime-ktx:3.1.1") - implementation("com.github.bumptech.glide:glide:4.13.0") - implementation("id.zelory:compressor:3.0.1") - - //CQL - implementation(group = "xerces", name = "xercesImpl", version = "2.11.0") - implementation(group= "com.github.java-json-tools", name="msg-simple", version= "1.2"); - implementation("org.codehaus.woodstox:woodstox-core-asl:4.4.1") - implementation("ca.uhn.hapi.fhir:hapi-fhir-android:5.4.0") - implementation("org.opencds.cqf.cql:engine:1.5.4") - implementation("org.opencds.cqf.cql:engine.fhir:1.5.4") - implementation("org.opencds.cqf.cql:evaluator:1.4.2") - implementation("org.opencds.cqf.cql:evaluator.builder:1.4.2") - implementation("org.opencds.cqf.cql:evaluator.activitydefinition:1.4.2") - implementation("org.opencds.cqf.cql:evaluator.plandefinition:1.4.2") - implementation ("org.opencds.cqf.cql:evaluator.dagger:1.4.2") - api("org.smartregister:workflow:0.1.0-alpha01-preview6-SNAPSHOT") { - isTransitive = true - exclude(group = "xerces") - exclude(group = "com.github.java-json-tools") - exclude(group = "org.codehaus.woodstox") - exclude(group = "ca.uhn.hapi.fhir") - exclude(group = "org.opencds.cqf.cql") - exclude(group = "com.google.android.fhir", module = "common") -// exclude group: "com.google.android.fhir", module: "engine" - exclude(group = "org.smartregister", module = "engine") - } - - //Hilt - Dependency Injection - implementation("com.google.dagger:hilt-android:${Deps.versions.hiltVersion}") - api("androidx.hilt:hilt-work:${Deps.versions.hiltWorkerVersion}") - kapt("androidx.hilt:hilt-compiler:${Deps.versions.hiltWorkerVersion}") - kapt("com.google.dagger:hilt-compiler:${Deps.versions.hiltVersion}") - - api("androidx.lifecycle:lifecycle-livedata-ktx:2.6.0") - api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0") - - // Jetpack - DataStore - implementation("androidx.datastore:datastore-preferences:1.0.0") - - // P2P dependency - implementation("org.smartregister:p2p-lib:0.3.0-SNAPSHOT") - - //Configure Jetpack Compose - val composeVersion = Deps.versions.compose - api("androidx.compose.ui:ui:$composeVersion") - api("androidx.compose.ui:ui-tooling:$composeVersion") - api("androidx.compose.foundation:foundation:1.3.1") - api("androidx.compose.material:material:1.3.1") - api("androidx.compose.material:material-icons-core:1.3.1") - api("androidx.compose.material:material-icons-extended:1.3.1") - api("androidx.compose.runtime:runtime-livedata:$composeVersion") - api("androidx.lifecycle:lifecycle-runtime-compose:2.6.0") - api("androidx.navigation:navigation-compose:2.5.3") - api ("androidx.hilt:hilt-navigation-compose:1.0.0") - api("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.0") - api("androidx.paging:paging-compose:1.0.0-alpha18") - api("androidx.activity:activity-compose:1.6.1") - api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2") - api("androidx.work:work-runtime-ktx:2.8.0") - testApi("androidx.work:work-testing:2.8.0") - - val coroutineVersion = "1.7.3" - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutineVersion") - api("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion") - api("org.smartregister:contrib-barcode:0.1.0-beta3-preview5-SNAPSHOT"){ - isTransitive = true - exclude(group = "com.google.android.fhir", module = "common") - exclude(group = "com.google.android.fhir", module = "engine") - } - api("org.smartregister:data-capture:1.0.0-preview15-SNAPSHOT") { - isTransitive = true - exclude(group = "org.hamcrest", module = "hamcrest-core") - exclude(group = "javax.xml.bind", module = "jaxb-api") - exclude(group = "com.sun.xml.bind", module = "jaxb-core") - exclude(group = "com.sun.activation", module = "javax.activation") - exclude(group = "com.google.android.fhir", module = "common") - exclude(group = "com.google.android.fhir", module = "engine") - } - - api("org.smartregister:common:0.1.0-alpha03-preview4-SNAPSHOT") { - isTransitive = true - } - - api("org.smartregister:engine:0.1.0-beta04-preview4.2-SNAPSHOT") { - isTransitive = true - exclude(group ="org.hamcrest", module = "hamcrest-core") - exclude(group ="javax.xml.bind", module = "jaxb-api") - exclude(group ="com.sun.xml.bind", module = "jaxb-core") - exclude(group ="com.sun.activation", module = "javax.activation") - exclude(group ="org.opencds.cqf.cql", module = "engine") - exclude(group ="org.opencds.cqf.cql", module = "evaluator") - exclude(group ="org.opencds.cqf.cql", module = "evaluator.builder") - exclude(group ="org.opencds.cqf.cql", module = "evaluator.dagger") - exclude(group ="com.google.android.fhir", module = "common") - } - - api("com.google.code.gson:gson:2.9.1") - api("com.jakewharton.timber:timber:5.0.1") - - val retrofitVersion = "2.9.0" - - api("com.squareup.retrofit2:retrofit:$retrofitVersion") - api("com.squareup.retrofit2:converter-gson:$retrofitVersion") - api("com.squareup.retrofit2:retrofit-mock:$retrofitVersion") - api("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0") - - val okhttpVersion = "4.9.1" - api("com.squareup.okhttp3:okhttp:$okhttpVersion") - api("com.squareup.okhttp3:logging-interceptor:$okhttpVersion") - - implementation(platform("com.google.firebase:firebase-bom:31.2.0")) - implementation("com.google.firebase:firebase-perf-ktx") - - // Hilt test dependencies - testImplementation("com.google.dagger:hilt-android-testing:${Deps.versions.hiltVersion}") - kaptTest("com.google.dagger:hilt-android-compiler:$${Deps.versions.hiltVersion}") - - testImplementation(Deps.junit5_api) - testRuntimeOnly(Deps.junit5_engine) - testRuntimeOnly(Deps.junit5_engine_vintage) - testImplementation(Deps.robolectric) - testImplementation(Deps.atsl.core) - testImplementation(Deps.atsl.ext_junit) - testImplementation(Deps.atsl.ext_junit_ktx) - testImplementation(Deps.coroutines.test) - testImplementation(Deps.androidx.core_test) - debugImplementation(Deps.fragment_testing) - releaseImplementation(Deps.fragment_testing) - testImplementation(Deps.kotlin.test) - testImplementation(Deps.mockk) - androidTestImplementation(Deps.atsl.ext_junit) - androidTestImplementation(Deps.atsl.espresso) - testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutineVersion") - androidTestImplementation(Deps.atsl.ext_junit) - androidTestImplementation("androidx.test.espresso:espresso-core:${Deps.versions.atsl_expresso}") - implementation(Deps.work.runtime) - testImplementation(group ="org.json", name = "json", version = "20210307") - - debugImplementation("androidx.compose.ui:ui-test-manifest:${composeVersion})") - testImplementation("androidx.compose.ui:ui-test-junit4:$composeVersion") - - debugImplementation("androidx.compose.ui:ui-test-manifest:$composeVersion") - testImplementation("androidx.compose.ui:ui-test-junit4:$composeVersion") + implementation("androidx.preference:preference-ktx:1.2.0") + coreLibraryDesugaring(Deps.desugar) + + api("androidx.core:core-ktx:1.9.0") + api("androidx.appcompat:appcompat:1.6.1") + api("com.google.android.material:material:1.8.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.constraintlayout:constraintlayout-compose:1.0.1") + implementation("androidx.fragment:fragment-ktx:1.5.5") + implementation("io.jsonwebtoken:jjwt:0.9.1") + implementation("androidx.security:security-crypto:1.1.0-alpha03") + implementation("org.smartregister:fhir-common-utils:1.0.0-SNAPSHOT") + implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") + implementation("com.squareup.okhttp3:okhttp:4.9.1") + implementation("androidx.cardview:cardview:1.0.0") + implementation("joda-time:joda-time:2.10.14") + implementation("androidx.paging:paging-runtime-ktx:3.1.1") + implementation("com.github.bumptech.glide:glide:4.13.0") + implementation("id.zelory:compressor:3.0.1") + + // CQL + implementation(group = "xerces", name = "xercesImpl", version = "2.11.0") + implementation(group = "com.github.java-json-tools", name = "msg-simple", version = "1.2") + implementation("org.codehaus.woodstox:woodstox-core-asl:4.4.1") + implementation("ca.uhn.hapi.fhir:hapi-fhir-android:5.4.0") + implementation("org.opencds.cqf.cql:engine:1.5.4") + implementation("org.opencds.cqf.cql:engine.fhir:1.5.4") + implementation("org.opencds.cqf.cql:evaluator:1.4.2") + implementation("org.opencds.cqf.cql:evaluator.builder:1.4.2") + implementation("org.opencds.cqf.cql:evaluator.activitydefinition:1.4.2") + implementation("org.opencds.cqf.cql:evaluator.plandefinition:1.4.2") + implementation("org.opencds.cqf.cql:evaluator.dagger:1.4.2") + api("org.smartregister:workflow:0.1.0-alpha01-preview6-SNAPSHOT") { + isTransitive = true + exclude(group = "xerces") + exclude(group = "com.github.java-json-tools") + exclude(group = "org.codehaus.woodstox") + exclude(group = "ca.uhn.hapi.fhir") + exclude(group = "org.opencds.cqf.cql") + exclude(group = "com.google.android.fhir", module = "common") + // exclude group: "com.google.android.fhir", module: "engine" + exclude(group = "org.smartregister", module = "engine") + } + + // Hilt - Dependency Injection + implementation("com.google.dagger:hilt-android:${Deps.versions.hiltVersion}") + api("androidx.hilt:hilt-work:${Deps.versions.hiltWorkerVersion}") + kapt("androidx.hilt:hilt-compiler:${Deps.versions.hiltWorkerVersion}") + kapt("com.google.dagger:hilt-compiler:${Deps.versions.hiltVersion}") + + api("androidx.lifecycle:lifecycle-livedata-ktx:2.6.0") + api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0") + + // Jetpack - DataStore + implementation("androidx.datastore:datastore-preferences:1.0.0") + + // P2P dependency + implementation("org.smartregister:p2p-lib:0.3.0-SNAPSHOT") + + // Configure Jetpack Compose + val composeVersion = Deps.versions.compose + api("androidx.compose.ui:ui:$composeVersion") + api("androidx.compose.ui:ui-tooling:$composeVersion") + api("androidx.compose.foundation:foundation:1.3.1") + api("androidx.compose.material:material:1.3.1") + api("androidx.compose.material:material-icons-core:1.3.1") + api("androidx.compose.material:material-icons-extended:1.3.1") + api("androidx.compose.runtime:runtime-livedata:$composeVersion") + api("androidx.lifecycle:lifecycle-runtime-compose:2.6.0") + api("androidx.navigation:navigation-compose:2.5.3") + api("androidx.hilt:hilt-navigation-compose:1.0.0") + api("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.0") + api("androidx.paging:paging-compose:1.0.0-alpha18") + api("androidx.activity:activity-compose:1.6.1") + api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2") + api("androidx.work:work-runtime-ktx:2.8.0") + testApi("androidx.work:work-testing:2.8.0") + + val coroutineVersion = "1.7.3" + api("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutineVersion") + api("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion") + api("org.smartregister:contrib-barcode:0.1.0-beta3-preview5-SNAPSHOT") { + isTransitive = true + exclude(group = "com.google.android.fhir", module = "common") + exclude(group = "com.google.android.fhir", module = "engine") + } + api("org.smartregister:data-capture:1.0.0-preview15-SNAPSHOT") { + isTransitive = true + exclude(group = "org.hamcrest", module = "hamcrest-core") + exclude(group = "javax.xml.bind", module = "jaxb-api") + exclude(group = "com.sun.xml.bind", module = "jaxb-core") + exclude(group = "com.sun.activation", module = "javax.activation") + exclude(group = "com.google.android.fhir", module = "common") + exclude(group = "com.google.android.fhir", module = "engine") + } + + api("org.smartregister:common:0.1.0-alpha03-preview4-SNAPSHOT") { isTransitive = true } + + api("org.smartregister:engine:0.1.0-beta04-preview4.2-SNAPSHOT") { + isTransitive = true + exclude(group = "org.hamcrest", module = "hamcrest-core") + exclude(group = "javax.xml.bind", module = "jaxb-api") + exclude(group = "com.sun.xml.bind", module = "jaxb-core") + exclude(group = "com.sun.activation", module = "javax.activation") + exclude(group = "org.opencds.cqf.cql", module = "engine") + exclude(group = "org.opencds.cqf.cql", module = "evaluator") + exclude(group = "org.opencds.cqf.cql", module = "evaluator.builder") + exclude(group = "org.opencds.cqf.cql", module = "evaluator.dagger") + exclude(group = "com.google.android.fhir", module = "common") + } + + api("com.google.code.gson:gson:2.9.1") + api("com.jakewharton.timber:timber:5.0.1") + + val retrofitVersion = "2.9.0" + + api("com.squareup.retrofit2:retrofit:$retrofitVersion") + api("com.squareup.retrofit2:converter-gson:$retrofitVersion") + api("com.squareup.retrofit2:retrofit-mock:$retrofitVersion") + api("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0") + + val okhttpVersion = "4.9.1" + api("com.squareup.okhttp3:okhttp:$okhttpVersion") + api("com.squareup.okhttp3:logging-interceptor:$okhttpVersion") + + implementation(platform("com.google.firebase:firebase-bom:31.2.0")) + implementation("com.google.firebase:firebase-perf-ktx") + + // Hilt test dependencies + testImplementation("com.google.dagger:hilt-android-testing:${Deps.versions.hiltVersion}") + kaptTest("com.google.dagger:hilt-android-compiler:$${Deps.versions.hiltVersion}") + + testImplementation(Deps.junit5_api) + testRuntimeOnly(Deps.junit5_engine) + testRuntimeOnly(Deps.junit5_engine_vintage) + testImplementation(Deps.robolectric) + testImplementation(Deps.atsl.core) + testImplementation(Deps.atsl.ext_junit) + testImplementation(Deps.atsl.ext_junit_ktx) + testImplementation(Deps.coroutines.test) + testImplementation(Deps.androidx.core_test) + debugImplementation(Deps.fragment_testing) + releaseImplementation(Deps.fragment_testing) + testImplementation(Deps.kotlin.test) + testImplementation(Deps.mockk) + androidTestImplementation(Deps.atsl.ext_junit) + androidTestImplementation(Deps.atsl.espresso) + testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutineVersion") + androidTestImplementation(Deps.atsl.ext_junit) + androidTestImplementation("androidx.test.espresso:espresso-core:${Deps.versions.atsl_expresso}") + implementation(Deps.work.runtime) + testImplementation(group = "org.json", name = "json", version = "20210307") + + debugImplementation("androidx.compose.ui:ui-test-manifest:$composeVersion)") + testImplementation("androidx.compose.ui:ui-test-junit4:$composeVersion") + + debugImplementation("androidx.compose.ui:ui-test-manifest:$composeVersion") + testImplementation("androidx.compose.ui:ui-test-junit4:$composeVersion") } -kapt { - correctErrorTypes = true -} +kapt { correctErrorTypes = true } -hilt { - enableAggregatingTask = true -} +hilt { enableAggregatingTask = true } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/AppFeature.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/AppFeature.kt index abb09ac5ab..221936cc5d 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/AppFeature.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/AppFeature.kt @@ -23,7 +23,10 @@ package org.smartregister.fhircore.engine.appfeature */ sealed class AppFeature(val name: String) { object InAppReporting : AppFeature(name = "InAppReporting") + object PatientManagement : AppFeature(name = "PatientManagement") + object HouseholdManagement : AppFeature(name = "HouseholdManagement") + object DeviceToDeviceSync : AppFeature(name = "DeviceToDeviceSync") } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/AppFeatureConfig.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/AppFeatureConfig.kt index 768cc218b3..a33a6eb11b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/AppFeatureConfig.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/AppFeatureConfig.kt @@ -23,5 +23,5 @@ import org.smartregister.fhircore.engine.configuration.Configuration data class AppFeatureConfig( override val appId: String = "", override val classification: String = "", - val appFeatures: List = listOf() + val appFeatures: List = listOf(), ) : Configuration diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/AppTarget.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/AppTarget.kt index e12f2c9cad..4b0e9b2a86 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/AppTarget.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/AppTarget.kt @@ -18,5 +18,5 @@ package org.smartregister.fhircore.engine.appfeature.model enum class AppTarget { CHW, - HF + HF, } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/FeatureConfig.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/FeatureConfig.kt index 5fd39f6058..c25d6a1bda 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/FeatureConfig.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/FeatureConfig.kt @@ -25,5 +25,5 @@ data class FeatureConfig( val settings: Map = emptyMap(), val target: AppTarget? = null, val healthModule: HealthModule? = null, - val useCases: List? = null + val useCases: List? = null, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/HealthModule.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/HealthModule.kt index 31bf54bfd1..181dc86332 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/HealthModule.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/appfeature/model/HealthModule.kt @@ -27,5 +27,5 @@ enum class HealthModule { HOME_TRACING, PHONE_TRACING, APPOINTMENT, - DEFAULT + DEFAULT, } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/appointment/MissedFHIRAppointmentsWorker.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/appointment/MissedFHIRAppointmentsWorker.kt index f8a35a3917..62eea4b8d5 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/appointment/MissedFHIRAppointmentsWorker.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/appointment/MissedFHIRAppointmentsWorker.kt @@ -36,7 +36,7 @@ class MissedFHIRAppointmentsWorker constructor( @Assisted val appContext: Context, @Assisted workerParameters: WorkerParameters, - val fhirEngine: FhirEngine + val fhirEngine: FhirEngine, ) : CoroutineWorker(appContext, workerParameters) { override suspend fun doWork(): Result { Timber.i("Checking missed Appointments") @@ -49,7 +49,7 @@ constructor( { value = of(DateTimeType.today()) prefix = ParamPrefixEnum.LESSTHAN - } + }, ) } .map { it.resource } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/appointment/ProposedWelcomeServiceAppointmentsWorker.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/appointment/ProposedWelcomeServiceAppointmentsWorker.kt index f268d8b2da..ee64128ae2 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/appointment/ProposedWelcomeServiceAppointmentsWorker.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/appointment/ProposedWelcomeServiceAppointmentsWorker.kt @@ -40,7 +40,7 @@ class ProposedWelcomeServiceAppointmentsWorker constructor( @Assisted val appContext: Context, @Assisted workerParameters: WorkerParameters, - val fhirEngine: FhirEngine + val fhirEngine: FhirEngine, ) : CoroutineWorker(appContext, workerParameters) { val welcomeServiceCodeableConcept = CodeableConcept(Coding("https://d-tree.org", "Welcome", "Welcome Service")).apply { @@ -55,7 +55,7 @@ constructor( .search { filter( Appointment.STATUS, - { value = of(Appointment.AppointmentStatus.PROPOSED.toCode()) } + { value = of(Appointment.AppointmentStatus.PROPOSED.toCode()) }, ) filter(Appointment.REASON_CODE, { value = of(welcomeServiceCodeableConcept) }) filter( @@ -63,7 +63,7 @@ constructor( { value = of(DateTimeType.today()) prefix = ParamPrefixEnum.LESSTHAN_OR_EQUALS - } + }, ) } .map { it.resource } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/auth/AccountAuthenticator.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/auth/AccountAuthenticator.kt index 4df7d6f2a0..2172c3281b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/auth/AccountAuthenticator.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/auth/AccountAuthenticator.kt @@ -42,12 +42,12 @@ constructor( @ApplicationContext val context: Context, val accountManager: AccountManager, val tokenAuthenticator: TokenAuthenticator, - val secureSharedPreference: SecureSharedPreference + val secureSharedPreference: SecureSharedPreference, ) : AbstractAccountAuthenticator(context) { override fun editProperties( response: AccountAuthenticatorResponse?, - accountType: String? + accountType: String?, ): Bundle = bundleOf() override fun addAccount( @@ -55,7 +55,7 @@ constructor( accountType: String?, authTokenType: String?, requiredFeatures: Array?, - options: Bundle? + options: Bundle?, ): Bundle { val intent = loginIntent(accountType, authTokenType, response) return bundleOf(AccountManager.KEY_INTENT to intent) @@ -64,7 +64,7 @@ constructor( override fun confirmCredentials( response: AccountAuthenticatorResponse?, account: Account?, - options: Bundle? + options: Bundle?, ): Bundle { return bundleOf() } @@ -73,7 +73,7 @@ constructor( response: AccountAuthenticatorResponse?, account: Account, authTokenType: String?, - options: Bundle? + options: Bundle?, ): Bundle { var authToken = accountManager.peekAuthToken(account, authTokenType) @@ -96,7 +96,7 @@ constructor( return bundleOf( AccountManager.KEY_ACCOUNT_NAME to account.name, AccountManager.KEY_ACCOUNT_TYPE to account.type, - AccountManager.KEY_AUTHTOKEN to authToken + AccountManager.KEY_AUTHTOKEN to authToken, ) } @@ -108,7 +108,7 @@ constructor( private fun loginIntent( accountType: String?, authTokenType: String?, - response: AccountAuthenticatorResponse? + response: AccountAuthenticatorResponse?, ): Intent { return Intent(context, LoginActivity::class.java).apply { putExtra(ACCOUNT_TYPE, accountType) @@ -128,19 +128,20 @@ constructor( response: AccountAuthenticatorResponse?, account: Account?, authTokenType: String?, - options: Bundle? + options: Bundle?, ): Bundle = bundleOf() override fun hasFeatures( response: AccountAuthenticatorResponse?, account: Account?, - features: Array? + features: Array?, ): Bundle = bundleOf() fun logout(onLogout: () -> Unit) { - tokenAuthenticator.logout().onSuccess { loggedOut -> if (loggedOut) onLogout() }.onFailure { - onLogout() - } + tokenAuthenticator + .logout() + .onSuccess { loggedOut -> if (loggedOut) onLogout() } + .onFailure { onLogout() } } fun logoutLocal(): Boolean { @@ -148,7 +149,7 @@ constructor( if (account != null) { accountManager.invalidateAuthToken( account.type, - accountManager.peekAuthToken(account, AUTH_TOKEN_TYPE) + accountManager.peekAuthToken(account, AUTH_TOKEN_TYPE), ) return true } @@ -174,7 +175,7 @@ constructor( private fun confirmAccount( account: Account, callback: AccountManagerCallback, - errorHandler: Handler = Handler(Looper.getMainLooper(), DefaultErrorHandler) + errorHandler: Handler = Handler(Looper.getMainLooper(), DefaultErrorHandler), ) { accountManager.confirmCredentials(account, Bundle(), null, callback, errorHandler) } @@ -189,7 +190,7 @@ constructor( loginIntent.flags += Intent.FLAG_ACTIVITY_SINGLE_TOP onResult(loginIntent) } - } + }, ) } } @@ -220,7 +221,7 @@ constructor( onValidTokenMissing(logInIntent) } }, - Handler(Looper.getMainLooper(), DefaultErrorHandler) + Handler(Looper.getMainLooper(), DefaultErrorHandler), ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/auth/AuthCredentials.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/auth/AuthCredentials.kt index c9ff44849a..4fa281e721 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/auth/AuthCredentials.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/auth/AuthCredentials.kt @@ -24,5 +24,5 @@ data class AuthCredentials( val salt: String, val passwordHash: String, var sessionToken: String? = null, - var refreshToken: String? = null + var refreshToken: String? = null, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/Configuration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/Configuration.kt index 7ab87ae67a..49e45cd0e0 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/Configuration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/Configuration.kt @@ -24,7 +24,7 @@ package org.smartregister.fhircore.engine.configuration * * @property appId Unique identifier for the application to which this configurations is applied * @property classification Used to categorize multiple configurations of the same type. E.g. two - * RegisterViewConfigurations used in an application with two registers. + * RegisterViewConfigurations used in an application with two registers. */ interface Configuration { val appId: String diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistry.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistry.kt index 744354907d..2b6acb3800 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistry.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistry.kt @@ -63,7 +63,7 @@ constructor( val fhirEngine: FhirEngine, val fhirResourceDataSource: FhirResourceDataSource, val sharedPreferencesHelper: SharedPreferencesHelper, - val dispatcherProvider: DispatcherProvider + val dispatcherProvider: DispatcherProvider, ) { val configurationsMap = mutableMapOf() @@ -82,7 +82,7 @@ constructor( */ inline fun retrieveConfiguration( configClassification: ConfigClassification, - jsonSerializer: Json? = null + jsonSerializer: Json? = null, ): T = workflowPointName(configClassification.classification).let { workflowName -> val workflowPoint = workflowPointsMap[workflowName] @@ -93,12 +93,11 @@ constructor( configurationsMap.getOrPut(workflowName) { // Binary content could be either a Configuration or a FHIR Resource (workflowPoint.resource as Binary).content.decodeToString().let { - if (T::class.java.isAssignableFrom(FhirConfiguration::class.java)) + if (T::class.java.isAssignableFrom(FhirConfiguration::class.java)) { FhirConfiguration(appId, workflowPoint.classification, it.decodeResourceFromString()) - else it.decodeJson(jsonSerializer) + } else it.decodeJson(jsonSerializer) } - } as - T + } as T } fun retrieveDataFilterConfiguration(id: String) = @@ -121,6 +120,7 @@ constructor( * } * } * ``` + * * } * * A workflow point would be mapped like "workflowPoint": "registration", "resource": @@ -129,7 +129,7 @@ constructor( * * @param appId application's unique identifier * @param configsLoadedCallback function for use as trailing lambda that provides Boolean - * indicating whether configurations were loaded successfully or not + * indicating whether configurations were loaded successfully or not */ suspend fun loadConfigurations(appId: String, configsLoadedCallback: (Boolean) -> Unit) { this.appId = appId @@ -145,7 +145,7 @@ constructor( classification = it.focus.identifier.value, description = it.title, resource = getBinary(it.focus.extractId()), - workflowPoint = it.focus.identifier.value + workflowPoint = it.focus.identifier.value, ) workflowPointsMap[workflowPointName] = workflowPoint } @@ -159,42 +159,41 @@ constructor( val baseConfigPath = BASE_CONFIG_PATH.run { replace(DEFAULT_APP_ID, parsedAppId) } runCatching { - context - .assets - .open(baseConfigPath.plus(COMPOSITION_CONFIG_PATH)) - .bufferedReader() - .use { it.readText() } - .decodeResourceFromString() - .section - .filter { isWorkflowPoint(it) } - .forEach { sectionComponent -> - val binaryConfigPath = - BINARY_CONFIG_PATH.run { - replace(DEFAULT_CLASSIFICATION, sectionComponent.focus.identifier.value) - } + context.assets + .open(baseConfigPath.plus(COMPOSITION_CONFIG_PATH)) + .bufferedReader() + .use { it.readText() } + .decodeResourceFromString() + .section + .filter { isWorkflowPoint(it) } + .forEach { sectionComponent -> + val binaryConfigPath = + BINARY_CONFIG_PATH.run { + replace(DEFAULT_CLASSIFICATION, sectionComponent.focus.identifier.value) + } - val localBinaryJsonConfig = - context.assets.open(baseConfigPath.plus(binaryConfigPath)).bufferedReader().use { - it.readText() - } + val localBinaryJsonConfig = + context.assets.open(baseConfigPath.plus(binaryConfigPath)).bufferedReader().use { + it.readText() + } - val binaryConfig = - Binary().apply { - contentType = CONFIG_CONTENT_TYPE - content = localBinaryJsonConfig.encodeToByteArray() - } + val binaryConfig = + Binary().apply { + contentType = CONFIG_CONTENT_TYPE + content = localBinaryJsonConfig.encodeToByteArray() + } - val workflowPointName = workflowPointName(sectionComponent.focus.identifier.value) - val workflowPoint = - WorkflowPoint( - classification = sectionComponent.focus.identifier.value, - description = sectionComponent.title, - resource = binaryConfig, - workflowPoint = sectionComponent.focus.identifier.value - ) - workflowPointsMap[workflowPointName] = workflowPoint - } - } + val workflowPointName = workflowPointName(sectionComponent.focus.identifier.value) + val workflowPoint = + WorkflowPoint( + classification = sectionComponent.focus.identifier.value, + description = sectionComponent.title, + resource = binaryConfig, + workflowPoint = sectionComponent.focus.identifier.value, + ) + workflowPointsMap[workflowPointName] = workflowPoint + } + } .getOrNull() .also { if (it == null) configsLoadedCallback(false) } ?.also { configsLoadedCallback(true) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/FhirConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/FhirConfiguration.kt index 1477da4bc7..062041392a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/FhirConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/FhirConfiguration.kt @@ -21,5 +21,5 @@ import org.hl7.fhir.r4.model.Resource data class FhirConfiguration( override val appId: String, override val classification: String, - val resource: T + val resource: T, ) : Configuration diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/WorkflowConfigurations.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/WorkflowConfigurations.kt index 0ff666abe1..e04c031397 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/WorkflowConfigurations.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/WorkflowConfigurations.kt @@ -24,7 +24,7 @@ import org.hl7.fhir.r4.model.Resource data class ApplicationWorkflow( val appId: String, val title: String, - val mapping: List + val mapping: List, ) @Serializable @@ -32,5 +32,5 @@ data class WorkflowPoint( val workflowPoint: String, @Contextual val resource: Resource, val classification: String, - val description: String + val description: String, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/AppConfigClassification.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/AppConfigClassification.kt index 29456f7c16..8e2d53102b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/AppConfigClassification.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/AppConfigClassification.kt @@ -26,7 +26,8 @@ enum class AppConfigClassification : ConfigClassification { LOGIN, PIN, SYNC, - PATIENT_REGISTER; + PATIENT_REGISTER, + ; override val classification: String = name.lowercase() } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/ApplicationConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/ApplicationConfiguration.kt index 000ed69e9e..c80ba2d55d 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/ApplicationConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/ApplicationConfiguration.kt @@ -36,7 +36,7 @@ data class ApplicationConfiguration( var patientTypeFilterTagViaMetaCodingSystem: String = "", var taskOrderFilterTagViaMetaCodingSystem: String = DEFAULT_TASK_ORDER_FILTER_TAG_META_CODING_SYSTEM, - var taskFilterTagViaMetaCodingSystem: String = DEFAULT_TASK_FILTER_TAG_META_CODING_SYSTEM + var taskFilterTagViaMetaCodingSystem: String = DEFAULT_TASK_FILTER_TAG_META_CODING_SYSTEM, ) : Configuration /** @@ -49,7 +49,7 @@ data class ApplicationConfiguration( * @param applicationName Sets the application display name * @param appLogoIconResourceFile Sets the application logo thumb icon, this must be png file inside * @param patientTypeFilterTagViaMetaCodingSystem sets code in Patient meta, and will use for - * filtering patient + * filtering patient * @param count Sets the application maximum records when downloading resource drawable folder */ fun applicationConfigurationOf( @@ -63,7 +63,7 @@ fun applicationConfigurationOf( appLogoIconResourceFile: String = "", patientTypeFilterTagViaMetaCodingSystem: String = "", count: String = ConfigurationRegistry.DEFAULT_COUNT, - taskFilterTagViaMetaCodingSystem: String = "" + taskFilterTagViaMetaCodingSystem: String = "", ): ApplicationConfiguration = ApplicationConfiguration( appId = appId, @@ -76,5 +76,5 @@ fun applicationConfigurationOf( appLogoIconResourceFile = appLogoIconResourceFile, patientTypeFilterTagViaMetaCodingSystem = patientTypeFilterTagViaMetaCodingSystem, count = count, - taskFilterTagViaMetaCodingSystem = taskFilterTagViaMetaCodingSystem + taskFilterTagViaMetaCodingSystem = taskFilterTagViaMetaCodingSystem, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/AuthConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/AuthConfiguration.kt index 1fa816268f..975b2b5636 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/AuthConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/AuthConfiguration.kt @@ -23,5 +23,5 @@ data class AuthConfiguration( var clientId: String, var clientSecret: String, var accountType: String, - var scope: String = "openid" + var scope: String = "openid", ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/ConfigService.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/ConfigService.kt index 62d48d4e1e..10bace2ec2 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/ConfigService.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/ConfigService.kt @@ -41,7 +41,7 @@ interface ConfigService { .enqueueUniquePeriodicWork( FhirTaskPlanWorker.WORK_ID, ExistingPeriodicWorkPolicy.UPDATE, - PeriodicWorkRequestBuilder(12, TimeUnit.HOURS).build() + PeriodicWorkRequestBuilder(12, TimeUnit.HOURS).build(), ) } @@ -92,7 +92,7 @@ interface ConfigService { .enqueueUniquePeriodicWork( MissedFHIRAppointmentsWorker.NAME, ExistingPeriodicWorkPolicy.UPDATE, - workRequest + workRequest, ) } @@ -104,7 +104,7 @@ interface ConfigService { .enqueueUniquePeriodicWork( ProposedWelcomeServiceAppointmentsWorker.NAME, ExistingPeriodicWorkPolicy.UPDATE, - workRequest + workRequest, ) } @@ -116,7 +116,7 @@ interface ConfigService { .enqueueUniquePeriodicWork( WelcomeServiceBackToCarePlanWorker.NAME, ExistingPeriodicWorkPolicy.UPDATE, - workRequest + workRequest, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/RegistrySyncParamConfigService.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/RegistrySyncParamConfigService.kt index f3b3a357ae..fe6643de62 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/RegistrySyncParamConfigService.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/app/RegistrySyncParamConfigService.kt @@ -20,8 +20,9 @@ import com.google.android.fhir.FhirEngine /** * An interface that provides the application configurations. + * * @property resourceSyncParams Set [FhirEngine] resource sync params needed for syncing data from - * the server + * the server */ interface RegistrySyncParamConfigService { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/BottomNavigationConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/BottomNavigationConfiguration.kt index 9aced1ea50..6118d9d433 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/BottomNavigationConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/BottomNavigationConfiguration.kt @@ -25,7 +25,7 @@ interface NavigationAction class NavigationConfiguration( override val appId: String = "", override val classification: String = "", - val navigationOptions: List = listOf() + val navigationOptions: List = listOf(), ) : Configuration @Serializable @@ -33,5 +33,5 @@ data class NavigationOption( val id: String, val title: String, val icon: String, - val action: NavigationAction + val action: NavigationAction, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/DataFiltersConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/DataFiltersConfiguration.kt index f01bc2c6f8..9fc53772d5 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/DataFiltersConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/DataFiltersConfiguration.kt @@ -28,7 +28,7 @@ import org.smartregister.fhircore.engine.configuration.Configuration class DataFiltersConfiguration( override val appId: String = "", override val classification: String = "", - val filters: List = listOf() + val filters: List = listOf(), ) : Configuration @Stable @@ -41,7 +41,7 @@ data class SearchFilter( val valueType: Enumerations.DataType, val valueBoolean: Boolean? = null, val valueCoding: Code? = null, - val valueString: String? = null + val valueString: String? = null, ) @Stable @@ -62,5 +62,5 @@ fun Code.asCodeableConcept() = fun dataFilterConfigurationOf( appId: String = "", classification: String = "form", - filters: List = listOf() + filters: List = listOf(), ) = DataFiltersConfiguration(appId = appId, classification = classification, filters = filters) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/FormConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/FormConfiguration.kt index 7384432b3e..1c8c208199 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/FormConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/FormConfiguration.kt @@ -26,12 +26,12 @@ import org.smartregister.fhircore.engine.ui.questionnaire.QuestionnaireConfig class FormConfiguration( override val appId: String = "", override val classification: String = "", - val forms: List = listOf() + val forms: List = listOf(), ) : Configuration @Stable fun formConfigurationOf( appId: String = "", classification: String = "form", - forms: List = listOf() + forms: List = listOf(), ) = FormConfiguration(appId = appId, classification = classification, forms = forms) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/ImmunizationProfileViewConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/ImmunizationProfileViewConfiguration.kt index 04dc2bcc99..7f0a131e7a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/ImmunizationProfileViewConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/ImmunizationProfileViewConfiguration.kt @@ -26,7 +26,7 @@ data class ImmunizationProfileViewConfiguration( override val appId: String = "", override val classification: String = "", val showScanBarcode: Boolean = false, - val showReportAdverseEvent: Boolean = true + val showReportAdverseEvent: Boolean = true, ) : Configuration /** @@ -38,11 +38,11 @@ fun immunizationProfileViewConfigurationsOf( appId: String = "", classification: String = "immunization-profile", showScanBarcode: Boolean = false, - showReportAdverseEvent: Boolean = false + showReportAdverseEvent: Boolean = false, ) = ImmunizationProfileViewConfiguration( appId = appId, classification = classification, showScanBarcode = showScanBarcode, - showReportAdverseEvent = showReportAdverseEvent + showReportAdverseEvent = showReportAdverseEvent, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/LoginViewConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/LoginViewConfiguration.kt index 57facbee74..0ebcf67a02 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/LoginViewConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/LoginViewConfiguration.kt @@ -30,17 +30,19 @@ class LoginViewConfiguration( val applicationVersionCode: Int = 1, val darkMode: Boolean = true, val showLogo: Boolean = false, - val enablePin: Boolean = false + val enablePin: Boolean = false, ) : Configuration + /** * A function providing a DSL for configuring [LoginViewConfiguration]. The configurations provided * by this method are used on the register calling this method + * * @param appId Set unique identifier for this configuration * @param applicationName Set the application name * @param applicationVersion Set the application version * @param applicationVersionCode Set the application version code * @param darkMode Change login theme; alter the background color to white when false dark blue - * otherwise + * otherwise * @param showLogo Show login logo for the app otherwise * @param enablePin provides PIN login feature */ @@ -53,7 +55,7 @@ fun loginViewConfigurationOf( applicationVersionCode: Int = 1, darkMode: Boolean = false, showLogo: Boolean = false, - enablePin: Boolean = false + enablePin: Boolean = false, ) = LoginViewConfiguration( appId = appId, @@ -63,5 +65,5 @@ fun loginViewConfigurationOf( applicationVersionCode = applicationVersionCode, darkMode = darkMode, showLogo = showLogo, - enablePin = enablePin + enablePin = enablePin, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/PinViewConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/PinViewConfiguration.kt index 1deebd6cbd..847e0d352e 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/PinViewConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/PinViewConfiguration.kt @@ -28,15 +28,17 @@ class PinViewConfiguration( val applicationName: String = "", val appLogoIconResourceFile: String = "", val enablePin: Boolean = false, - val showLogo: Boolean = true + val showLogo: Boolean = true, ) : Configuration + /** * A function providing a DSL for configuring [PinViewConfiguration]. The configurations provided by * this method are used on the register calling this method + * * @param appId Set unique identifier for this configuration * @param applicationName Set the application name * @param appLogoIconResourceFile Sets the application logo thumb icon, this must be png file inside - * drawable folder + * drawable folder * @param enablePin provides PIN login feature * @param showLogo Show login logo for the app otherwise */ @@ -55,5 +57,5 @@ fun pinViewConfigurationOf( applicationName = applicationName, appLogoIconResourceFile = appLogoIconResourceFile, showLogo = showLogo, - enablePin = enablePin + enablePin = enablePin, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/RegisterViewConfiguration.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/RegisterViewConfiguration.kt index 8608aa1d95..7af3011337 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/RegisterViewConfiguration.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/view/RegisterViewConfiguration.kt @@ -45,7 +45,7 @@ data class RegisterViewConfiguration( val showHeader: Boolean = true, val showFooter: Boolean = true, val primaryFilter: SearchFilter? = null, - val bottomNavigationOptions: List? = null + val bottomNavigationOptions: List? = null, ) : Configuration /** @@ -88,7 +88,7 @@ fun Context.registerViewConfigurationOf( useLabel: Boolean = true, showHeader: Boolean = true, showFooter: Boolean = true, - bottomNavigationOptions: List? = null + bottomNavigationOptions: List? = null, ): RegisterViewConfiguration { return RegisterViewConfiguration( appId = appId, @@ -108,6 +108,6 @@ fun Context.registerViewConfigurationOf( useLabel = useLabel, showHeader = showHeader, showFooter = showFooter, - bottomNavigationOptions = bottomNavigationOptions + bottomNavigationOptions = bottomNavigationOptions, ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/CqlLibraryHelper.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/CqlLibraryHelper.kt index 3c9e7ed703..c3340488c5 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/CqlLibraryHelper.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/CqlLibraryHelper.kt @@ -37,7 +37,7 @@ class CqlLibraryHelper @Inject constructor(@ApplicationContext private val conte fun loadMeasureEvaluateLibrary( fileNameMeasureLibraryCql: String, - dirCqlDirRoot: String + dirCqlDirRoot: String, ): IBaseBundle { return libraryMeasure.get() ?: kotlin.run { @@ -54,13 +54,13 @@ class CqlLibraryHelper @Inject constructor(@ApplicationContext private val conte fun writeMeasureEvaluateLibraryData( measureEvaluateLibraryData: String, fileNameMeasureLibraryCql: String, - dirCqlDirRoot: String + dirCqlDirRoot: String, ) { FileUtil.writeFileOnInternalStorage( context, fileNameMeasureLibraryCql, measureEvaluateLibraryData, - dirCqlDirRoot + dirCqlDirRoot, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/LibraryEvaluator.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/LibraryEvaluator.kt index be34e7b6b7..71a197c2f5 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/LibraryEvaluator.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/LibraryEvaluator.kt @@ -94,6 +94,7 @@ class LibraryEvaluator @Inject constructor() { /** * This method loads configurations for CQL evaluation + * * @param libraryResources Fhir resource type Library * @param valueSetData Fhir resource type ValueSet * @param testData Fhir resource to evaluate e.g Patient @@ -102,27 +103,27 @@ class LibraryEvaluator @Inject constructor() { libraryResources: List, valueSetData: IBaseBundle, testData: IBaseBundle, - fhirContext: FhirContext + fhirContext: FhirContext, ) { bundleFactory.addRootPropertiesToBundle( "bundled-directory", bundleLinks, libraryResources.size, - null + null, ) bundleFactory.addResourcesToBundle( libraryResources, BundleTypeEnum.COLLECTION, "", BundleInclusionRule.BASED_ON_INCLUDES, - null + null, ) contentProvider = BundleFhirLibraryContentProvider( fhirContext, bundleFactory.resourceBundle as IBaseBundle, adapterFactory, - libraryVersionSelector + libraryVersionSelector, ) terminologyProvider = BundleTerminologyProvider(fhirContext, valueSetData) @@ -136,7 +137,7 @@ class LibraryEvaluator @Inject constructor() { TranslatingLibraryLoader( ModelManager(), listOf(contentProvider), - CqlTranslatorOptions.defaultOptions() + CqlTranslatorOptions.defaultOptions(), ) { // This is a hack needed to circumvent a bug that's currently present in the cql-engine. // By default, the LibraryLoader checks to ensure that the same translator options are @@ -153,17 +154,18 @@ class LibraryEvaluator @Inject constructor() { init { put( "http://hl7.org/fhir", - CompositeDataProvider(R4FhirModelResolver(), bundleRetrieveProvider) + CompositeDataProvider(R4FhirModelResolver(), bundleRetrieveProvider), ) } }, - terminologyProvider + terminologyProvider, ) libEvaluator = LibraryEvaluator(cqlFhirParametersConverter, cqlEvaluator) } /** * This method is used to run a CQL Evaluation + * * @param valueSetData Fhir resource type ValueSet * @param testData Fhir resource to evaluate e.g Patient * @param evaluatorId Outcome Id of evaluation e.g ANCRecommendationA2 @@ -178,7 +180,7 @@ class LibraryEvaluator @Inject constructor() { fhirContext: FhirContext, evaluatorId: String?, context: String, - contextLabel: String + contextLabel: String, ): String { loadConfigs(resources, valueSetData, testData, fhirContext) val result = @@ -186,7 +188,7 @@ class LibraryEvaluator @Inject constructor() { VersionedIdentifier().withId(evaluatorId), Pair.of(context, contextLabel), null, - null + null, ) return fhirContext.newJsonParser().encodeResourceToString(result) } @@ -194,6 +196,7 @@ class LibraryEvaluator @Inject constructor() { /** * This method removes multiple patients in a bundle entry and is left with the first occurrence * and returns a bundle with patient entry + * * @param patientData */ fun processCqlPatientBundle(patientData: String): String { @@ -220,7 +223,7 @@ class LibraryEvaluator @Inject constructor() { data: Bundle, // TODO refactor class by modular and single responsibility principle repository: DefaultRepository, - outputLog: Boolean = false + outputLog: Boolean = false, ): List { initialize() @@ -231,7 +234,7 @@ class LibraryEvaluator @Inject constructor() { .filter { it.hasResource() && it.resource.startsWith("Library/") } .mapNotNull { repository.fhirEngine.get( - it.resource.replace("Library/", "") + it.resource.replace("Library/", ""), ) } @@ -244,9 +247,9 @@ class LibraryEvaluator @Inject constructor() { listOfNotNull( patient, *data.entry.map { it.resource }.toTypedArray(), - *repository.search(library.dataRequirementFirstRep).map { it.resource }.toTypedArray() - ) - ) + *repository.search(library.dataRequirementFirstRep).map { it.resource }.toTypedArray(), + ), + ), ) val result = @@ -254,9 +257,8 @@ class LibraryEvaluator @Inject constructor() { VersionedIdentifier().withId(library.name).withVersion(library.version), patient?.let { Pair.of("Patient", it.logicalId) }, null, - null - ) as - Parameters + null, + ) as Parameters parser.setPrettyPrint(false) return result.parameter.mapNotNull { p -> @@ -299,7 +301,7 @@ class LibraryEvaluator @Inject constructor() { BundleTypeEnum.COLLECTION, "", BundleInclusionRule.BASED_ON_INCLUDES, - null + null, ) val libraryProvider = @@ -307,7 +309,7 @@ class LibraryEvaluator @Inject constructor() { fhirContext, bundleFactory.resourceBundle as IBaseBundle, adapterFactory, - libraryVersionSelector + libraryVersionSelector, ) // Load terminology content, and create a TerminologyProvider which is the interface used by the @@ -328,7 +330,7 @@ class LibraryEvaluator @Inject constructor() { CqlEvaluator( LibraryLoaderExt(modelManager, listOf(libraryProvider)), mapOf("http://hl7.org/fhir" to CompositeDataProvider(fhirModelResolver, retrieveProvider)), - terminologyProvider + terminologyProvider, ) libEvaluator = LibraryEvaluator(cqlFhirParametersConverter, cqlEvaluator) @@ -342,7 +344,7 @@ class LibraryEvaluator @Inject constructor() { BundleTypeEnum.COLLECTION, "", BundleInclusionRule.BASED_ON_INCLUDES, - null + null, ) return bundleFactory.resourceBundle as Bundle } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/LibraryLoaderExt.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/LibraryLoaderExt.kt index 2ba2fd561c..45bd12cc1c 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/LibraryLoaderExt.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/cql/LibraryLoaderExt.kt @@ -71,14 +71,15 @@ open class LibraryLoaderExt( ctxt: DeserializationContext, baseType: JavaType, idResolver: TypeIdResolver, - failureMsg: String? + failureMsg: String?, ): JavaType { val id = idResolver.idFromBaseType() val type = idResolver.typeFromId(ctxt, id) - return if (baseType.isConcrete && type != null) type - else super.handleMissingTypeId(ctxt, baseType, idResolver, failureMsg) + return if (baseType.isConcrete && type != null) { + type + } else super.handleMissingTypeId(ctxt, baseType, idResolver, failureMsg) } - } + }, ) return mapper.readValue(reader, LibraryWrapper::class.java).library } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/domain/util/PaginatedDataSource.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/domain/util/PaginatedDataSource.kt index b124d1870d..339bf44909 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/domain/util/PaginatedDataSource.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/domain/util/PaginatedDataSource.kt @@ -30,7 +30,7 @@ import androidx.paging.PagingState * @property loadAll Indicate whether to load all data incrementally in the background */ class PaginatedDataSource( - private val registerRepository: RegisterRepository + private val registerRepository: RegisterRepository, ) : PagingSource() { var currentPage: Int = 0 diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/DefaultRepository.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/DefaultRepository.kt index 7a30862f61..498634cd54 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/DefaultRepository.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/DefaultRepository.kt @@ -67,7 +67,7 @@ constructor( open val dispatcherProvider: DispatcherProvider, open val sharedPreferencesHelper: SharedPreferencesHelper, open val configurationRegistry: ConfigurationRegistry, - open val configService: ConfigService + open val configService: ConfigService, ) { suspend inline fun loadResource(resourceId: String): T? { @@ -105,7 +105,7 @@ constructor( subjectId: String, subjectType: ResourceType = ResourceType.Patient, subjectParam: ReferenceClientParam, - filters: List = listOf() + filters: List = listOf(), ): List = withContext(dispatcherProvider.io()) { fhirEngine @@ -120,7 +120,7 @@ constructor( token: TokenClientParam, subjectType: ResourceType, subjectId: String, - filters: List = listOf() + filters: List = listOf(), ): List = withContext(dispatcherProvider.io()) { fhirEngine @@ -132,7 +132,7 @@ constructor( } suspend fun searchQuestionnaireConfig( - filters: List = listOf() + filters: List = listOf(), ): List = withContext(dispatcherProvider.io()) { fhirEngine @@ -141,9 +141,11 @@ constructor( .map { QuestionnaireConfig( form = it.nameElement.getLocalizedText() ?: it.logicalId, - title = it.titleElement.getLocalizedText() - ?: it.nameElement.getLocalizedText() ?: it.logicalId, - identifier = it.logicalId + title = + it.titleElement.getLocalizedText() + ?: it.nameElement.getLocalizedText() + ?: it.logicalId, + identifier = it.logicalId, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/RegisterFilter.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/RegisterFilter.kt index 3c383026ef..677011893f 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/RegisterFilter.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/RegisterFilter.kt @@ -26,21 +26,23 @@ data class AppointmentRegisterFilter( val myPatients: Boolean, val patientCategory: Iterable< - HealthStatus>?, // nullable whereby null represents absence of filter by patient category - val reasonCode: String? // nullable whereby null represents absence of filter by reason code + HealthStatus, + >?, // nullable whereby null represents absence of filter by patient category + val reasonCode: String?, // nullable whereby null represents absence of filter by reason code ) : RegisterFilter enum class TracingAgeFilterEnum { ZERO_TO_2, ZERO_TO_18, - `18_PLUS` + PLUS_18, } data class TracingRegisterFilter( val isAssignedToMe: Boolean, val patientCategory: Iterable< - HealthStatus>?, // nullable whereby null represents absence of filter by patient category + HealthStatus, + >?, // nullable whereby null represents absence of filter by patient category val reasonCode: String?, // nullable whereby null represents absence of filter by reason code - val age: TracingAgeFilterEnum? // nullable whereby null represents absence of filter by age + val age: TracingAgeFilterEnum?, // nullable whereby null represents absence of filter by age ) : RegisterFilter diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/AppRegisterRepository.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/AppRegisterRepository.kt index b5126e37f0..dea9711d55 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/AppRegisterRepository.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/AppRegisterRepository.kt @@ -47,7 +47,7 @@ constructor( override val configurationRegistry: ConfigurationRegistry, val registerDaoFactory: RegisterDaoFactory, override val configService: ConfigService, - val tracer: PerformanceReporter + val tracer: PerformanceReporter, ) : RegisterRepository, DefaultRepository( @@ -55,14 +55,14 @@ constructor( dispatcherProvider = dispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) { override suspend fun loadRegisterData( currentPage: Int, loadAll: Boolean, appFeatureName: String?, - healthModule: HealthModule + healthModule: HealthModule, ): List = withContext(dispatcherProvider.io()) { tracer.traceSuspend("${healthModule.name.camelCase()}.loadRegisterData") { @@ -70,9 +70,8 @@ constructor( registerDaoFactory.registerDaoMap[healthModule]?.loadRegisterData( currentPage = currentPage, - appFeatureName = appFeatureName - ) - ?: emptyList() + appFeatureName = appFeatureName, + ) ?: emptyList() } } @@ -80,7 +79,7 @@ constructor( nameQuery: String, currentPage: Int, appFeatureName: String?, - healthModule: HealthModule + healthModule: HealthModule, ): List = withContext(dispatcherProvider.io()) { tracer.traceSuspend("${healthModule.name.camelCase()}.searchByName") { @@ -89,9 +88,8 @@ constructor( registerDaoFactory.registerDaoMap[healthModule]?.searchByName( currentPage = currentPage, appFeatureName = appFeatureName, - nameQuery = nameQuery - ) - ?: emptyList() + nameQuery = nameQuery, + ) ?: emptyList() } } @@ -100,7 +98,7 @@ constructor( loadAll: Boolean, appFeatureName: String?, healthModule: HealthModule, - filters: RegisterFilter + filters: RegisterFilter, ): List { return withContext(dispatcherProvider.io()) { tracer.traceSuspend("${healthModule.name.camelCase()}.loadRegisterFiltered") { @@ -108,13 +106,13 @@ constructor( is AppointmentRegisterFilter -> { it.putAttribute( "SelectedFilters", - "${filters.dateOfAppointment}, ${if (filters.myPatients) "Assigned patients" else "All patients"}, ${if (filters.patientCategory?.any() == true) filters.patientCategory.map(HealthStatus::name).joinToString(prefix = "(", postfix = ")") else "All"}, ${filters.reasonCode ?: "All reason codes"}" + "${filters.dateOfAppointment}, ${if (filters.myPatients) "Assigned patients" else "All patients"}, ${if (filters.patientCategory?.any() == true) filters.patientCategory.map(HealthStatus::name).joinToString(prefix = "(", postfix = ")") else "All"}, ${filters.reasonCode ?: "All reason codes"}", ) } is TracingRegisterFilter -> { it.putAttribute( "SelectedFilters", - " ${if (filters.isAssignedToMe) "Assigned patients" else "All patients"}, ${if (filters.patientCategory?.any() == true) filters.patientCategory.map(HealthStatus::name).joinToString(prefix = "(", postfix = ")") else "All"}, ${filters.reasonCode ?: "All reason codes"}, ${filters.age?.name ?: "All Ages"}" + " ${if (filters.isAssignedToMe) "Assigned patients" else "All patients"}, ${if (filters.patientCategory?.any() == true) filters.patientCategory.map(HealthStatus::name).joinToString(prefix = "(", postfix = ")") else "All"}, ${filters.reasonCode ?: "All reason codes"}, ${filters.age?.name ?: "All Ages"}", ) } } @@ -124,9 +122,8 @@ constructor( currentPage, loadAll, appFeatureName, - filters - ) - ?: emptyList() + filters, + ) ?: emptyList() } } } @@ -134,7 +131,7 @@ constructor( override suspend fun countRegisterFiltered( appFeatureName: String?, healthModule: HealthModule, - filters: RegisterFilter + filters: RegisterFilter, ): Long { return withContext(dispatcherProvider.io()) { tracer.traceSuspend("${healthModule.name.camelCase()}.countRegisterFiltered") { @@ -142,29 +139,28 @@ constructor( is AppointmentRegisterFilter -> { it.putAttribute( "SelectedFilters", - "${filters.dateOfAppointment}, ${if (filters.myPatients) "Assigned patients" else "All patients"}, ${if (filters.patientCategory?.any() == true) filters.patientCategory.map(HealthStatus::name).joinToString(prefix = "(", postfix = ")") else "All"}, ${filters.reasonCode ?: "All reason codes"}" + "${filters.dateOfAppointment}, ${if (filters.myPatients) "Assigned patients" else "All patients"}, ${if (filters.patientCategory?.any() == true) filters.patientCategory.map(HealthStatus::name).joinToString(prefix = "(", postfix = ")") else "All"}, ${filters.reasonCode ?: "All reason codes"}", ) } is TracingRegisterFilter -> { it.putAttribute( "SelectedFilters", - " ${if (filters.isAssignedToMe) "Assigned patients" else "All patients"}, ${if (filters.patientCategory?.any() == true) filters.patientCategory.map(HealthStatus::name).joinToString(prefix = "(", postfix = ")") else "All"}, ${filters.reasonCode ?: "All reason codes"}, ${filters.age?.name ?: "All Ages"}" + " ${if (filters.isAssignedToMe) "Assigned patients" else "All patients"}, ${if (filters.patientCategory?.any() == true) filters.patientCategory.map(HealthStatus::name).joinToString(prefix = "(", postfix = ")") else "All"}, ${filters.reasonCode ?: "All reason codes"}, ${filters.age?.name ?: "All Ages"}", ) } } registerDaoFactory.registerDaoMap[healthModule]?.countRegisterFiltered( appFeatureName, - filters - ) - ?: 0 + filters, + ) ?: 0 } } } override suspend fun countRegisterData( appFeatureName: String?, - healthModule: HealthModule + healthModule: HealthModule, ): Long = withContext(dispatcherProvider.io()) { tracer.traceSuspend("${healthModule.name.camelCase()}.countRegisterData") { @@ -175,20 +171,20 @@ constructor( override suspend fun loadPatientProfileData( appFeatureName: String?, healthModule: HealthModule, - patientId: String + patientId: String, ): ProfileData? = withContext(dispatcherProvider.io()) { tracer.traceSuspend("${healthModule.name.camelCase()}.loadPatientProfileData") { registerDaoFactory.registerDaoMap[healthModule]?.loadProfileData( appFeatureName = appFeatureName, - resourceId = patientId + resourceId = patientId, ) } } suspend fun loadChildrenRegisterData( healthModule: HealthModule, - otherPatientResource: List + otherPatientResource: List, ): List = withContext(dispatcherProvider.io()) { tracer.traceSuspend("${healthModule.name.camelCase()}}.loadChildrenRegisterData") { @@ -207,8 +203,10 @@ constructor( this.let { val u = indexOf('_') val newString = lowercase().replaceFirstChar { it.uppercase() } - return@let if (u != -1) + return@let if (u != -1) { newString.replaceRange(u until u + 2, this.elementAt(u + 1).uppercase()) - else newString + } else { + newString + } } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/AncPatientRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/AncPatientRegisterDao.kt index 80ac6af4d0..9d5ed457d9 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/AncPatientRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/AncPatientRegisterDao.kt @@ -55,13 +55,13 @@ constructor( val fhirEngine: FhirEngine, val defaultRepository: DefaultRepository, val configurationRegistry: ConfigurationRegistry, - val dispatcherProvider: DefaultDispatcherProvider + val dispatcherProvider: DefaultDispatcherProvider, ) : RegisterDao { override suspend fun loadRegisterData( currentPage: Int, loadAll: Boolean, - appFeatureName: String? + appFeatureName: String?, ): List { val pregnancies = fhirEngine @@ -69,23 +69,24 @@ constructor( getRegisterDataFilters().forEach { filterBy(it) } sort(Patient.NAME, Order.ASCENDING) count = - if (loadAll) countRegisterData(appFeatureName).toInt() - else PaginationConstant.DEFAULT_PAGE_SIZE + if (loadAll) { + countRegisterData(appFeatureName).toInt() + } else PaginationConstant.DEFAULT_PAGE_SIZE from = currentPage * PaginationConstant.DEFAULT_PAGE_SIZE } .map { it.resource } .distinctBy { it.subject.reference } val patients = - pregnancies.map { fhirEngine.get(it.subject.extractId()) }.sortedBy { - it.nameFirstRep.family - } + pregnancies + .map { fhirEngine.get(it.subject.extractId()) } + .sortedBy { it.nameFirstRep.family } return patients.map { patient -> val carePlans = defaultRepository.searchResourceFor( subjectId = patient.logicalId, - subjectParam = CarePlan.SUBJECT + subjectParam = CarePlan.SUBJECT, ) RegisterData.AncRegisterData( @@ -98,7 +99,7 @@ constructor( visitStatus = getVisitStatus(carePlans), servicesDue = carePlans.sumOf { it.milestonesDue().size }, servicesOverdue = carePlans.sumOf { it.milestonesOverdue().size }, - familyName = if (patient.hasName()) patient.nameFirstRep.family else null + familyName = if (patient.hasName()) patient.nameFirstRep.family else null, ) } } @@ -108,7 +109,7 @@ constructor( val carePlans = defaultRepository.searchResourceFor( subjectId = patient.logicalId, - subjectParam = CarePlan.SUBJECT + subjectParam = CarePlan.SUBJECT, ) return ProfileData.AncProfileData( @@ -124,23 +125,23 @@ constructor( tasks = defaultRepository.searchResourceFor( subjectId = patient.logicalId, - subjectParam = Task.SUBJECT + subjectParam = Task.SUBJECT, ), conditions = defaultRepository.searchResourceFor( subjectId = patient.logicalId, - subjectParam = Condition.SUBJECT + subjectParam = Condition.SUBJECT, ), flags = defaultRepository.searchResourceFor( subjectId = patient.logicalId, - subjectParam = Flag.SUBJECT + subjectParam = Flag.SUBJECT, ), visits = defaultRepository.searchResourceFor( subjectId = patient.logicalId, - subjectParam = Encounter.SUBJECT - ) + subjectParam = Encounter.SUBJECT, + ), ) } @@ -149,8 +150,9 @@ constructor( private fun getVisitStatus(carePlans: List): VisitStatus { var visitStatus = VisitStatus.PLANNED - if (carePlans.any { it.milestonesOverdue().isNotEmpty() }) visitStatus = VisitStatus.OVERDUE - else if (carePlans.any { it.milestonesDue().isNotEmpty() }) visitStatus = VisitStatus.DUE + if (carePlans.any { it.milestonesOverdue().isNotEmpty() }) { + visitStatus = VisitStatus.OVERDUE + } else if (carePlans.any { it.milestonesDue().isNotEmpty() }) visitStatus = VisitStatus.DUE return visitStatus } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/AppointmentRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/AppointmentRegisterDao.kt index 52ce4a89a2..2df12e0ced 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/AppointmentRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/AppointmentRegisterDao.kt @@ -61,7 +61,7 @@ constructor( val defaultRepository: DefaultRepository, val configurationRegistry: ConfigurationRegistry, val dispatcherProvider: DefaultDispatcherProvider, - val sharedPreferencesHelper: SharedPreferencesHelper + val sharedPreferencesHelper: SharedPreferencesHelper, ) : RegisterDao { private val currentPractitioner by lazy { @@ -102,7 +102,7 @@ constructor( private suspend fun patientCategoryMatches( appointment: Appointment, - categories: Iterable + categories: Iterable, ): Boolean { val patient = appointment.patientRef()?.let { defaultRepository.loadResource(it) as Patient } @@ -113,7 +113,7 @@ constructor( private suspend fun searchAppointments( filters: RegisterFilter, loadAll: Boolean, - page: Int = -1 + page: Int = -1, ): List { filters as AppointmentRegisterFilter val searchResults = @@ -129,14 +129,14 @@ constructor( { value = of(DateTimeType(filters.dateOfAppointment)) prefix = ParamPrefixEnum.GREATERTHAN_OR_EQUALS - } + }, ) filter( Appointment.DATE, { value = of(DateTimeType(filters.dateOfAppointment).apply { add(Calendar.DATE, 1) }) prefix = ParamPrefixEnum.LESSTHAN - } + }, ) // if (filters.myPatients && currentPractititoner != null) @@ -174,29 +174,31 @@ constructor( Coding().apply { system = "https://d-tree.org" code = it - } + }, ) } filter(Appointment.REASON_CODE, { value = of(codeableConcept) }) } } - return searchResults.map { it.resource }.filter { - val patientAssignmentFilter = - !filters.myPatients || - (it.practitionerRef()?.reference == currentPractitioner?.asReference()?.reference) - val patientCategoryFilter = - filters.patientCategory == null || (patientCategoryMatches(it, filters.patientCategory)) + return searchResults + .map { it.resource } + .filter { + val patientAssignmentFilter = + !filters.myPatients || + (it.practitionerRef()?.reference == currentPractitioner?.asReference()?.reference) + val patientCategoryFilter = + filters.patientCategory == null || (patientCategoryMatches(it, filters.patientCategory)) - val appointmentReasonFilter = - filters.reasonCode == null || - (it.reasonCode.flatMap { cc -> cc.coding }.any { c -> c.code == filters.reasonCode }) - it.status == Appointment.AppointmentStatus.BOOKED && - it.hasStart() && - patientAssignmentFilter && - patientCategoryFilter && - appointmentReasonFilter - } + val appointmentReasonFilter = + filters.reasonCode == null || + (it.reasonCode.flatMap { cc -> cc.coding }.any { c -> c.code == filters.reasonCode }) + it.status == Appointment.AppointmentStatus.BOOKED && + it.hasStart() && + patientAssignmentFilter && + patientCategoryFilter && + appointmentReasonFilter + } } private suspend fun transformAppointment(appointment: Appointment): RegisterData { @@ -214,11 +216,11 @@ constructor( age = patient.extractAge(), healthStatus = patient.extractHealthStatusFromMeta( - applicationConfiguration().patientTypeFilterTagViaMetaCodingSystem + applicationConfiguration().patientTypeFilterTagViaMetaCodingSystem, ), isPregnant = defaultRepository.isPatientPregnant(patient), isBreastfeeding = defaultRepository.isPatientBreastfeeding(patient), - reasons = appointment.reasonCode.flatMap { cc -> cc.coding.map { coding -> coding.code } } + reasons = appointment.reasonCode.flatMap { cc -> cc.coding.map { coding -> coding.code } }, ) } @@ -226,7 +228,7 @@ constructor( currentPage: Int, loadAll: Boolean, appFeatureName: String?, - filters: RegisterFilter + filters: RegisterFilter, ): List = searchAppointments(filters, loadAll = true) .map { transformAppointment(it) } @@ -235,21 +237,23 @@ constructor( compareBy { it as RegisterData.AppointmentRegisterData it.identifier - } - ) + }, + ), ) .let { if (!loadAll) { val from = currentPage * PaginationConstant.DEFAULT_PAGE_SIZE val to = from + PaginationConstant.DEFAULT_PAGE_SIZE it.safeSubList(from..to) - } else it + } else { + it + } } override suspend fun loadRegisterData( currentPage: Int, loadAll: Boolean, - appFeatureName: String? + appFeatureName: String?, ): List { val appointments = fhirEngine.search { @@ -271,15 +275,17 @@ constructor( compareBy { it as RegisterData.AppointmentRegisterData it.identifier - } - ) + }, + ), ) .let { if (!loadAll) { val from = currentPage * PaginationConstant.DEFAULT_PAGE_SIZE val to = from + PaginationConstant.DEFAULT_PAGE_SIZE it.safeSubList(from..to) - } else it + } else { + it + } } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/DefaultPatientRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/DefaultPatientRegisterDao.kt index d591183f53..a2a49e1c25 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/DefaultPatientRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/DefaultPatientRegisterDao.kt @@ -55,7 +55,7 @@ constructor( override suspend fun loadRegisterData( currentPage: Int, loadAll: Boolean, - appFeatureName: String? + appFeatureName: String?, ): List = withContext(dispatcherProvider.io()) { val patients = @@ -66,14 +66,16 @@ constructor( from = currentPage * DEFAULT_PAGE_SIZE } - patients.map { it.resource }.map { - RegisterData.DefaultRegisterData( - logicalId = it.logicalId, - name = it.extractName(), - gender = it.gender, - age = it.extractAge() - ) - } + patients + .map { it.resource } + .map { + RegisterData.DefaultRegisterData( + logicalId = it.logicalId, + name = it.extractName(), + gender = it.gender, + age = it.extractAge(), + ) + } } override suspend fun countRegisterData(appFeatureName: String?): Long = @@ -94,37 +96,41 @@ constructor( deathDate = if (patient.hasDeceasedDateTimeType()) patient.deceasedDateTimeType.value else null, deceased = - if (patient.hasDeceasedBooleanType()) patient.deceasedBooleanType.booleanValue() - else null, + if (patient.hasDeceasedBooleanType()) { + patient.deceasedBooleanType.booleanValue() + } else { + null + }, visits = defaultRepository.searchResourceFor( subjectId = resourceId, - subjectParam = Encounter.SUBJECT + subjectParam = Encounter.SUBJECT, ), flags = defaultRepository.searchResourceFor(subjectId = resourceId, subjectParam = Flag.SUBJECT), conditions = defaultRepository.searchResourceFor( subjectId = resourceId, - subjectParam = Condition.SUBJECT + subjectParam = Condition.SUBJECT, ), tasks = - defaultRepository.searchResourceFor( + defaultRepository + .searchResourceFor( subjectId = resourceId, - subjectParam = Task.SUBJECT + subjectParam = Task.SUBJECT, ) .sortedBy { it.executionPeriod.start.time }, services = defaultRepository.searchResourceFor( subjectId = resourceId, - subjectParam = CarePlan.SUBJECT + subjectParam = CarePlan.SUBJECT, ), forms = defaultRepository.searchQuestionnaireConfig(formsFilter), responses = defaultRepository.searchResourceFor( subjectId = resourceId, - subjectParam = QuestionnaireResponse.SUBJECT - ) + subjectParam = QuestionnaireResponse.SUBJECT, + ), ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/FamilyRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/FamilyRegisterDao.kt index 2d39a75553..df200ffb98 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/FamilyRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/FamilyRegisterDao.kt @@ -64,45 +64,47 @@ class FamilyRegisterDao constructor( val fhirEngine: FhirEngine, val defaultRepository: DefaultRepository, - val configurationRegistry: ConfigurationRegistry + val configurationRegistry: ConfigurationRegistry, ) : RegisterDao { override suspend fun loadRegisterData( currentPage: Int, loadAll: Boolean, - appFeatureName: String? + appFeatureName: String?, ): List { val families = fhirEngine.search { getRegisterDataFilters(FAMILY.name).forEach { filterBy(it) } count = - if (loadAll) countRegisterData(appFeatureName).toInt() - else PaginationConstant.DEFAULT_PAGE_SIZE + if (loadAll) { + countRegisterData(appFeatureName).toInt() + } else PaginationConstant.DEFAULT_PAGE_SIZE from = currentPage * PaginationConstant.DEFAULT_PAGE_SIZE } - return families.map { it.resource }.filter { it.active && !it.name.isNullOrEmpty() }.map { - family -> - val members: List = - family.member?.filter { it.hasEntity() && it.entity.hasReference() }?.mapNotNull { - loadFamilyMemberRegisterData(it.entity.extractId()) - } - ?: listOf() + return families + .map { it.resource } + .filter { it.active && !it.name.isNullOrEmpty() } + .map { family -> + val members: List = + family.member + ?.filter { it.hasEntity() && it.entity.hasReference() } + ?.mapNotNull { loadFamilyMemberRegisterData(it.entity.extractId()) } ?: listOf() - val familyHead = loadFamilyHead(family) + val familyHead = loadFamilyHead(family) - RegisterData.FamilyRegisterData( - logicalId = family.logicalId, - name = family.name, - identifier = family.extractOfficialIdentifier(), - address = familyHead?.extractAddress() ?: "", - head = familyHead?.let { loadFamilyMemberRegisterData(familyHead.logicalId) }, - members = members, - servicesDue = members.sumOf { it.servicesDue ?: 0 }, - servicesOverdue = members.sumOf { it.servicesOverdue ?: 0 }, - lastSeen = family.meta?.lastUpdated.lastSeenFormat() - ) - } + RegisterData.FamilyRegisterData( + logicalId = family.logicalId, + name = family.name, + identifier = family.extractOfficialIdentifier(), + address = familyHead?.extractAddress() ?: "", + head = familyHead?.let { loadFamilyMemberRegisterData(familyHead.logicalId) }, + members = members, + servicesDue = members.sumOf { it.servicesDue ?: 0 }, + servicesOverdue = members.sumOf { it.servicesOverdue ?: 0 }, + lastSeen = family.meta?.lastUpdated.lastSeenFormat(), + ) + } } override suspend fun loadProfileData(appFeatureName: String?, resourceId: String): ProfileData { @@ -117,23 +119,23 @@ constructor( age = familyHead?.extractAge() ?: "", head = familyHead?.let { loadFamilyMemberProfileData(familyHead.logicalId) }, members = - family.member?.filter { it.hasEntity() && it.entity.hasReference() }?.mapNotNull { - loadFamilyMemberProfileData(it.entity.extractId()) - } - ?: listOf(), + family.member + ?.filter { it.hasEntity() && it.entity.hasReference() } + ?.mapNotNull { loadFamilyMemberProfileData(it.entity.extractId()) } ?: listOf(), services = defaultRepository.searchResourceFor( subjectId = family.logicalId, subjectParam = CarePlan.SUBJECT, - filters = getRegisterDataFilters(FAMILY_CARE_PLAN) + filters = getRegisterDataFilters(FAMILY_CARE_PLAN), ), tasks = - defaultRepository.searchResourceFor( + defaultRepository + .searchResourceFor( subjectId = family.logicalId, subjectParam = Task.SUBJECT, - subjectType = ResourceType.Group + subjectType = ResourceType.Group, ) - .let { it.sortedBy { it.executionPeriod.start.time } } + .let { it.sortedBy { it.executionPeriod.start.time } }, ) } @@ -153,7 +155,7 @@ constructor( .searchResourceFor( token = RelatedPerson.RES_ID, subjectType = ResourceType.RelatedPerson, - subjectId = reference.extractId() + subjectId = reference.extractId(), ) .firstOrNull() ?.let { relatedPerson -> @@ -161,14 +163,13 @@ constructor( .searchResourceFor( token = Patient.RES_ID, subjectType = ResourceType.Patient, - subjectId = relatedPerson.patient.extractId() + subjectId = relatedPerson.patient.extractId(), ) .firstOrNull() } } suspend fun changeFamilyHead(newFamilyHead: String, oldFamilyHead: String) { - val patient = fhirEngine.get(newFamilyHead) // TODO create a utility/extension function for creating RelatedPersonResource @@ -198,13 +199,12 @@ constructor( suspend fun removeFamily(familyId: String, isDeactivateMembers: Boolean?) { defaultRepository.loadResource(familyId)?.let { family -> if (!family.active) throw IllegalStateException("Family already deleted") - family - .managingEntity + family.managingEntity ?.let { reference -> defaultRepository.searchResourceFor( token = RelatedPerson.RES_ID, subjectType = ResourceType.RelatedPerson, - subjectId = reference.extractId() + subjectId = reference.extractId(), ) } ?.firstOrNull() @@ -237,13 +237,12 @@ constructor( family.member.run { remove(this.find { it.entity.reference == "Patient/${patient.logicalId}" }) } - family - .managingEntity + family.managingEntity ?.let { reference -> defaultRepository.searchResourceFor( token = RelatedPerson.RES_ID, subjectType = ResourceType.RelatedPerson, - subjectId = reference.extractId() + subjectId = reference.extractId(), ) } ?.firstOrNull() @@ -260,7 +259,7 @@ constructor( } private suspend fun loadFamilyMemberRegisterData( - memberId: String + memberId: String, ): RegisterData.FamilyMemberRegisterData? { return defaultRepository.loadResource(memberId)?.let { patient -> if (!patient.active) return null @@ -278,7 +277,7 @@ constructor( servicesDue = carePlans.map { it.resource }.filter { it.due() }.flatMap { it.activity }.size, servicesOverdue = - carePlans.map { it.resource }.filter { it.overdue() }.flatMap { it.activity }.size + carePlans.map { it.resource }.filter { it.overdue() }.flatMap { it.activity }.size, ) } } @@ -303,7 +302,7 @@ constructor( conditions = conditions, flags = flags, services = carePlans.map { it.resource }, - tasks = tasks + tasks = tasks, ) } @@ -311,7 +310,7 @@ constructor( defaultRepository.searchResourceFor( subjectId = patientId, subjectParam = Condition.SUBJECT, - subjectType = ResourceType.Patient + subjectType = ResourceType.Patient, ) private suspend fun loadMemberCarePlan(patientId: String) = @@ -321,23 +320,26 @@ constructor( } private suspend fun loadMemberTask(patientId: String) = - defaultRepository.searchResourceFor( + defaultRepository + .searchResourceFor( subjectId = patientId, subjectParam = Task.SUBJECT, - subjectType = ResourceType.Patient + subjectType = ResourceType.Patient, ) .let { it.sortedBy { it.executionPeriod.start.time } } private fun Group.extractOfficialIdentifier(): String? = - if (this.hasIdentifier()) + if (this.hasIdentifier()) { this.identifier.firstOrNull { it.use == Identifier.IdentifierUse.OFFICIAL }?.value - else null + } else { + null + } private suspend fun loadMemberFlags(patientId: String) = defaultRepository.searchResourceFor( subjectId = patientId, subjectParam = Flag.SUBJECT, - subjectType = ResourceType.Patient + subjectType = ResourceType.Patient, ) private fun getRegisterDataFilters(id: String) = diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDao.kt index d9deab035b..04a84fca53 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDao.kt @@ -76,7 +76,7 @@ class HivRegisterDao constructor( val fhirEngine: FhirEngine, val defaultRepository: DefaultRepository, - val configurationRegistry: ConfigurationRegistry + val configurationRegistry: ConfigurationRegistry, ) : RegisterDao, PatientDao { private val code = defaultRepository.sharedPreferencesHelper.organisationCode() @@ -96,15 +96,16 @@ constructor( override suspend fun loadRegisterData( currentPage: Int, loadAll: Boolean, - appFeatureName: String? + appFeatureName: String?, ): List { val patients = fhirEngine.search { filter(Patient.ACTIVE, { value = of(true) }) sort(Patient.NAME, Order.ASCENDING) count = - if (loadAll) countRegisterData(appFeatureName).toInt() - else PaginationConstant.DEFAULT_PAGE_SIZE + if (loadAll) { + countRegisterData(appFeatureName).toInt() + } else PaginationConstant.DEFAULT_PAGE_SIZE from = currentPage * PaginationConstant.DEFAULT_PAGE_SIZE } @@ -118,7 +119,7 @@ constructor( override suspend fun searchByName( nameQuery: String, currentPage: Int, - appFeatureName: String? + appFeatureName: String?, ): List { val patients = fhirEngine.search { @@ -127,22 +128,24 @@ constructor( { modifier = StringFilterModifier.CONTAINS value = nameQuery - } + }, ) filter(Patient.IDENTIFIER, { value = of(Identifier().apply { value = nameQuery }) }) operation = Operation.OR sort(Patient.NAME, Order.ASCENDING) } - return patients.map { it.resource }.mapNotNull { patient -> - if (isValidPatient(patient)) { - val transFormedPatient = transformPatientToHivRegisterData(patient) - if (transFormedPatient.healthStatus != HealthStatus.DEFAULT) { - return@mapNotNull transFormedPatient + return patients + .map { it.resource } + .mapNotNull { patient -> + if (isValidPatient(patient)) { + val transFormedPatient = transformPatientToHivRegisterData(patient) + if (transFormedPatient.healthStatus != HealthStatus.DEFAULT) { + return@mapNotNull transFormedPatient + } } + return@mapNotNull null } - return@mapNotNull null - } } override suspend fun loadProfileData(appFeatureName: String?, resourceId: String): ProfileData { @@ -177,15 +180,15 @@ constructor( ?: Double.MAX_VALUE }, // tasks with no clinicVisitOrder, would be sorted with Task#description - { it.description } - ) + { it.description }, + ), ), services = patient.activeCarePlans(), conditions = patient.activeConditions(), otherPatients = patient.otherChildren(), guardians = patient.guardians(), observations = patient.observations(), - practitioners = patient.practitioners() + practitioners = patient.practitioners(), ) } @@ -211,7 +214,7 @@ constructor( .plus( patient.guardians().filterIsInstance().map { transformRelatedPersonToHivRegisterData(it) - } + }, ) private fun transformRelatedPersonToHivRegisterData(person: RelatedPerson) = @@ -264,10 +267,10 @@ constructor( chwAssigned = patient.extractGeneralPractitionerReference(), healthStatus = patient.extractHealthStatusFromMeta( - getApplicationConfiguration().patientTypeFilterTagViaMetaCodingSystem + getApplicationConfiguration().patientTypeFilterTagViaMetaCodingSystem, ), isPregnant = defaultRepository.isPatientPregnant(patient), - isBreastfeeding = defaultRepository.isPatientBreastfeeding(patient) + isBreastfeeding = defaultRepository.isPatientBreastfeeding(patient), ) internal suspend fun Patient.activeConditions() = @@ -276,34 +279,40 @@ constructor( } internal suspend fun Patient.observations() = - defaultRepository.searchResourceFor( + defaultRepository + .searchResourceFor( subjectId = this.logicalId, subjectParam = Observation.SUBJECT, - subjectType = ResourceType.Patient + subjectType = ResourceType.Patient, ) .also { return if (it.isNullOrEmpty().not()) { - it.sortedByDescending { it.effectiveDateTimeType.value }.distinctBy { - it.code.coding.last().code - } - } else emptyList() + it + .sortedByDescending { it.effectiveDateTimeType.value } + .distinctBy { it.code.coding.last().code } + } else { + emptyList() + } } internal suspend fun Patient.activeTasks(): List { - return this.activeCarePlans().flatMap { it.activity }.flatMap { - it.outcomeReference - .filter { outcomeRef -> outcomeRef.reference.startsWith(ResourceType.Task.name) } - .map { reference -> - val task = defaultRepository.loadResource(reference) as Task - task.apply { - if (it.detail.status == CarePlan.CarePlanActivityStatus.COMPLETED && - status != Task.TaskStatus.COMPLETED - ) { - status = Task.TaskStatus.COMPLETED + return this.activeCarePlans() + .flatMap { it.activity } + .flatMap { + it.outcomeReference + .filter { outcomeRef -> outcomeRef.reference.startsWith(ResourceType.Task.name) } + .map { reference -> + val task = defaultRepository.loadResource(reference) as Task + task.apply { + if ( + it.detail.status == CarePlan.CarePlanActivityStatus.COMPLETED && + status != Task.TaskStatus.COMPLETED + ) { + status = Task.TaskStatus.COMPLETED + } } } - } - } + } } internal suspend fun Patient.activeCarePlans() = @@ -313,7 +322,7 @@ constructor( defaultRepository.searchResourceFor( subjectId = patientId, subjectType = ResourceType.Patient, - subjectParam = CarePlan.SUBJECT + subjectParam = CarePlan.SUBJECT, ) internal suspend fun Patient.practitioners(): List { @@ -343,7 +352,7 @@ constructor( defaultRepository.searchResourceFor( subjectId = patientId, subjectType = ResourceType.Patient, - subjectParam = Patient.LINK + subjectParam = Patient.LINK, ) for (item in filteredItems) { @@ -355,7 +364,7 @@ constructor( internal fun Patient.isValidChildContact(): Boolean { val healthStatus = this.extractHealthStatusFromMeta( - getApplicationConfiguration().patientTypeFilterTagViaMetaCodingSystem + getApplicationConfiguration().patientTypeFilterTagViaMetaCodingSystem, ) if (healthStatus == HealthStatus.CHILD_CONTACT || healthStatus == HealthStatus.EXPOSED_INFANT) { @@ -373,7 +382,7 @@ constructor( .filter { (it.other.referenceElement.resourceType == ResourceType.RelatedPerson.name).or( it.type == Patient.LinkType.REFER && - it.other.referenceElement.resourceType == ResourceType.Patient.name + it.other.referenceElement.resourceType == ResourceType.Patient.name, ) } .map { defaultRepository.loadResource(it.other) } @@ -394,7 +403,6 @@ constructor( } suspend fun transformChildrenPatientToRegisterData(patients: List): List { - return patients .filter(this::isValidPatient) .map { patient -> @@ -412,10 +420,10 @@ constructor( chwAssigned = patient.extractGeneralPractitionerReference(), healthStatus = patient.extractHealthStatusFromMeta( - getApplicationConfiguration().patientTypeFilterTagViaMetaCodingSystem + getApplicationConfiguration().patientTypeFilterTagViaMetaCodingSystem, ), isPregnant = defaultRepository.isPatientPregnant(patient), - isBreastfeeding = defaultRepository.isPatientBreastfeeding(patient) + isBreastfeeding = defaultRepository.isPatientBreastfeeding(patient), ) } .filterNot { it.healthStatus == HealthStatus.DEFAULT } @@ -437,7 +445,7 @@ suspend fun DefaultRepository.patientConditions(patientId: String) = searchResourceFor( subjectId = patientId, subjectParam = Condition.SUBJECT, - subjectType = ResourceType.Patient + subjectType = ResourceType.Patient, ) suspend fun DefaultRepository.isPatientPregnant(patient: Patient) = diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HomeTracingRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HomeTracingRegisterDao.kt index b664baa7ed..338862ea13 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HomeTracingRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HomeTracingRegisterDao.kt @@ -35,7 +35,7 @@ constructor( defaultRepository: DefaultRepository, configurationRegistry: ConfigurationRegistry, dispatcherProvider: DefaultDispatcherProvider, - sharedPreferencesHelper: SharedPreferencesHelper + sharedPreferencesHelper: SharedPreferencesHelper, ) : TracingRegisterDao( fhirEngine, @@ -43,7 +43,7 @@ constructor( tracingRepository, configurationRegistry, dispatcherProvider, - sharedPreferencesHelper + sharedPreferencesHelper, ) { override val tracingCoding: Coding = Coding("https://d-tree.org", "home-tracing", "Home Tracing") diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/PhoneTracingRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/PhoneTracingRegisterDao.kt index 2374aa8881..ea39142482 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/PhoneTracingRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/PhoneTracingRegisterDao.kt @@ -35,7 +35,7 @@ constructor( tracingRepository: TracingRepository, configurationRegistry: ConfigurationRegistry, dispatcherProvider: DefaultDispatcherProvider, - sharedPreferencesHelper: SharedPreferencesHelper + sharedPreferencesHelper: SharedPreferencesHelper, ) : TracingRegisterDao( fhirEngine, @@ -43,7 +43,7 @@ constructor( tracingRepository, configurationRegistry, dispatcherProvider, - sharedPreferencesHelper + sharedPreferencesHelper, ) { override val tracingCoding: Coding = diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/RegisterDaoFactory.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/RegisterDaoFactory.kt index 39989d12f9..b23be37640 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/RegisterDaoFactory.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/RegisterDaoFactory.kt @@ -31,7 +31,7 @@ constructor( val hivRegisterDao: HivRegisterDao, val appointmentRegisterDao: AppointmentRegisterDao, val homeTracingRegisterDao: HomeTracingRegisterDao, - val phoneTracingRegisterDao: PhoneTracingRegisterDao + val phoneTracingRegisterDao: PhoneTracingRegisterDao, ) { val registerDaoMap: Map by lazy { @@ -42,7 +42,7 @@ constructor( Pair(HealthModule.HOME_TRACING, homeTracingRegisterDao), Pair(HealthModule.PHONE_TRACING, phoneTracingRegisterDao), Pair(HealthModule.APPOINTMENT, appointmentRegisterDao), - Pair(HealthModule.DEFAULT, defaultPatientRegisterDao) + Pair(HealthModule.DEFAULT, defaultPatientRegisterDao), ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/TracingRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/TracingRegisterDao.kt index 82f03b252a..07a4cc1397 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/TracingRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/TracingRegisterDao.kt @@ -81,7 +81,7 @@ constructor( private val tracingRepository: TracingRepository, val configurationRegistry: ConfigurationRegistry, val dispatcherProvider: DefaultDispatcherProvider, - val sharedPreferencesHelper: SharedPreferencesHelper + val sharedPreferencesHelper: SharedPreferencesHelper, ) : RegisterDao { @VisibleForTesting(otherwise = PROTECTED) abstract val tracingCoding: Coding @@ -89,6 +89,7 @@ constructor( private val alternateTracingCoding = lazy { tracingCoding.copy().apply { system = "http://snomed.info/sct" } } + fun hivPatientIdentifier(patient: Patient): String = // would either be an ART or HCC number patient.extractOfficialIdentifier() ?: HivRegisterDao.ResourceValue.BLANK @@ -102,27 +103,27 @@ constructor( TokenClientParam("_tag"), { value = of(tracingCoding) }, { value = of(alternateTracingCoding.value) }, - operation = Operation.OR + operation = Operation.OR, ) filter( Task.STATUS, { value = of(Task.TaskStatus.READY.toCode()) }, { value = of(Task.TaskStatus.INPROGRESS.toCode()) }, - operation = Operation.OR + operation = Operation.OR, ) filter( Task.PERIOD, { value = of(DateTimeType.now()) prefix = ParamPrefixEnum.GREATERTHAN - } + }, ) } private suspend fun searchRegister( filters: RegisterFilter, loadAll: Boolean, - page: Int = -1 + page: Int = -1, ): List>> { filters as TracingRegisterFilter val patients: List = @@ -149,7 +150,11 @@ constructor( } return@flatMap listOf(coding, alternativeCoding).map< - Coding, TokenParamFilterCriterion.() -> Unit> { c -> { value = of(c) } } + Coding, + TokenParamFilterCriterion.() -> Unit, + > { c -> + { value = of(c) } + } } filter(TokenClientParam("_tag"), *paramQueries.toTypedArray(), operation = Operation.OR) @@ -172,12 +177,14 @@ constructor( val date = Date.from(today.minusYears(18L).toInstant()) it.birthDate.after(date) } - TracingAgeFilterEnum.`18_PLUS` -> { + TracingAgeFilterEnum.PLUS_18 -> { val date = Date.from(today.minusYears(18L).toInstant()) it.birthDate.time <= date.time } } - } else true + } else { + true + } } val patientrefs = @@ -198,18 +205,18 @@ constructor( .filter { it.status in listOf(Task.TaskStatus.INPROGRESS, Task.TaskStatus.READY) && it.executionPeriod.hasStart() && - it.executionPeriod - .start + it.executionPeriod.start .before(Date()) .or(it.executionPeriod.start.asDdMmmYyyy() == Date().asDdMmmYyyy()) } - } else emptyList() + } else { + emptyList() + } val filteredTasks = filters.reasonCode?.let { reasonCode -> tasks.filter { it.reasonCode.coding.any { coding -> coding.code == reasonCode } } - } - ?: tasks + } ?: tasks val groupedTasks = filteredTasks.groupBy { it.`for`.reference } return patients @@ -224,7 +231,7 @@ constructor( currentPage: Int, loadAll: Boolean, appFeatureName: String?, - filters: RegisterFilter + filters: RegisterFilter, ): List { val patientTasksPairs = searchRegister(filters, loadAll = true) val patientSubjectRefFilterCriteria = @@ -235,7 +242,7 @@ constructor( } .toTypedArray() val subjectListResourcesGroup: Map = - if (patientSubjectRefFilterCriteria.isNotEmpty()) + if (patientSubjectRefFilterCriteria.isNotEmpty()) { fhirEngine .search { filter(ListResource.SUBJECT, *patientSubjectRefFilterCriteria, operation = Operation.OR) @@ -246,7 +253,9 @@ constructor( .filter { it.status == ListResource.ListStatus.CURRENT } .groupingBy { it.subject.reference } .reduce { _, accumulator, element -> maxOf(accumulator, element, compareBy { it.title }) } - else emptyMap() + } else { + emptyMap() + } val tracingData: List = patientTasksPairs @@ -262,15 +271,16 @@ constructor( val from = currentPage * PaginationConstant.DEFAULT_PAGE_SIZE val to = from + PaginationConstant.DEFAULT_PAGE_SIZE tracingData.safeSubList(from..to) - } else tracingData + } else { + tracingData + } } override suspend fun loadRegisterData( currentPage: Int, loadAll: Boolean, - appFeatureName: String? + appFeatureName: String?, ): List { - val tracingPatients = fhirEngine.search { has(Task.SUBJECT) { filtersForValidTask() } } @@ -284,7 +294,9 @@ constructor( val from = currentPage * PaginationConstant.DEFAULT_PAGE_SIZE val to = from + PaginationConstant.DEFAULT_PAGE_SIZE it.safeSubList(from..to) - } else it + } else { + it + } } } @@ -292,8 +304,9 @@ constructor( val patient = defaultRepository.loadResource(resourceId) return patient?.let { val metaCodingSystemTag = - configurationRegistry.retrieveConfiguration( - AppConfigClassification.APPLICATION + configurationRegistry + .retrieveConfiguration( + AppConfigClassification.APPLICATION, ) .patientTypeFilterTagViaMetaCodingSystem val tasks = validTasks(patient) @@ -327,7 +340,7 @@ constructor( practitioners = patient.practitioners(), currentAttempt = attempt.copy( - reasons = tasks.mapNotNull { task -> task.reasonCode?.codingFirstRep?.display } + reasons = tasks.mapNotNull { task -> task.reasonCode?.codingFirstRep?.display }, ), ) } @@ -349,10 +362,11 @@ constructor( } suspend fun Patient.activeCarePlans() = - defaultRepository.searchResourceFor( + defaultRepository + .searchResourceFor( subjectId = this.logicalId, subjectType = ResourceType.Patient, - subjectParam = CarePlan.SUBJECT + subjectParam = CarePlan.SUBJECT, ) .filter { carePlan -> carePlan.status.equals(CarePlan.CarePlanStatus.ACTIVE) } @@ -378,23 +392,23 @@ constructor( .filter { (it.other.referenceElement.resourceType == ResourceType.RelatedPerson.name).or( it.type == Patient.LinkType.REFER && - it.other.referenceElement.resourceType == ResourceType.Patient.name + it.other.referenceElement.resourceType == ResourceType.Patient.name, ) } .map { defaultRepository.loadResource(it.other) } override suspend fun countRegisterFiltered( appFeatureName: String?, - filters: RegisterFilter + filters: RegisterFilter, ): Long { return searchRegister(filters, loadAll = true).count().toLong() } override suspend fun countRegisterData(appFeatureName: String?): Long { val patients = - fhirEngine.search { has(Task.SUBJECT) { filtersForValidTask() } }.map { - it.resource - } + fhirEngine + .search { has(Task.SUBJECT) { filtersForValidTask() } } + .map { it.resource } return patients.count { validTasks(it).any() }.toLong() } @@ -412,8 +426,7 @@ constructor( return patientTasks.filter { it.status in listOf(Task.TaskStatus.INPROGRESS, Task.TaskStatus.READY) && it.executionPeriod.hasStart() && - it.executionPeriod - .start + it.executionPeriod.start .before(Date()) .or(it.executionPeriod.start.asDdMmmYyyy() == Date().asDdMmmYyyy()) } @@ -421,7 +434,7 @@ constructor( private suspend fun Patient.toTracingRegisterData( tasks: Iterable, - listResource: ListResource? + listResource: ListResource?, ): RegisterData.TracingRegisterData { val attempt = tracingRepository @@ -437,14 +450,14 @@ constructor( familyName = this.extractFamilyName(), healthStatus = this.extractHealthStatusFromMeta( - applicationConfiguration().patientTypeFilterTagViaMetaCodingSystem + applicationConfiguration().patientTypeFilterTagViaMetaCodingSystem, ), isPregnant = defaultRepository.isPatientPregnant(this), isBreastfeeding = defaultRepository.isPatientBreastfeeding(this), attempts = attempt.numberOfAttempts, lastAttemptDate = attempt.lastAttempt, firstAdded = oldestTaskDate, - reasons = attempt.reasons + reasons = attempt.reasons, ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/tracing/TracingRepository.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/tracing/TracingRepository.kt index 117126d82f..676ec5408c 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/tracing/TracingRepository.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/tracing/TracingRepository.kt @@ -44,7 +44,7 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { suspend fun getTracingHistory( currentPage: Int, loadAll: Boolean, - patientId: String + patientId: String, ): List { val list = fhirEngine.search { @@ -54,17 +54,19 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { from = currentPage * PaginationConstant.DEFAULT_PAGE_SIZE } - return list.map { it.resource }.map { - val data = getTracingHistoryFromList(it) + return list + .map { it.resource } + .map { + val data = getTracingHistoryFromList(it) - TracingHistory( - historyId = data.historyId, - startDate = data.startDate, - endDate = data.endDate, - numberOfAttempts = data.numberOfAttempts, - isActive = data.isActive - ) - } + TracingHistory( + historyId = data.historyId, + startDate = data.startDate, + endDate = data.endDate, + numberOfAttempts = data.numberOfAttempts, + isActive = data.isActive, + ) + } } suspend fun getTracingOutcomes(currentPage: Int, historyId: String): List { @@ -92,7 +94,9 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { val fromIndex: Int = ((currentPage + 1) - 1) * pageSize if (size <= fromIndex) { mutableListOf() - } else subList(fromIndex, (fromIndex + pageSize).coerceAtMost(this.size)) + } else { + subList(fromIndex, (fromIndex + pageSize).coerceAtMost(this.size)) + } } var phoneTracingCounter = 1 @@ -153,7 +157,7 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { value = of(CodeableConcept(Coding("https://d-tree.org", "tracing-outcome-unconducted", ""))) }, - operation = Operation.OR + operation = Operation.OR, ) } outcomeObs @@ -182,9 +186,9 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { Coding( "https://d-tree.org", "phone-tracing-outcome-date-of-agreed-appointment", - "" - ) - ) + "", + ), + ), ) }, { @@ -194,12 +198,12 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { Coding( "https://d-tree.org", "home-tracing-outcome-date-of-agreed-appointment", - "" - ) - ) + "", + ), + ), ) }, - operation = Operation.OR + operation = Operation.OR, ) } dateObs @@ -245,7 +249,7 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { lastAttempt = null, numberOfAttempts = 0, outcome = "", - reasons = listOf() + reasons = listOf(), ) } @@ -256,14 +260,13 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { lastAttempt = null, numberOfAttempts = 0, outcome = "", - reasons = listOf() + reasons = listOf(), ) } private suspend fun toTracingAttempt(list: ListResource): TracingAttempt { var lastAttempt: Encounter? = null - list - .entry + list.entry .map { it.item } .filter { it.referenceElement.resourceType == ResourceType.Encounter.name } .forEach { ref -> @@ -289,8 +292,8 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { Coding().apply { system = "https://d-tree.org" code = "tracing-outcome-conducted" - } - ) + }, + ), ) }, { @@ -300,11 +303,11 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { Coding().apply { system = "https://d-tree.org" code = "tracing-outcome-unconducted" - } - ) + }, + ), ) }, - operation = Operation.OR + operation = Operation.OR, ) count = 1 } @@ -315,21 +318,19 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { ?.map { it.resource } ?.firstOrNull { it.hasValueCodeableConcept() } ?.valueCodeableConcept - ?.text - ?: "" + ?.text ?: "" val attempts = - list.orderedBy.coding.filter { coding -> coding.code.all { it.isDigit() } }.maxOfOrNull { - it.code.toInt() - } - ?: list.title.substringAfterLast("_").toIntOrNull() ?: 0 + list.orderedBy.coding + .filter { coding -> coding.code.all { it.isDigit() } } + .maxOfOrNull { it.code.toInt() } ?: list.title.substringAfterLast("_").toIntOrNull() ?: 0 return TracingAttempt( numberOfAttempts = attempts, lastAttempt = lastAttempt?.period?.start, outcome = outcome, reasons = listOf(), - historyId = list.logicalId + historyId = list.logicalId, ) } @@ -349,7 +350,6 @@ class TracingRepository @Inject constructor(val fhirEngine: FhirEngine) { resource.reasonCode?.codingFirstRep?.display?.let { reasons.add(it) } tasks.add(resource) } else if (resource is Encounter) { - if (lastAttempt == null) { lastAttempt = resource } else if (lastAttempt?.period?.start != null) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/auth/OAuthService.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/auth/OAuthService.kt index 8e54545d91..d5c90173be 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/auth/OAuthService.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/auth/OAuthService.kt @@ -35,6 +35,6 @@ interface OAuthService { suspend fun logout( @Field("client_id") clientId: String, @Field("client_secret") clientSecret: String, - @Field("refresh_token") refreshToken: String + @Field("refresh_token") refreshToken: String, ): Response } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceConverter.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceConverter.kt index 216a7bbaeb..e2b33fe610 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceConverter.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceConverter.kt @@ -28,7 +28,7 @@ class FhirConverterFactory(private val parser: IParser) : Converter.Factory() { override fun responseBodyConverter( type: Type, annotations: Array, - retrofit: Retrofit + retrofit: Retrofit, ): Converter { return FhirConverter(parser) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceDataSource.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceDataSource.kt index 6d1c4d5be8..9d7af750cc 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceDataSource.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceDataSource.kt @@ -38,7 +38,7 @@ class FhirResourceDataSource @Inject constructor(private val resourceService: Fh return resourceService.insertResource( resourceType, resourceId, - payload.toRequestBody("application/fhir+json".toMediaType()) + payload.toRequestBody("application/fhir+json".toMediaType()), ) } @@ -46,7 +46,7 @@ class FhirResourceDataSource @Inject constructor(private val resourceService: Fh return resourceService.updateResource( resourceType, resourceId, - payload.toRequestBody("application/json-patch+json".toMediaType()) + payload.toRequestBody("application/json-patch+json".toMediaType()), ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceService.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceService.kt index c7a90b5c30..7e67681b67 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceService.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceService.kt @@ -41,20 +41,20 @@ interface FhirResourceService { suspend fun insertResource( @Path("resourceType") resourceType: String, @Path("id") id: String, - @Body body: RequestBody + @Body body: RequestBody, ): Resource @PATCH("{resourceType}/{id}") suspend fun updateResource( @Path("resourceType") resourceType: String, @Path("id") id: String, - @Body body: RequestBody + @Body body: RequestBody, ): OperationOutcome @DELETE("{resourceType}/{id}") suspend fun deleteResource( @Path("resourceType") resourceType: String, - @Path("id") id: String + @Path("id") id: String, ): OperationOutcome @GET fun fetchImage(@Url url: String): Call @@ -62,6 +62,6 @@ interface FhirResourceService { @GET("{resourceType}/_search") suspend fun searchResource( @Path("resourceType") resourceType: String, - @QueryMap(encoded = false) searchParameters: Map + @QueryMap(encoded = false) searchParameters: Map, ): Bundle } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/model/response/OAuthResponse.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/model/response/OAuthResponse.kt index ddbf9e6638..320fc4f019 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/model/response/OAuthResponse.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/model/response/OAuthResponse.kt @@ -24,5 +24,5 @@ data class OAuthResponse( @SerializedName("refresh_token") var refreshToken: String? = null, @SerializedName("refresh_expires_in") var refreshExpiresIn: Int? = null, @SerializedName("expires_in") var expiresIn: Int? = null, - @SerializedName("scope") var scope: String? = null + @SerializedName("scope") var scope: String? = null, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/model/response/UserInfo.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/model/response/UserInfo.kt index e0e57682aa..c8fd2736c4 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/model/response/UserInfo.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/model/response/UserInfo.kt @@ -24,5 +24,5 @@ data class UserInfo( @SerialName("questionnaire_publisher") var questionnairePublisher: String? = null, @SerialName("organization") var organization: String? = null, @SerialName("location") var location: String? = null, - @SerialName("sub") var keycloakUuid: String? = null + @SerialName("sub") var keycloakUuid: String? = null, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/shared/TokenAuthenticator.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/shared/TokenAuthenticator.kt index 8bd001e867..669fe4512b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/shared/TokenAuthenticator.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/remote/shared/TokenAuthenticator.kt @@ -59,7 +59,7 @@ constructor( val oAuthService: OAuthService, val dispatcherProvider: DispatcherProvider, val accountManager: AccountManager, - @ApplicationContext val context: Context + @ApplicationContext val context: Context, ) : FhirAuthenticator { private val jwtParser = Jwts.parser() @@ -87,12 +87,14 @@ constructor( Handler(Looper.getMainLooper()) { message: Message -> Timber.e(message.toString()) true - } + }, ) authResultFuture.result } catch (exception: Exception) { when (exception) { - is OperationCanceledException, is AuthenticatorException, is IOException -> { + is OperationCanceledException, + is AuthenticatorException, + is IOException, -> { // TODO: Should we cancel the sync job to avoid retries when offline? Timber.e(exception) bundleOf(AccountManager.KEY_AUTHTOKEN to accessToken) @@ -100,32 +102,34 @@ constructor( else -> bundleOf() } } - return if (authResultBundle.containsKey(AccountManager.KEY_AUTHTOKEN)) + return if (authResultBundle.containsKey(AccountManager.KEY_AUTHTOKEN)) { authResultBundle.getString(AccountManager.KEY_AUTHTOKEN)!! - else "" + } else { + "" + } } private fun AccountManager.handleAccountManagerFutureCallback(account: Account?) = - { result: AccountManagerFuture -> - val bundle = result.result - when { - bundle.containsKey(AccountManager.KEY_AUTHTOKEN) -> { - val token = bundle.getString(AccountManager.KEY_AUTHTOKEN) - setAuthToken(account, AUTH_TOKEN_TYPE, token) - } - bundle.containsKey(AccountManager.KEY_INTENT) -> { - val launchIntent = bundle.get(AccountManager.KEY_INTENT) as? Intent + { result: AccountManagerFuture -> + val bundle = result.result + when { + bundle.containsKey(AccountManager.KEY_AUTHTOKEN) -> { + val token = bundle.getString(AccountManager.KEY_AUTHTOKEN) + setAuthToken(account, AUTH_TOKEN_TYPE, token) + } + bundle.containsKey(AccountManager.KEY_INTENT) -> { + val launchIntent = bundle.get(AccountManager.KEY_INTENT) as? Intent - // Deletes session PIN to allow reset - secureSharedPreference.deleteSessionPin() + // Deletes session PIN to allow reset + secureSharedPreference.deleteSessionPin() - if (launchIntent != null && !isLoginPageRendered) { - context.startActivity(launchIntent.putExtra(CANCEL_BACKGROUND_SYNC, true)) - isLoginPageRendered = true + if (launchIntent != null && !isLoginPageRendered) { + context.startActivity(launchIntent.putExtra(CANCEL_BACKGROUND_SYNC, true)) + isLoginPageRendered = true + } } } } - } /** This function checks if token is null or empty or expired */ fun isTokenActive(authToken: String?): Boolean { @@ -144,7 +148,7 @@ constructor( GRANT_TYPE to grantType, CLIENT_ID to authConfiguration.clientId, CLIENT_SECRET to authConfiguration.clientSecret, - SCOPE to authConfiguration.scope + SCOPE to authConfiguration.scope, ) /** @@ -179,13 +183,13 @@ constructor( oAuthService.logout( clientId = authConfiguration.clientId, clientSecret = authConfiguration.clientSecret, - refreshToken = accountManager.getPassword(account) + refreshToken = accountManager.getPassword(account), ) if (responseBody.isSuccessful) { accountManager.invalidateAuthToken( account.type, - accountManager.peekAuthToken(account, AUTH_TOKEN_TYPE) + accountManager.peekAuthToken(account, AUTH_TOKEN_TYPE), ) Result.success(true) } else Result.success(false) @@ -227,7 +231,7 @@ constructor( return runBlocking { val oAuthResponse = oAuthService.fetchToken( - buildOAuthPayload(REFRESH_TOKEN).apply { put(REFRESH_TOKEN, currentRefreshToken) } + buildOAuthPayload(REFRESH_TOKEN).apply { put(REFRESH_TOKEN, currentRefreshToken) }, ) // Updates with new refresh-token @@ -244,7 +248,9 @@ constructor( val generatedHash = enteredPassword.toPasswordHash(Base64.getDecoder().decode(credentials!!.salt)) generatedHash == credentials.passwordHash - } else false + } else { + false + } } fun getAccountType(): String = authConfiguration.accountType diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/CoreModule.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/CoreModule.kt index 1e7a50b407..911cc434fa 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/CoreModule.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/CoreModule.kt @@ -53,7 +53,7 @@ class CoreModule { fhirEngine: FhirEngine, tracer: PerformanceReporter, tokenAuthenticator: TokenAuthenticator, - sharedPreferencesHelper: SharedPreferencesHelper + sharedPreferencesHelper: SharedPreferencesHelper, ) = SyncBroadcaster( configurationRegistry = configurationRegistry, @@ -62,7 +62,7 @@ class CoreModule { appContext = context, tracer = tracer, tokenAuthenticator = tokenAuthenticator, - sharedPreferencesHelper = sharedPreferencesHelper + sharedPreferencesHelper = sharedPreferencesHelper, ) @Singleton @@ -89,6 +89,6 @@ class CoreModule { fun providePatientDao( fhirEngine: FhirEngine, defaultRepository: DefaultRepository, - configurationRegistry: ConfigurationRegistry + configurationRegistry: ConfigurationRegistry, ): PatientDao = HivRegisterDao(fhirEngine, defaultRepository, configurationRegistry) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/DispatcherModule.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/DispatcherModule.kt index c36c515075..7641a894ce 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/DispatcherModule.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/DispatcherModule.kt @@ -29,6 +29,6 @@ abstract class DispatcherModule { @Binds abstract fun bindDefaultDispatcherProvider( - defaultDispatcherProvider: DefaultDispatcherProvider + defaultDispatcherProvider: DefaultDispatcherProvider, ): DispatcherProvider } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/FhirEngineModule.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/FhirEngineModule.kt index 1dec4acc15..1d68df1212 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/FhirEngineModule.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/FhirEngineModule.kt @@ -46,7 +46,7 @@ class FhirEngineModule { fun provideFhirEngine( @ApplicationContext context: Context, tokenAuthenticator: TokenAuthenticator, - configService: ConfigService + configService: ConfigService, ): FhirEngine { FhirEngineProvider.init( FhirEngineConfiguration( @@ -56,9 +56,9 @@ class FhirEngineModule { baseUrl = configService.provideAuthConfiguration().fhirServerBaseUrl, authenticator = tokenAuthenticator, networkConfiguration = - NetworkConfiguration(TIMEOUT_DURATION, TIMEOUT_DURATION, TIMEOUT_DURATION) - ) - ) + NetworkConfiguration(TIMEOUT_DURATION, TIMEOUT_DURATION, TIMEOUT_DURATION), + ), + ), ) return FhirEngineProvider.getInstance(context) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/NetworkModule.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/NetworkModule.kt index f2b3572999..6d54003bfd 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/NetworkModule.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/NetworkModule.kt @@ -56,7 +56,7 @@ class NetworkModule { level = HttpLoggingInterceptor.Level.BASIC redactHeader(AUTHORIZATION) redactHeader(COOKIE) - } + }, ) .connectTimeout(TIMEOUT_DURATION, TimeUnit.SECONDS) .readTimeout(TIMEOUT_DURATION, TimeUnit.SECONDS) @@ -76,14 +76,14 @@ class NetworkModule { request.addHeader(AUTHORIZATION, "Bearer $accessToken") } chain.proceed(request.build()) - } + }, ) .addInterceptor( HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BASIC redactHeader(AUTHORIZATION) redactHeader(COOKIE) - } + }, ) .connectTimeout(TIMEOUT_DURATION, TimeUnit.SECONDS) .readTimeout(TIMEOUT_DURATION, TimeUnit.SECONDS) @@ -109,7 +109,7 @@ class NetworkModule { fun provideAuthRetrofit( @NoAuthorizationOkHttpClientQualifier okHttpClient: OkHttpClient, configService: ConfigService, - gson: Gson + gson: Gson, ): Retrofit = Retrofit.Builder() .baseUrl(configService.provideAuthConfiguration().oauthServerBaseUrl) @@ -123,7 +123,7 @@ class NetworkModule { fun provideKeycloakRetrofit( @WithAuthorizationOkHttpClientQualifier okHttpClient: OkHttpClient, configService: ConfigService, - json: Json + json: Json, ): Retrofit = Retrofit.Builder() .baseUrl(configService.provideAuthConfiguration().oauthServerBaseUrl) @@ -137,7 +137,7 @@ class NetworkModule { @WithAuthorizationOkHttpClientQualifier okHttpClient: OkHttpClient, configService: ConfigService, gson: Gson, - parser: IParser + parser: IParser, ): Retrofit = Retrofit.Builder() .baseUrl(configService.provideAuthConfiguration().fhirServerBaseUrl) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/FamilyMemberProfileData.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/FamilyMemberProfileData.kt index e5d8413064..faee2dac74 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/FamilyMemberProfileData.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/FamilyMemberProfileData.kt @@ -36,5 +36,5 @@ data class FamilyMemberProfileData( val conditions: List = listOf(), val flags: List = listOf(), val services: List = listOf(), - val tasks: List = listOf() + val tasks: List = listOf(), ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/HealthStatus.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/HealthStatus.kt index 5ec59a508a..2bedd198e7 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/HealthStatus.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/HealthStatus.kt @@ -51,7 +51,8 @@ enum class HealthStatus(var display: String = "") { }, DEFAULT { override fun priority(): StatusPriority = Int.MAX_VALUE - }; + }, + ; abstract fun priority(): StatusPriority diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/OverflowMenuItem.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/OverflowMenuItem.kt index be760e8c0d..d9598a32ba 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/OverflowMenuItem.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/OverflowMenuItem.kt @@ -22,7 +22,7 @@ data class OverflowMenuItem( val id: Int, val titleResource: Int, val confirmAction: Boolean = false, - val titleColor: Color = Color.Black.copy(alpha = 0.7f) + val titleColor: Color = Color.Black.copy(alpha = 0.7f), ) { var hidden: Boolean = false } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/ProfileData.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/ProfileData.kt index 878feb8d22..c6fc01934b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/ProfileData.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/ProfileData.kt @@ -49,7 +49,7 @@ sealed class ProfileData(open val logicalId: String, open val name: String) { val tasks: List = listOf(), val visits: List = listOf(), val forms: List = listOf(), - val responses: List = listOf() + val responses: List = listOf(), ) : ProfileData(logicalId = logicalId, name = name) data class FamilyProfileData( @@ -61,7 +61,7 @@ sealed class ProfileData(open val logicalId: String, open val name: String) { val head: FamilyMemberProfileData? = null, val members: List, val services: List = listOf(), - val tasks: List = listOf() + val tasks: List = listOf(), ) : ProfileData(logicalId = logicalId, name = name) data class AncProfileData( @@ -77,7 +77,7 @@ sealed class ProfileData(open val logicalId: String, open val name: String) { val flags: List = listOf(), val services: List = listOf(), val tasks: List = listOf(), - val visits: List = listOf() + val visits: List = listOf(), ) : ProfileData(logicalId = logicalId, name = name) data class HivProfileData( @@ -103,7 +103,7 @@ sealed class ProfileData(open val logicalId: String, open val name: String) { val otherPatients: List = listOf(), val guardians: List = emptyList(), val observations: List = emptyList(), - val practitioners: List = emptyList() + val practitioners: List = emptyList(), ) : ProfileData(logicalId = logicalId, name = name) data class TracingProfileData( @@ -127,6 +127,6 @@ sealed class ProfileData(open val logicalId: String, open val name: String) { val showIdentifierInProfile: Boolean = false, val conditions: List = emptyList(), val guardians: List = emptyList(), - val practitioners: List = emptyList() + val practitioners: List = emptyList(), ) : ProfileData(logicalId = logicalId, name = name) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/RegisterData.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/RegisterData.kt index 5d29a4fe3f..d803cc4f57 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/RegisterData.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/RegisterData.kt @@ -25,7 +25,7 @@ sealed class RegisterData(open val logicalId: String, open val name: String) { override val logicalId: String, override val name: String, val gender: Enumerations.AdministrativeGender, - val age: String + val age: String, ) : RegisterData(logicalId = logicalId, name = name) data class FamilyRegisterData( @@ -37,7 +37,7 @@ sealed class RegisterData(open val logicalId: String, open val name: String) { val members: List = emptyList(), val servicesDue: Int? = null, val servicesOverdue: Int? = null, - val lastSeen: String? = null + val lastSeen: String? = null, ) : RegisterData(logicalId = logicalId, name = name) data class FamilyMemberRegisterData( @@ -51,7 +51,7 @@ sealed class RegisterData(open val logicalId: String, open val name: String) { val pregnant: Boolean = false, val deathDate: Date? = null, val servicesDue: Int? = null, - val servicesOverdue: Int? = null + val servicesOverdue: Int? = null, ) : RegisterData(logicalId = logicalId, name = name) data class AncRegisterData( @@ -64,7 +64,7 @@ sealed class RegisterData(open val logicalId: String, open val name: String) { val visitStatus: VisitStatus, val servicesDue: Int? = null, val servicesOverdue: Int? = null, - val familyName: String? = null + val familyName: String? = null, ) : RegisterData(logicalId = logicalId, name = name) data class HivRegisterData( @@ -108,6 +108,6 @@ sealed class RegisterData(open val logicalId: String, open val name: String) { val attempts: Int, val lastAttemptDate: Date? = null, val firstAdded: Date? = null, // date first assigned to tracing register - val reasons: List = emptyList() + val reasons: List = emptyList(), ) : RegisterData(logicalId = logicalId, name = name) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/SideMenuOption.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/SideMenuOption.kt index b5226b9254..2f2ae185f1 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/SideMenuOption.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/SideMenuOption.kt @@ -26,7 +26,7 @@ import org.smartregister.fhircore.engine.appfeature.model.HealthModule * @property titleResource Android translatable string resource used as the menu option title * @property count Gets the current count for the menu item. Default is 0 * @property showCount Show clients count against the menu option queries for resources other than - * Patient + * Patient */ @Stable data class SideMenuOption( diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/Tracing.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/Tracing.kt index 4e39d6a91c..9283613cf0 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/Tracing.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/Tracing.kt @@ -23,7 +23,7 @@ data class TracingHistory( val startDate: Date, val endDate: Date?, val isActive: Boolean, - val numberOfAttempts: Int + val numberOfAttempts: Int, ) data class TracingOutcome( diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/VisitStatus.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/VisitStatus.kt index 6373be2dc2..1b7cb20b78 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/VisitStatus.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/VisitStatus.kt @@ -19,5 +19,5 @@ package org.smartregister.fhircore.engine.domain.model enum class VisitStatus { DUE, OVERDUE, - PLANNED + PLANNED, } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/repository/RegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/repository/RegisterDao.kt index d40b9dc11e..3ee3ed14a2 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/repository/RegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/repository/RegisterDao.kt @@ -25,13 +25,13 @@ interface RegisterDao { suspend fun loadRegisterData( currentPage: Int, loadAll: Boolean = false, - appFeatureName: String? + appFeatureName: String?, ): List suspend fun searchByName( nameQuery: String, currentPage: Int, - appFeatureName: String? + appFeatureName: String?, ): List { TODO() } @@ -40,7 +40,7 @@ interface RegisterDao { currentPage: Int, loadAll: Boolean = false, appFeatureName: String? = null, - filters: RegisterFilter + filters: RegisterFilter, ): List { TODO("default") } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/repository/RegisterRepository.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/repository/RegisterRepository.kt index 3794cb7930..1999666ecc 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/repository/RegisterRepository.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/repository/RegisterRepository.kt @@ -27,7 +27,7 @@ interface RegisterRepository { currentPage: Int, loadAll: Boolean = false, appFeatureName: String? = null, - healthModule: HealthModule = HealthModule.DEFAULT + healthModule: HealthModule = HealthModule.DEFAULT, ): List suspend fun loadRegisterFiltered( @@ -35,29 +35,30 @@ interface RegisterRepository { loadAll: Boolean = false, appFeatureName: String? = null, healthModule: HealthModule, - filters: RegisterFilter + filters: RegisterFilter, ): List suspend fun countRegisterFiltered( appFeatureName: String? = null, healthModule: HealthModule, - filters: RegisterFilter + filters: RegisterFilter, ): Long + suspend fun countRegisterData( appFeatureName: String? = null, - healthModule: HealthModule = HealthModule.DEFAULT + healthModule: HealthModule = HealthModule.DEFAULT, ): Long suspend fun loadPatientProfileData( appFeatureName: String? = null, healthModule: HealthModule = HealthModule.DEFAULT, - patientId: String + patientId: String, ): ProfileData? suspend fun searchByName( nameQuery: String, currentPage: Int, appFeatureName: String?, - healthModule: HealthModule + healthModule: HealthModule, ): List } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/util/DataLoadState.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/util/DataLoadState.kt index b51004ee2f..2af1c9c171 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/util/DataLoadState.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/util/DataLoadState.kt @@ -18,6 +18,8 @@ package org.smartregister.fhircore.engine.domain.util sealed class DataLoadState { object Loading : DataLoadState() + data class Success(val data: T) : DataLoadState() + data class Error(val exception: Exception) : DataLoadState() } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/navigation/NavigationBottomSheet.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/navigation/NavigationBottomSheet.kt index 9bdd36ab79..d9dec602e1 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/navigation/NavigationBottomSheet.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/navigation/NavigationBottomSheet.kt @@ -33,7 +33,7 @@ class NavigationBottomSheet(private val itemListener: (String) -> Unit) : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { return ComposeView(requireContext()).apply { setContent { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/navigation/RegisterBottomSheetViews.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/navigation/RegisterBottomSheetViews.kt index ea605d0b8e..67fd52eb22 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/navigation/RegisterBottomSheetViews.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/navigation/RegisterBottomSheetViews.kt @@ -55,7 +55,7 @@ import org.smartregister.fhircore.engine.util.annotation.ExcludeFromJacocoGenera fun RegisterBottomSheet( registers: List, itemListener: (String) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Surface(shape = RoundedCornerShape(topStart = 8.dp, topEnd = 8.dp)) { Column(modifier = modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 16.dp)) { @@ -65,18 +65,20 @@ fun RegisterBottomSheet( fontWeight = FontWeight.Bold, fontSize = 22.sp, modifier = - modifier.padding(horizontal = 12.dp, vertical = 16.dp).align(Alignment.CenterHorizontally) + modifier + .padding(horizontal = 12.dp, vertical = 16.dp) + .align(Alignment.CenterHorizontally), ) LazyColumn( contentPadding = PaddingValues(vertical = 8.dp), - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { items( items = registers, itemContent = { RegisterListItem(it, itemListener) Divider(color = DividerColor, thickness = 1.dp) - } + }, ) } } @@ -87,11 +89,11 @@ fun RegisterBottomSheet( fun RegisterListItem( registerItem: RegisterItem, itemListener: (String) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( modifier = - modifier.fillMaxWidth().clickable { itemListener(registerItem.uniqueTag) }.padding(14.dp) + modifier.fillMaxWidth().clickable { itemListener(registerItem.uniqueTag) }.padding(14.dp), ) { Box(modifier = modifier.wrapContentWidth()) { if (registerItem.isSelected) { @@ -99,7 +101,7 @@ fun RegisterListItem( painter = painterResource(R.drawable.ic_green_tick), contentDescription = stringResource(id = R.string.tick), colorFilter = ColorFilter.tint(color = Color.Gray), - modifier = modifier.size(22.dp) + modifier = modifier.size(22.dp), ) } else { Spacer(modifier = modifier.width(20.dp)) @@ -115,7 +117,7 @@ fun RegisterListItem( fun RegisterListItemPreview() { RegisterListItem( registerItem = RegisterItem("TestFragmentTag", "All Clients", true), - itemListener = {} + itemListener = {}, ) } @@ -128,7 +130,7 @@ fun RegisterBottomSheetPreview() { registers = listOf( RegisterItem(uniqueTag = "TestFragmentTag", title = "All Clients"), - RegisterItem(uniqueTag = "TestFragmentTag2", title = "Families", isSelected = true) - ) + RegisterItem(uniqueTag = "TestFragmentTag2", title = "Families", isSelected = true), + ), ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/BaseP2PTransferDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/BaseP2PTransferDao.kt index 3486ded770..8eaaaff658 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/BaseP2PTransferDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/BaseP2PTransferDao.kt @@ -53,16 +53,16 @@ constructor(open val fhirEngine: FhirEngine, open val dispatcherProvider: Dispat open fun getDataTypes(): TreeSet = TreeSet( listOf( - ResourceType.Group, - ResourceType.Patient, - ResourceType.Questionnaire, - ResourceType.QuestionnaireResponse, - ResourceType.Observation, - ResourceType.Encounter - ) + ResourceType.Group, + ResourceType.Patient, + ResourceType.Questionnaire, + ResourceType.QuestionnaireResponse, + ResourceType.Observation, + ResourceType.Encounter, + ) .mapIndexed { index, resourceType -> DataType(name = resourceType.name, DataType.Filetype.JSON, index) - } + }, ) suspend fun addOrUpdate(resource: R) { @@ -82,7 +82,7 @@ constructor(open val fhirEngine: FhirEngine, open val dispatcherProvider: Dispat suspend fun loadResources( lastRecordUpdatedAt: Long, batchSize: Int, - classType: Class + classType: Class, ): List { return withContext(dispatcherProvider.io()) { // TODO FIX search order by _lastUpdated; SearchQuery no longer allowed in search API @@ -114,7 +114,7 @@ constructor(open val fhirEngine: FhirEngine, open val dispatcherProvider: Dispat { value = of(DateTimeType(Date(lastRecordUpdatedAt))) prefix = ParamPrefixEnum.GREATERTHAN - } + }, ) // sort(StringClientParam("_lastUpdated"), Order.ASCENDING) @@ -132,6 +132,6 @@ constructor(open val fhirEngine: FhirEngine, open val dispatcherProvider: Dispat ResourceType.Patient -> Patient::class.java ResourceType.Questionnaire -> Questionnaire::class.java ResourceType.QuestionnaireResponse -> QuestionnaireResponse::class.java - else -> null /*TODO support other resource types*/ + else -> null // TODO support other resource types } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/P2PReceiverTransferDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/P2PReceiverTransferDao.kt index 574175af02..12486ccd99 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/P2PReceiverTransferDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/P2PReceiverTransferDao.kt @@ -44,8 +44,11 @@ constructor(fhirEngine: FhirEngine, dispatcherProvider: DispatcherProvider) : jsonParser.parseResource(resourceClassType(type), jsonArray.get(it).toString()) addOrUpdate(resource = resource) maxLastUpdated = - (if (resource.meta.lastUpdated.time > maxLastUpdated) resource.meta.lastUpdated.time - else maxLastUpdated) + (if (resource.meta.lastUpdated.time > maxLastUpdated) { + resource.meta.lastUpdated.time + } else { + maxLastUpdated + }) Timber.e("Received ${resource.resourceType} with id = ${resource.logicalId}") } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/P2PSenderTransferDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/P2PSenderTransferDao.kt index d173f23ef6..3b4dcd677a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/P2PSenderTransferDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/p2p/dao/P2PSenderTransferDao.kt @@ -45,20 +45,25 @@ constructor(fhirEngine: FhirEngine, dispatcherProvider: DefaultDispatcherProvide resourceClassType(dataType)?.let { classType -> loadResources(lastRecordUpdatedAt = highestRecordId, batchSize = batchSize, classType) } - } - ?: listOf() + } ?: listOf() Timber.e("Fetching resources from base dao of type $dataType.name") highestRecordId = - (if (records.isNotEmpty()) records.last().meta?.lastUpdated?.time ?: highestRecordId - else lastUpdated) + (if (records.isNotEmpty()) { + records.last().meta?.lastUpdated?.time ?: highestRecordId + } else { + lastUpdated + }) val jsonArray = JSONArray() records.forEach { jsonArray.put(jsonParser.encodeResourceToString(it)) highestRecordId = - if (it.meta?.lastUpdated?.time!! > highestRecordId) it.meta?.lastUpdated?.time!! - else highestRecordId + if (it.meta?.lastUpdated?.time!! > highestRecordId) { + it.meta?.lastUpdated?.time!! + } else { + highestRecordId + } Timber.e("Sending ${it.resourceType} with id ====== ${it.logicalId}") } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/AppSyncWorker.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/AppSyncWorker.kt index 129fc52b51..b70ac41db4 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/AppSyncWorker.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/AppSyncWorker.kt @@ -38,7 +38,7 @@ constructor( @Assisted workerParams: WorkerParameters, private val syncListenerManager: SyncListenerManager, val engine: FhirEngine, - val dataStore: AppDataStore + val dataStore: AppDataStore, ) : FhirSyncWorker(appContext, workerParams) { override fun getConflictResolver(): ConflictResolver = AcceptLocalConflictResolver @@ -52,11 +52,12 @@ constructor( override suspend fun saveLastUpdatedTimestamp( resourceType: ResourceType, - timestamp: String? + timestamp: String?, ) { timestamp?.let { dataStore.saveLastUpdatedTimestamp(resourceType, timestamp) } } - } + }, ) + override fun getFhirEngine(): FhirEngine = engine } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/SyncBroadcaster.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/SyncBroadcaster.kt index 266f5e4a45..4bd1168d75 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/SyncBroadcaster.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/SyncBroadcaster.kt @@ -65,7 +65,7 @@ constructor( val tracer: PerformanceReporter, val sharedPreferencesHelper: SharedPreferencesHelper, val tokenAuthenticator: TokenAuthenticator, - @ApplicationContext val appContext: Context + @ApplicationContext val appContext: Context, ) { private inline fun getWorkerInfo(): Flow { @@ -91,7 +91,7 @@ constructor( val authFailResourceSyncException = ResourceSyncException( ResourceType.Flag, - Exception(appContext.getString(R.string.sync_authentication_error)) + Exception(appContext.getString(R.string.sync_authentication_error)), ) sharedSyncStatus.emit(SyncJobStatus.Failed(listOf(authFailResourceSyncException))) return@launch @@ -114,7 +114,8 @@ constructor( private fun traceSync(syncJobStatus: SyncJobStatus) { when (syncJobStatus) { - is SyncJobStatus.Failed, is SyncJobStatus.Finished -> { + is SyncJobStatus.Failed, + is SyncJobStatus.Finished, -> { tracer.putAttribute(SYNC_TRACE, SYNC_ATTR_RESULT, syncJobStatus::class.java.simpleName) tracer.stopTrace(SYNC_TRACE) } @@ -125,7 +126,7 @@ constructor( tracer.putAttribute( SYNC_TRACE, SYNC_ATTR_TYPE, - if (isInitialSync()) SYNC_ATTR_TYPE_INITIAL else SYNC_ATTR_TYPE_SUBSEQUENT + if (isInitialSync()) SYNC_ATTR_TYPE_INITIAL else SYNC_ATTR_TYPE_SUBSEQUENT, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/SyncListenerManager.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/SyncListenerManager.kt index 86367c97ad..f56046ed26 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/SyncListenerManager.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/sync/SyncListenerManager.kt @@ -52,7 +52,7 @@ constructor( private val syncConfig by lazy { configurationRegistry.retrieveConfiguration>( - AppConfigClassification.SYNC + AppConfigClassification.SYNC, ) } @@ -75,7 +75,7 @@ constructor( super.onStop(owner) deregisterSyncListener(onSyncListener) } - } + }, ) } @@ -85,8 +85,9 @@ constructor( */ fun deregisterSyncListener(onSyncListener: OnSyncListener) { val removed = _onSyncListeners.removeIf { it.get() == onSyncListener } - if (removed) + if (removed) { Timber.w("De-registered ${onSyncListener::class.simpleName} from receiving sync state...") + } } /** Retrieve registry sync params */ @@ -97,52 +98,55 @@ constructor( val appConfig = configurationRegistry.retrieveConfiguration( - AppConfigClassification.APPLICATION + AppConfigClassification.APPLICATION, ) // TODO Does not support nested parameters i.e. parameters.parameters... // TODO: expressionValue supports for Organization and Publisher literals for now - syncConfig.resource.parameter.map { it.resource as SearchParameter }.forEach { sp -> - val paramName = sp.name // e.g. organization - val paramLiteral = "#$paramName" // e.g. #organization in expression for replacement - val paramExpression = sp.expression - val expressionValue = - when (paramName) { - ConfigurationRegistry.ORGANIZATION -> authenticatedUserInfo?.organization - ConfigurationRegistry.PUBLISHER -> authenticatedUserInfo?.questionnairePublisher - ConfigurationRegistry.ID -> paramExpression - ConfigurationRegistry.COUNT -> appConfig.count - else -> null - }?.let { - // replace the evaluated value into expression for complex expressions - // e.g. #organization -> 123 - // e.g. patient.organization eq #organization -> patient.organization eq 123 - paramExpression.replace(paramLiteral, it) - } + syncConfig.resource.parameter + .map { it.resource as SearchParameter } + .forEach { sp -> + val paramName = sp.name // e.g. organization + val paramLiteral = "#$paramName" // e.g. #organization in expression for replacement + val paramExpression = sp.expression + val expressionValue = + when (paramName) { + ConfigurationRegistry.ORGANIZATION -> authenticatedUserInfo?.organization + ConfigurationRegistry.PUBLISHER -> authenticatedUserInfo?.questionnairePublisher + ConfigurationRegistry.ID -> paramExpression + ConfigurationRegistry.COUNT -> appConfig.count + else -> null + }?.let { + // replace the evaluated value into expression for complex expressions + // e.g. #organization -> 123 + // e.g. patient.organization eq #organization -> patient.organization eq 123 + paramExpression.replace(paramLiteral, it) + } - // for each entity in base create and add param map - // [Patient=[ name=Abc, organization=111 ], Encounter=[ type=MyType, location=MyHospital ],..] - sp.base.forEach { base -> - val resourceType = ResourceType.fromCode(base.code) - val pair = pairs.find { it.first == resourceType } - if (pair == null) { - pairs.add( - Pair( - resourceType, - expressionValue?.let { mapOf(sp.code to expressionValue) } ?: mapOf() + // for each entity in base create and add param map + // [Patient=[ name=Abc, organization=111 ], Encounter=[ type=MyType, location=MyHospital + // ],..] + sp.base.forEach { base -> + val resourceType = ResourceType.fromCode(base.code) + val pair = pairs.find { it.first == resourceType } + if (pair == null) { + pairs.add( + Pair( + resourceType, + expressionValue?.let { mapOf(sp.code to expressionValue) } ?: mapOf(), + ), ) - ) - } else { - expressionValue?.let { - // add another parameter if there is a matching resource type - // e.g. [(Patient, {organization=105})] to [(Patient, {organization=105, _count=100})] - val updatedPair = pair.second.toMutableMap().apply { put(sp.code, expressionValue) } - val index = pairs.indexOfFirst { it.first == resourceType } - pairs.set(index, Pair(resourceType, updatedPair)) + } else { + expressionValue?.let { + // add another parameter if there is a matching resource type + // e.g. [(Patient, {organization=105})] to [(Patient, {organization=105, _count=100})] + val updatedPair = pair.second.toMutableMap().apply { put(sp.code, expressionValue) } + val index = pairs.indexOfFirst { it.first == resourceType } + pairs.set(index, Pair(resourceType, updatedPair)) + } } } } - } Timber.i("SYNC CONFIG $pairs") diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirCarePlanGenerator.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirCarePlanGenerator.kt index 3b04445850..ff32b04017 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirCarePlanGenerator.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirCarePlanGenerator.kt @@ -53,7 +53,7 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS suspend fun generateCarePlan( planDefinitionId: String, subject: Resource, - data: Bundle? = null + data: Bundle? = null, ): CarePlan? { return generateCarePlan(fhirEngine.get(planDefinitionId), subject, data) } @@ -61,7 +61,7 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS suspend fun generateCarePlan( planDefinition: PlanDefinition, subject: Resource, - data: Bundle? = null + data: Bundle? = null, ): CarePlan? { val output = CarePlan().apply { @@ -72,16 +72,19 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS planDefinition.action.forEach { action -> val input = Bundle().apply { entry.addAll(data?.entry ?: listOf()) } - if (action.condition.all { - if (it.kind != PlanDefinition.ActionConditionKind.APPLICABILITY) + if ( + action.condition.all { + if (it.kind != PlanDefinition.ActionConditionKind.APPLICABILITY) { throw UnsupportedOperationException( - "PlanDefinition.action.kind=${it.kind} not supported" + "PlanDefinition.action.kind=${it.kind} not supported", ) + } - if (it.expression.language != Expression.ExpressionLanguage.TEXT_FHIRPATH.toCode()) + if (it.expression.language != Expression.ExpressionLanguage.TEXT_FHIRPATH.toCode()) { throw UnsupportedOperationException( - "PlanDefinition.expression.language=${it.expression.language} not supported" + "PlanDefinition.expression.language=${it.expression.language} not supported", ) + } fhirPathEngine.evaluateToBoolean(input, null, subject, it.expression.expression) } @@ -92,7 +95,7 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS Parameters.ParametersParameterComponent().apply { this.name = CarePlan.SP_SUBJECT this.resource = subject - } + }, ) addParameter( @@ -100,7 +103,7 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS this.name = PlanDefinition.SP_DEFINITION this.resource = planDefinition.contained.first { it.id == action.definitionCanonicalType.value } - } + }, ) } @@ -109,22 +112,24 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS transformSupportServices.simpleWorkerContext, source, structureMap, - output + output, ) } } if (!output.hasActivity()) return null - return output.also { Timber.d(it.encodeResourceToString()) }.also { careplan -> - // save embedded resources inside as independent entries, clear embedded and save careplan - val dependents = careplan.contained.map { it.copy() } + return output + .also { Timber.d(it.encodeResourceToString()) } + .also { careplan -> + // save embedded resources inside as independent entries, clear embedded and save careplan + val dependents = careplan.contained.map { it.copy() } - careplan.contained.clear() - fhirEngine.create(careplan) + careplan.contained.clear() + fhirEngine.create(careplan) - dependents.forEach { fhirEngine.create(it) } - } + dependents.forEach { fhirEngine.create(it) } + } } suspend fun completeTask(id: String, encounterStatus: EncounterStatus?) { @@ -137,9 +142,8 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS update(task) if (task.status == Task.TaskStatus.COMPLETED) { val carePlans = - search { filter(CarePlan.SUBJECT, { value = task.`for`.reference }) }.map { - it.resource - } + search { filter(CarePlan.SUBJECT, { value = task.`for`.reference }) } + .map { it.resource } var carePlanToUpdate: CarePlan? = null carePlans.forEach { carePlan -> for ((index, value) in carePlan.activity.withIndex()) { @@ -170,7 +174,7 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS EncounterStatus.INPROGRESS, EncounterStatus.CANCELLED, EncounterStatus.ENTEREDINERROR, - EncounterStatus.NULL -> Task.TaskStatus.fromCode(encounterStatus.toCode()) + EncounterStatus.NULL, -> Task.TaskStatus.fromCode(encounterStatus.toCode()) else -> Task.TaskStatus.COMPLETED } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirTaskPlanWorker.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirTaskPlanWorker.kt index ee1fd7a118..8f322eb992 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirTaskPlanWorker.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirTaskPlanWorker.kt @@ -40,7 +40,7 @@ class FhirTaskPlanWorker constructor( @Assisted val appContext: Context, @Assisted workerParams: WorkerParameters, - val fhirEngine: FhirEngine + val fhirEngine: FhirEngine, ) : CoroutineWorker(appContext, workerParams) { override suspend fun doWork(): Result { @@ -66,15 +66,14 @@ constructor( Task.TaskStatus.READY, Task.TaskStatus.ACCEPTED, Task.TaskStatus.INPROGRESS, - Task.TaskStatus.RECEIVED + Task.TaskStatus.RECEIVED, ) } .forEach { task -> if (task.hasPastEnd()) { task.status = Task.TaskStatus.FAILED fhirEngine.update(task) - task - .basedOn + task.basedOn .find { it.reference.startsWith(ResourceType.CarePlan.name) } ?.extractId() ?.takeIf { it.isNotBlank() } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/WelcomeServiceBackToCarePlanWorker.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/WelcomeServiceBackToCarePlanWorker.kt index 9fe096e2b6..5affbb9e6f 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/WelcomeServiceBackToCarePlanWorker.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/WelcomeServiceBackToCarePlanWorker.kt @@ -52,7 +52,7 @@ class WelcomeServiceBackToCarePlanWorker constructor( @Assisted val appContext: Context, @Assisted workerParameters: WorkerParameters, - val fhirEngine: FhirEngine + val fhirEngine: FhirEngine, ) : CoroutineWorker(appContext, workerParameters) { override suspend fun doWork(): Result { @@ -81,14 +81,14 @@ constructor( Task.STATUS, { value = of(Task.TaskStatus.READY.toCode()) }, { value = of(Task.TaskStatus.INPROGRESS.toCode()) }, - operation = Operation.OR + operation = Operation.OR, ) filter( Task.PERIOD, { value = of(DateTimeType.now()) prefix = ParamPrefixEnum.GREATERTHAN - } + }, ) } .map { it.resource } @@ -96,47 +96,48 @@ constructor( .filter { it.status in listOf(Task.TaskStatus.INPROGRESS, Task.TaskStatus.READY) && it.executionPeriod.hasStart() && - it.executionPeriod - .start + it.executionPeriod.start .before(Date()) .or(it.executionPeriod.start.asDdMmmYyyy() == Date().asDdMmmYyyy()) } - interruptedTreatmentTasks.groupBy { it.`for`.reference }.forEach { (t, u) -> - val patientId = IdType(t).idPart - val patient = fhirEngine.get(patientId) - val carePlan = patient.activeCarePlan() ?: return@forEach - val carePlanHasWelcomeService = - carePlan.activity.any { act -> - act.detail.code.coding.any { it.code == WELCOME_SERVICE_QUESTIONNAIRE_ID } - } - if (carePlanHasWelcomeService) return@forEach + interruptedTreatmentTasks + .groupBy { it.`for`.reference } + .forEach { (t, u) -> + val patientId = IdType(t).idPart + val patient = fhirEngine.get(patientId) + val carePlan = patient.activeCarePlan() ?: return@forEach + val carePlanHasWelcomeService = + carePlan.activity.any { act -> + act.detail.code.coding.any { it.code == WELCOME_SERVICE_QUESTIONNAIRE_ID } + } + if (carePlanHasWelcomeService) return@forEach - carePlan.apply { - val taskId = UUID.randomUUID().toString() - val taskDescription = "Welcome Service" + carePlan.apply { + val taskId = UUID.randomUUID().toString() + val taskDescription = "Welcome Service" - val task = welcomeServiceTask(taskId, taskDescription, patient) - addActivity().apply { - addOutcomeReference(task.asReference().apply { display = taskDescription }) + val task = welcomeServiceTask(taskId, taskDescription, patient) + addActivity().apply { + addOutcomeReference(task.asReference().apply { display = taskDescription }) - detail = - CarePlan.CarePlanActivityDetailComponent().apply { - status = CarePlan.CarePlanActivityStatus.INPROGRESS - kind = CarePlan.CarePlanActivityKind.TASK - description = taskDescription - code = - CodeableConcept( - Coding("https://d-tree.org", WELCOME_SERVICE_QUESTIONNAIRE_ID, taskDescription) - ) - scheduled = period.copy().apply { start = DateTimeType.now().value } - addPerformer(author) - } + detail = + CarePlan.CarePlanActivityDetailComponent().apply { + status = CarePlan.CarePlanActivityStatus.INPROGRESS + kind = CarePlan.CarePlanActivityKind.TASK + description = taskDescription + code = + CodeableConcept( + Coding("https://d-tree.org", WELCOME_SERVICE_QUESTIONNAIRE_ID, taskDescription), + ) + scheduled = period.copy().apply { start = DateTimeType.now().value } + addPerformer(author) + } + } + fhirEngine.create(task) + fhirEngine.update(this) } - fhirEngine.create(task) - fhirEngine.update(this) } - } } private suspend fun Patient.activeCarePlan() = @@ -163,7 +164,7 @@ constructor( phoneTracingCoding, homeTracingCoding, phoneTracingCoding.copy().apply { system = "http://snomed.info/sct" }, - homeTracingCoding.copy().apply { system = "http://snomed.info/sct" } + homeTracingCoding.copy().apply { system = "http://snomed.info/sct" }, ) } } @@ -171,7 +172,7 @@ constructor( internal fun CarePlan.welcomeServiceTask( taskId: String, taskDescription: String, - patient: Patient + patient: Patient, ) = Task().apply { status = Task.TaskStatus.READY @@ -189,7 +190,7 @@ internal fun CarePlan.welcomeServiceTask( Identifier().apply { value = taskId use = Identifier.IdentifierUse.OFFICIAL - } + }, ) id = taskId meta = @@ -198,7 +199,7 @@ internal fun CarePlan.welcomeServiceTask( Coding().apply { system = "https://d-tree.org" code = "clinic-visit-task-order-11" - } + }, ) reasonReference = Reference().apply { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingActivity.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingActivity.kt index 509fda8048..0b2774114f 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingActivity.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingActivity.kt @@ -43,8 +43,11 @@ import org.smartregister.fhircore.engine.util.extension.showToast class AppSettingActivity : AppCompatActivity() { @Inject lateinit var accountAuthenticator: AccountAuthenticator + @Inject lateinit var sharedPreferencesHelper: SharedPreferencesHelper + @Inject lateinit var dispatcherProvider: DispatcherProvider + @Inject lateinit var libraryEvaluatorProvider: Provider private val appSettingViewModel: AppSettingViewModel by viewModels() @@ -78,7 +81,7 @@ class AppSettingActivity : AppCompatActivity() { onAppIdChanged = appSettingViewModel::onApplicationIdChanged, fetchConfiguration = appSettingViewModel::fetchConfigurations, showProgressBar = showProgressBar, - error = error + error = error, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingScreen.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingScreen.kt index 561353702d..cd15ffe60e 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingScreen.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingScreen.kt @@ -87,19 +87,19 @@ fun AppSettingScreen( Column(modifier = modifier.fillMaxSize()) { Column( verticalArrangement = Arrangement.Center, - modifier = modifier.weight(1f).padding(horizontal = 20.dp) + modifier = modifier.weight(1f).padding(horizontal = 20.dp), ) { Text( text = stringResource(R.string.fhir_core_app), fontWeight = FontWeight.Bold, textAlign = TextAlign.Center, fontSize = 32.sp, - modifier = modifier.padding(vertical = 8.dp).align(Alignment.CenterHorizontally) + modifier = modifier.padding(vertical = 8.dp).align(Alignment.CenterHorizontally), ) Spacer(modifier = modifier.height(80.dp)) Text( text = stringResource(R.string.application_id), - modifier = modifier.padding(vertical = 4.dp) + modifier = modifier.padding(vertical = 4.dp), ) OutlinedTextField( onValueChange = onAppIdChanged, @@ -120,9 +120,9 @@ fun AppSettingScreen( .onFocusEvent { event -> if (event.isFocused) coroutineScope.launch { bringIntoViewRequester.bringIntoView() } } - .focusRequester(focusRequester) + .focusRequester(focusRequester), ) - if (error.isNotEmpty()) + if (error.isNotEmpty()) { Text( fontSize = 14.sp, color = MaterialTheme.colors.error, @@ -132,12 +132,13 @@ fun AppSettingScreen( .wrapContentWidth() .padding(vertical = 10.dp) .align(Alignment.Start) - .testTag(LOGIN_ERROR_TEXT_TAG) + .testTag(LOGIN_ERROR_TEXT_TAG), ) + } Spacer(modifier = modifier.height(30.dp)) Box( contentAlignment = Alignment.Center, - modifier = modifier.bringIntoViewRequester(bringIntoViewRequester).fillMaxWidth() + modifier = modifier.bringIntoViewRequester(bringIntoViewRequester).fillMaxWidth(), ) { Button( onClick = { fetchConfiguration(context) }, @@ -146,20 +147,20 @@ fun AppSettingScreen( colors = ButtonDefaults.buttonColors( disabledContentColor = Color.Gray, - contentColor = Color.White + contentColor = Color.White, ), - elevation = null + elevation = null, ) { Text( text = if (!showProgressBar) stringResource(id = R.string.load_configurations) else "", - modifier = modifier.padding(8.dp) + modifier = modifier.padding(8.dp), ) } if (showProgressBar) { CircularProgressIndicator( modifier = modifier.align(Alignment.Center).size(18.dp), strokeWidth = 1.6.dp, - color = Color.White + color = Color.White, ) } } @@ -181,7 +182,7 @@ private fun AppSettingScreenWithErrorPreview() { onAppIdChanged = {}, fetchConfiguration = {}, appVersionPair = Pair(1, "0.0.1"), - error = "Application not found" + error = "Application not found", ) } @@ -193,6 +194,6 @@ private fun AppSettingScreenWithNoErrorPreview() { onAppIdChanged = {}, fetchConfiguration = {}, appVersionPair = Pair(1, "0.0.1"), - error = "" + error = "", ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingViewModel.kt index 47948d8044..f1b3376b9f 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingViewModel.kt @@ -51,7 +51,7 @@ constructor( val defaultRepository: DefaultRepository, val sharedPreferencesHelper: SharedPreferencesHelper, val configurationRegistry: ConfigurationRegistry, - val dispatcherProvider: DispatcherProvider + val dispatcherProvider: DispatcherProvider, ) : ViewModel() { private val _appId = MutableLiveData("") @@ -113,8 +113,7 @@ constructor( val composition = data.resource as Composition defaultRepository.save(composition) - composition - .section + composition.section .groupBy { it.focus.reference.split("/")[0] } .entries .filter { it.key == ResourceType.Binary.name || it.key == ResourceType.Parameters.name } @@ -132,9 +131,9 @@ constructor( _error.postValue(context.getString(R.string.error_loading_config_no_internet)) showProgressBar.postValue(false) } catch (httpException: HttpException) { - if ((400..503).contains(httpException.response()!!.code())) + if ((400..503).contains(httpException.response()!!.code())) { _error.postValue(context.getString(R.string.error_loading_config_general)) - else _error.postValue(context.getString(R.string.error_loading_config_http_error)) + } else _error.postValue(context.getString(R.string.error_loading_config_http_error)) showProgressBar.postValue(false) } catch (e: Exception) { _error.postValue(context.getString(R.string.error_loading_config_http_error)) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/AlertDialogue.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/AlertDialogue.kt index b89fb96b8e..d4fd423c7d 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/AlertDialogue.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/AlertDialogue.kt @@ -36,7 +36,7 @@ enum class AlertIntent { PROGRESS, CONFIRM, ERROR, - INFO + INFO, } data class AlertDialogListItem(val key: String, val value: String) @@ -47,8 +47,11 @@ object AlertDialogue { fun AlertDialog.getSingleChoiceSelectedKey() = getSingleChoiceSelectedItem()?.key fun AlertDialog.getSingleChoiceSelectedItem() = - if (this.listView.checkedItemCount != 1) null - else getListItems()!![this.listView.checkedItemPosition] + if (this.listView.checkedItemCount != 1) { + null + } else { + getListItems()!![this.listView.checkedItemPosition] + } fun AlertDialog.getListItems() = this.ownerActivity?.intent?.getSerializableExtra(ITEMS_LIST_KEY) as Array? @@ -62,7 +65,7 @@ object AlertDialogue { @StringRes confirmButtonText: Int = R.string.questionnaire_alert_confirm_button_title, neutralButtonListener: ((d: DialogInterface) -> Unit)? = null, @StringRes neutralButtonText: Int = R.string.questionnaire_alert_neutral_button_title, - options: Array? = null + options: Array? = null, ): AlertDialog { val dialog = AlertDialog.Builder(context) @@ -103,7 +106,7 @@ object AlertDialogue { message: String, title: String? = null, confirmButtonListener: ((d: DialogInterface) -> Unit) = { d -> d.dismiss() }, - @StringRes confirmButtonText: Int = R.string.questionnaire_alert_ack_button_title + @StringRes confirmButtonText: Int = R.string.questionnaire_alert_ack_button_title, ): AlertDialog { return showAlert( context = context, @@ -111,7 +114,7 @@ object AlertDialogue { message = message, title = title, confirmButtonListener = confirmButtonListener, - confirmButtonText = confirmButtonText + confirmButtonText = confirmButtonText, ) } @@ -122,19 +125,19 @@ object AlertDialogue { message = message, title = title, confirmButtonListener = { d -> d.dismiss() }, - confirmButtonText = R.string.questionnaire_alert_ack_button_title + confirmButtonText = R.string.questionnaire_alert_ack_button_title, ) } fun showErrorAlert( context: Activity, @StringRes message: Int, - @StringRes title: Int? = null + @StringRes title: Int? = null, ): AlertDialog { return showErrorAlert( context = context, message = context.getString(message), - title = title?.let { context.getString(it) } + title = title?.let { context.getString(it) }, ) } @@ -148,7 +151,7 @@ object AlertDialogue { @StringRes title: Int? = null, confirmButtonListener: ((d: DialogInterface) -> Unit), @StringRes confirmButtonText: Int, - options: List? = null + options: List? = null, ): AlertDialog { return showAlert( context = context, @@ -159,7 +162,7 @@ object AlertDialogue { confirmButtonText = confirmButtonText, neutralButtonListener = { d -> d.dismiss() }, neutralButtonText = R.string.questionnaire_alert_neutral_button_title, - options = options?.toTypedArray() + options = options?.toTypedArray(), ) } @@ -173,8 +176,11 @@ object AlertDialogue { dangerActionColor: Boolean = true, ): DatePickerDialog { val dateDialog = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) DatePickerDialog(context) - else DatePickerDialog(context, null, default.year, default.month, default.date) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + DatePickerDialog(context) + } else { + DatePickerDialog(context, null, default.year, default.month, default.date) + } dateDialog.apply { max?.let { this.datePicker.maxDate = it.time } @@ -188,7 +194,7 @@ object AlertDialogue { TextView(context).apply { this.text = it this.setPadding(20) - } + }, ) } @@ -203,10 +209,11 @@ object AlertDialogue { dateDialog.create() - if (dangerActionColor) + if (dangerActionColor) { dateDialog .getButton(DialogInterface.BUTTON_POSITIVE) .setTextColor(context.resources.getColor(R.color.colorError)) + } dateDialog.show() diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseMultiLanguageActivity.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseMultiLanguageActivity.kt index 1de01f9f96..685d002b4e 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseMultiLanguageActivity.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseMultiLanguageActivity.kt @@ -59,7 +59,7 @@ abstract class BaseMultiLanguageActivity : AppCompatActivity() { */ protected open fun inject() { throw UnsupportedOperationException( - "Annotate $this with @AndroidEntryPoint annotation. The inject method should be overridden by the Hilt generated class." + "Annotate $this with @AndroidEntryPoint annotation. The inject method should be overridden by the Hilt generated class.", ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseRecyclerListViewAdapter.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseRecyclerListViewAdapter.kt index 2ec780a3cf..53d2f3a06f 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseRecyclerListViewAdapter.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/base/BaseRecyclerListViewAdapter.kt @@ -25,21 +25,20 @@ import org.smartregister.fhircore.engine.util.ListenerIntent /** * Subclass of [ListAdapter] that is used to provide an adapter class for the RecyclerView. * - * @property onItemClicked Listener called when a row item is clicked. As many elements of the row - * can be clicked, [ListenerIntent] is used to differentiate the actions to be performed. - * Additionally, [Data] is passed when the listener is called. when implementing - * [onCreateViewHolder] remember to bind the data to the view as tag for ease of use. - * * @param dataDiffCallback Subclass of [DataDiffCallback] that is used to compare list row [Data] + * @property onItemClicked Listener called when a row item is clicked. As many elements of the row + * can be clicked, [ListenerIntent] is used to differentiate the actions to be performed. + * Additionally, [Data] is passed when the listener is called. when implementing + * [onCreateViewHolder] remember to bind the data to the view as tag for ease of use. */ abstract class BaseRecyclerListViewAdapter( val onItemClicked: (ListenerIntent, Data) -> Unit, - val dataDiffCallback: DataDiffCallback + val dataDiffCallback: DataDiffCallback, ) : ListAdapter>(dataDiffCallback) { abstract override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int + viewType: Int, ): BaseRecyclerViewHolder override fun onBindViewHolder(holder: BaseRecyclerViewHolder, position: Int) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/CircularPercentageIndicator.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/CircularPercentageIndicator.kt index 967964dac9..58b0d1d5be 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/CircularPercentageIndicator.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/CircularPercentageIndicator.kt @@ -60,7 +60,7 @@ fun CircularPercentageIndicator( .clip(CircleShape) .background(Color.Transparent) .testTag(CIRCULAR_PERCENTAGE_INDICATOR), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Canvas( onDraw = { @@ -68,7 +68,7 @@ fun CircularPercentageIndicator( Brush.linearGradient(colors = listOf(Color.LightGray, Color.LightGray)), radius = size.width / 2, center = center, - style = Stroke(width = size.width * 0.075f) + style = Stroke(width = size.width * 0.075f), ) }, modifier = modifier.fillMaxSize().testTag(CIRCULAR_CANVAS_CIRCLE_TAG), @@ -77,7 +77,7 @@ fun CircularPercentageIndicator( progress = percentage.toFloat() / 100, modifier = modifier.fillMaxSize(), strokeWidth = 2.4.dp, - color = ProgressBarBlueColor + color = ProgressBarBlueColor, ) Text( text = @@ -88,7 +88,7 @@ fun CircularPercentageIndicator( append(stringResource(R.string.percentage)) }, textAlign = TextAlign.Center, - modifier = Modifier.testTag(CIRCULAR_PERCENTAGE_TEXT_TAG) + modifier = Modifier.testTag(CIRCULAR_PERCENTAGE_TEXT_TAG), ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/CircularProgressBar.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/CircularProgressBar.kt index 0d85ceb17a..cd93b8f264 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/CircularProgressBar.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/CircularProgressBar.kt @@ -38,7 +38,7 @@ fun CircularProgressBar(modifier: Modifier = Modifier, text: String? = null) { Column( modifier = modifier.testTag(CIRCULAR_PROGRESS_BAR).padding(8.dp), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { CircularProgressIndicator(modifier = modifier.size(28.dp), strokeWidth = 2.4.dp) if (text != null) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/EmptyState.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/EmptyState.kt index 27ef29779e..013afa33cd 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/EmptyState.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/EmptyState.kt @@ -33,7 +33,7 @@ import androidx.compose.ui.unit.sp fun EmptyState(message: String, modifier: Modifier = Modifier) { Column( modifier = modifier.padding(16.dp).fillMaxWidth(), - verticalArrangement = Arrangement.Center + verticalArrangement = Arrangement.Center, ) { Text( text = message, @@ -43,7 +43,7 @@ fun EmptyState(message: String, modifier: Modifier = Modifier) { modifier .padding(vertical = 8.dp) .align(Alignment.CenterHorizontally) - .testTag(ERROR_MESSAGE_TAG) + .testTag(ERROR_MESSAGE_TAG), ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/ErrorMessage.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/ErrorMessage.kt index 48b5dc1e94..846057fc77 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/ErrorMessage.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/ErrorMessage.kt @@ -41,7 +41,7 @@ const val TRY_BUTTON_TAG = "tryButtonTag" fun ErrorMessage(message: String, modifier: Modifier = Modifier, onClickRetry: () -> Unit) { Column( modifier = modifier.padding(16.dp).fillMaxWidth(), - verticalArrangement = Arrangement.Center + verticalArrangement = Arrangement.Center, ) { Text( text = message, @@ -52,12 +52,14 @@ fun ErrorMessage(message: String, modifier: Modifier = Modifier, onClickRetry: ( modifier .padding(vertical = 8.dp) .align(Alignment.CenterHorizontally) - .testTag(ERROR_MESSAGE_TAG) + .testTag(ERROR_MESSAGE_TAG), ) OutlinedButton( onClick = onClickRetry, - modifier = modifier.align(Alignment.CenterHorizontally).testTag(TRY_BUTTON_TAG) - ) { Text(text = stringResource(R.string.try_again)) } + modifier = modifier.align(Alignment.CenterHorizontally).testTag(TRY_BUTTON_TAG), + ) { + Text(text = stringResource(R.string.try_again)) + } } } @@ -68,6 +70,6 @@ fun ErrorMessagePreview() { ErrorMessage( message = "Received result from worker com.google.android.fhir.sync.Result@6e1206f and sending output Data", - onClickRetry = {} + onClickRetry = {}, ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/FormButton.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/FormButton.kt index 647700aa69..6d4c98e7e8 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/FormButton.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/FormButton.kt @@ -38,19 +38,20 @@ import org.smartregister.fhircore.engine.domain.model.FormButtonData fun FormButton( formButtonData: FormButtonData, modifier: Modifier = Modifier, - onFormClick: (String, String?) -> Unit + onFormClick: (String, String?) -> Unit, ) { OutlinedButton( onClick = { - if (formButtonData.questionnaireId != null) + if (formButtonData.questionnaireId != null) { onFormClick(formButtonData.questionnaireId, formButtonData.backReference?.reference) + } }, colors = ButtonDefaults.buttonColors( backgroundColor = formButtonData.color.copy(alpha = 0.1f), - contentColor = formButtonData.color.copy(alpha = 0.9f) + contentColor = formButtonData.color.copy(alpha = 0.9f), ), - modifier = modifier.fillMaxWidth().padding(top = 0.dp, start = 16.dp, end = 16.dp) + modifier = modifier.fillMaxWidth().padding(top = 0.dp, start = 16.dp, end = 16.dp), ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon(imageVector = Icons.Filled.Add, contentDescription = null) @@ -65,23 +66,23 @@ fun PatientFormPreview() { Column { FormButton( formButtonData = FormButtonData("Household survey", "182912"), - onFormClick = { _, _ -> } + onFormClick = { _, _ -> }, ) FormButton( formButtonData = FormButtonData("Bednet distribution", "182212"), - onFormClick = { _, _ -> } + onFormClick = { _, _ -> }, ) FormButton( formButtonData = FormButtonData("Malaria diagnosis", "181212"), - onFormClick = { _, _ -> } + onFormClick = { _, _ -> }, ) FormButton( formButtonData = FormButtonData("Medicine treatment", "171212"), - onFormClick = { _, _ -> } + onFormClick = { _, _ -> }, ) FormButton( formButtonData = FormButtonData("G6PD test result", "171219"), - onFormClick = { _, _ -> } + onFormClick = { _, _ -> }, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/LoadingIndicator.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/LoadingIndicator.kt index b135074d0e..b578afe27e 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/LoadingIndicator.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/LoadingIndicator.kt @@ -33,6 +33,6 @@ fun LoadingIndicator() { Modifier.testTag("ProgressBarItem") .fillMaxWidth() .padding(16.dp) - .wrapContentWidth(Alignment.CenterHorizontally) + .wrapContentWidth(Alignment.CenterHorizontally), ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/PaginatedRegisterViews.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/PaginatedRegisterViews.kt index fc384ab717..0f409f8b12 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/PaginatedRegisterViews.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/PaginatedRegisterViews.kt @@ -56,7 +56,7 @@ fun PaginatedRegister( previousButtonClickListener: () -> Unit, nextButtonClickListener: () -> Unit, modifier: Modifier = Modifier, - maxHeight: Float = DEFAULT_MAX_HEIGHT + maxHeight: Float = DEFAULT_MAX_HEIGHT, ) { val bottomPadding = if (showFooter) 48.dp else 0.dp ConstraintLayout(modifier = Modifier.fillMaxWidth().fillMaxHeight(maxHeight)) { @@ -68,7 +68,7 @@ fun PaginatedRegister( start.linkTo(parent.start) top.linkTo(parent.top) end.linkTo(parent.end) - } + }, ) { if (showHeader) { if (showResultsCount) { @@ -77,7 +77,7 @@ fun PaginatedRegister( } Box( contentAlignment = Alignment.TopCenter, - modifier = modifier.fillMaxSize().padding(bottom = bottomPadding) + modifier = modifier.fillMaxSize().padding(bottom = bottomPadding), ) { if (loadState == LoadState.Loading) { CircularProgressBar() @@ -98,7 +98,7 @@ fun PaginatedRegister( currentPage = currentPage, pagesCount = pagesCount, previousButtonClickListener = previousButtonClickListener, - nextButtonClickListener = nextButtonClickListener + nextButtonClickListener = nextButtonClickListener, ) } } @@ -138,7 +138,7 @@ fun PaginatedRegisterPreviewWithoutResults() { currentPage = 0, pagesCount = DEFAULT_MAX_PAGE_COUNT, previousButtonClickListener = {}, - nextButtonClickListener = {} + nextButtonClickListener = {}, ) } @@ -156,6 +156,6 @@ fun PaginatedRegisterPreviewWithoutHeaderAndFooter() { currentPage = 0, pagesCount = DEFAULT_MAX_PAGE_COUNT, previousButtonClickListener = {}, - nextButtonClickListener = {} + nextButtonClickListener = {}, ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/PinView.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/PinView.kt index c0e68a6e4c..3907b92342 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/PinView.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/PinView.kt @@ -77,7 +77,7 @@ fun PinView( inputPin: String = "", isDotted: Boolean = false, showError: Boolean = false, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val (editValue, setEditValue) = remember { mutableStateOf(inputPin) } val pinLength = remember { pinInputLength } @@ -97,14 +97,15 @@ fun PinView( } }, keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number), - modifier = Modifier.size(0.dp).focusRequester(focusRequester).testTag(PIN_VIEW_INPUT_TEXT_FIELD) + modifier = + Modifier.size(0.dp).focusRequester(focusRequester).testTag(PIN_VIEW_INPUT_TEXT_FIELD), ) Row( modifier = Modifier.fillMaxWidth() .testTag(PIN_VIEW) .background(color = colorResource(id = R.color.cardview_light_background)), - horizontalArrangement = Arrangement.Center + horizontalArrangement = Arrangement.Center, ) { (0 until pinLength).map { index -> PinCell( @@ -118,7 +119,7 @@ fun PinView( isCursorVisible = editValue.length == index, isDotted = isDotted, showError = showError, - focusRequester = focusRequester + focusRequester = focusRequester, ) Spacer(modifier = Modifier.size(8.dp)) } @@ -133,7 +134,7 @@ fun PinCell( isCursorVisible: Boolean = false, isDotted: Boolean = false, showError: Boolean = false, - focusRequester: FocusRequester = FocusRequester() + focusRequester: FocusRequester = FocusRequester(), ) { val scope = rememberCoroutineScope() val (cursorSymbol, setCursorSymbol) = remember { mutableStateOf("") } @@ -185,7 +186,7 @@ fun PinCell( elevation = 1.dp, shape = RoundedCornerShape(cardRoundedCornerRadius), border = BorderStroke(width = 1.dp, color = borderColor), - backgroundColor = backgroundColor + backgroundColor = backgroundColor, ) { var iModifier = Modifier.wrapContentSize().align(Alignment.Center).testTag(textTestTag) if (indexValue.isEmpty() && isCursorVisible) { @@ -199,7 +200,7 @@ fun PinCell( text = if (isCursorVisible) cursorSymbol else textValue, fontSize = textSize, style = MaterialTheme.typography.body1, - modifier = iModifier + modifier = iModifier, ) if (indexValue.isEmpty() && isCursorVisible) { LaunchedEffect(indexValue.isEmpty() && isCursorVisible) { focusRequester.requestFocus() } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/Separator.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/Separator.kt index 36a3dda42d..bf4c2c193c 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/Separator.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/Separator.kt @@ -41,7 +41,7 @@ fun Separator(modifier: Modifier = Modifier, showSeparator: Boolean = true) { .testTag(SEPARATOR_TAG) .clip(CircleShape) .size(2.6.dp) - .background(color = SubtitleTextColor) + .background(color = SubtitleTextColor), ) Spacer(modifier = modifier.width(4.dp)) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/LoaderView.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/LoaderView.kt index e9ed7954dd..79d5217570 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/LoaderView.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/LoaderView.kt @@ -54,7 +54,7 @@ const val LOADER_DIALOG_SYNC_PROGRESS_STATE_TEXT_TAG = "loaderDialogSyncProgress fun LoaderDialog( modifier: Modifier = Modifier, dialogMessage: String = stringResource(id = R.string.syncing), - syncProgressStateFlow: StateFlow = MutableStateFlow("") + syncProgressStateFlow: StateFlow = MutableStateFlow(""), ) { val openDialog = remember { mutableStateOf(true) } val syncProgressState = syncProgressStateFlow.collectAsState() @@ -63,22 +63,22 @@ fun LoaderDialog( if (openDialog.value) { Dialog( onDismissRequest = { openDialog.value = true }, - properties = DialogProperties(dismissOnBackPress = true) + properties = DialogProperties(dismissOnBackPress = true), ) { Box(Modifier.size(240.dp, 180.dp)) { Column( modifier = modifier.padding(8.dp), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Surface( color = Color.Black.copy(alpha = 0.56f), modifier = modifier.fillMaxSize(), - shape = RoundedCornerShape(8) + shape = RoundedCornerShape(8), ) { Column( verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { CircularProgressIndicator( color = Color.White, @@ -90,7 +90,7 @@ fun LoaderDialog( text = dialogMessage, style = MaterialTheme.typography.h5, color = Color.White, - modifier = modifier.testTag(LOADER_DIALOG_PROGRESS_MSG_TAG).padding(8.dp) + modifier = modifier.testTag(LOADER_DIALOG_PROGRESS_MSG_TAG).padding(8.dp), ) if (syncProgressStateText.isNotBlank()) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/NoResultsView.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/NoResultsView.kt index cbff19387c..b20dd2d0c8 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/NoResultsView.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/NoResultsView.kt @@ -36,19 +36,19 @@ import org.smartregister.fhircore.engine.util.annotation.ExcludeFromJacocoGenera fun NoResults(modifier: Modifier = Modifier) { Column( verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Text( fontWeight = FontWeight.Bold, text = stringResource(R.string.no_results), modifier = modifier.padding(8.dp), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) Text( color = GreyTextColor, text = stringResource(id = R.string.no_results_message), modifier = modifier.padding(8.dp), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/RegisterFooter.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/RegisterFooter.kt index e76f3b900b..2fe5a9291f 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/RegisterFooter.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/RegisterFooter.kt @@ -51,9 +51,9 @@ fun RegisterFooter( pagesCount: Int, previousButtonClickListener: () -> Unit, nextButtonClickListener: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { - if (resultCount > 0) + if (resultCount > 0) { Row(modifier = modifier.fillMaxWidth().testTag(SEARCH_FOOTER_TAG)) { Box( modifier = modifier.weight(1f).padding(4.dp).wrapContentWidth(Alignment.Start), @@ -61,11 +61,11 @@ fun RegisterFooter( if (currentPage > 1) { TextButton( onClick = previousButtonClickListener, - modifier = modifier.testTag(SEARCH_FOOTER_PREVIOUS_BUTTON_TAG) + modifier = modifier.testTag(SEARCH_FOOTER_PREVIOUS_BUTTON_TAG), ) { Icon( painter = painterResource(id = R.drawable.ic_chevron_left), - contentDescription = stringResource(R.string.str_next) + contentDescription = stringResource(R.string.str_next), ) Text( fontSize = 14.sp, @@ -83,7 +83,7 @@ fun RegisterFooter( modifier .testTag(SEARCH_FOOTER_PAGINATION_TAG) .padding(4.dp) - .align(Alignment.CenterVertically) + .align(Alignment.CenterVertically), ) Box( modifier = modifier.weight(1f).padding(4.dp).wrapContentWidth(Alignment.End), @@ -91,7 +91,7 @@ fun RegisterFooter( if (currentPage < pagesCount) { TextButton( onClick = nextButtonClickListener, - modifier = modifier.testTag(SEARCH_FOOTER_NEXT_BUTTON_TAG) + modifier = modifier.testTag(SEARCH_FOOTER_NEXT_BUTTON_TAG), ) { Text( fontSize = 14.sp, @@ -100,12 +100,13 @@ fun RegisterFooter( ) Icon( painter = painterResource(id = R.drawable.ic_chevron_right), - contentDescription = stringResource(R.string.str_next) + contentDescription = stringResource(R.string.str_next), ) } } } } + } } @Composable diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/RegisterHeader.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/RegisterHeader.kt index 177e698d03..b63470c2c2 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/RegisterHeader.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/components/register/RegisterHeader.kt @@ -44,7 +44,7 @@ fun RegisterHeader(modifier: Modifier = Modifier, resultCount: Int) { modifier .testTag(SEARCH_HEADER_TEXT_TAG) .padding(horizontal = 16.dp, vertical = 8.dp) - .fillMaxWidth() + .fillMaxWidth(), ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginActivity.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginActivity.kt index ffaf85c762..0ee201157f 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginActivity.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginActivity.kt @@ -63,7 +63,8 @@ class LoginActivity : setContent { AppTheme { LoginScreen(loginViewModel = loginViewModel) } } - if (!intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME).isNullOrBlank() && + if ( + !intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME).isNullOrBlank() && loginViewModel.username.value.isNullOrBlank() ) { loginViewModel.onUsernameUpdated(intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)!!) @@ -77,7 +78,6 @@ class LoginActivity : loadLastLoggedInUsername() navigateToHome.observe(this@LoginActivity) { isNavigate -> if (isNavigate) { - val isUpdatingCurrentAccount = intent.hasExtra(AccountManager.KEY_ACCOUNT_NAME) && intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)!!.trim() == diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginError.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginError.kt index 17c27995cd..70ad358b3c 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginError.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginError.kt @@ -22,5 +22,5 @@ import kotlinx.serialization.Serializable @Serializable data class LoginError( val error: String = "", - @SerialName("error_description") val errorDescription: String = "Error logging in" + @SerialName("error_description") val errorDescription: String = "Error logging in", ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginErrorState.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginErrorState.kt index 367031938c..5a0066b527 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginErrorState.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginErrorState.kt @@ -20,5 +20,5 @@ enum class LoginErrorState { UNKNOWN_HOST, INVALID_CREDENTIALS, MULTI_USER_LOGIN_ATTEMPT, - ERROR_FETCHING_USER + ERROR_FETCHING_USER, } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginScreen.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginScreen.kt index b11e0511a8..c061f32894 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginScreen.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginScreen.kt @@ -101,10 +101,10 @@ const val APP_LOGO_TAG = "appLogoTag" @OptIn(ExperimentalAnimationApi::class) @Composable fun LoginScreen(loginViewModel: LoginViewModel) { - - val viewConfiguration by loginViewModel.loginViewConfiguration.observeAsState( - loginViewConfigurationOf() - ) + val viewConfiguration by + loginViewModel.loginViewConfiguration.observeAsState( + loginViewConfigurationOf(), + ) val loadingConfig by loginViewModel.loadingConfig.observeAsState(true) val username by loginViewModel.username.observeAsState("") val password by loginViewModel.password.observeAsState("") @@ -161,12 +161,12 @@ fun LoginPage( .fillMaxSize() .scrollable(orientation = Orientation.Vertical, state = rememberScrollState()), color = backgroundColor, - contentColor = contentColorFor(backgroundColor = contentColor) + contentColor = contentColorFor(backgroundColor = contentColor), ) { if (showForgotPasswordDialog) { ForgotPasswordDialog( forgotPassword = forgotPassword, - onDismissDialog = { showForgotPasswordDialog = false } + onDismissDialog = { showForgotPasswordDialog = false }, ) } Column( @@ -200,13 +200,13 @@ fun LoginPage( .wrapContentWidth() .padding(vertical = 8.dp) .align(Alignment.CenterHorizontally) - .testTag(APP_NAME_TEXT_TAG) + .testTag(APP_NAME_TEXT_TAG), ) Spacer(modifier = modifier.height(40.dp)) Text( text = stringResource(R.string.username), color = contentColor, - modifier = modifier.padding(vertical = 8.dp) + modifier = modifier.padding(vertical = 8.dp), ) OutlinedTextField( colors = TextFieldDefaults.outlinedTextFieldColors(textColor = contentColor), @@ -226,13 +226,13 @@ fun LoginPage( .padding(vertical = 4.dp) .background(color = textFieldBackgroundColor) .testTag(USERNAME_FIELD_TAG), - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next) + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), ) Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = modifier.fillMaxWidth()) { Text( text = stringResource(R.string.password), color = contentColor, - modifier = modifier.wrapContentWidth().padding(vertical = 8.dp) + modifier = modifier.wrapContentWidth().padding(vertical = 8.dp), ) Text( text = stringResource(R.string.forgot_password), @@ -241,7 +241,7 @@ fun LoginPage( modifier = modifier.wrapContentWidth().padding(vertical = 8.dp).clickable { showForgotPasswordDialog = !showForgotPasswordDialog - } + }, ) } OutlinedTextField( @@ -272,7 +272,7 @@ fun LoginPage( IconButton(onClick = { showPassword = !showPassword }) { Icon(imageVector = image, "", tint = contentColor) } - } + }, ) Spacer(modifier = modifier.height(10.dp)) Text( @@ -283,23 +283,23 @@ fun LoginPage( LoginErrorState.UNKNOWN_HOST -> stringResource( id = R.string.login_error, - stringResource(R.string.login_call_fail_error_message) + stringResource(R.string.login_call_fail_error_message), ) LoginErrorState.INVALID_CREDENTIALS -> stringResource( id = R.string.login_error, - stringResource(R.string.invalid_login_credentials) + stringResource(R.string.invalid_login_credentials), ) null -> "" LoginErrorState.MULTI_USER_LOGIN_ATTEMPT -> stringResource( id = R.string.login_error, - stringResource(R.string.multi_user_login_attempt) + stringResource(R.string.multi_user_login_attempt), ) LoginErrorState.ERROR_FETCHING_USER -> stringResource( id = R.string.login_error, - stringResource(R.string.error_fetching_user_details) + stringResource(R.string.error_fetching_user_details), ) }, modifier = @@ -307,7 +307,7 @@ fun LoginPage( .wrapContentWidth() .padding(0.dp) .align(Alignment.Start) - .testTag(LOGIN_ERROR_TEXT_TAG) + .testTag(LOGIN_ERROR_TEXT_TAG), ) Spacer(modifier = modifier.height(30.dp)) Box(contentAlignment = Alignment.Center, modifier = modifier.fillMaxWidth()) { @@ -317,15 +317,15 @@ fun LoginPage( ButtonDefaults.buttonColors( backgroundColor = LoginButtonColor, disabledBackgroundColor = - if (viewConfiguration.darkMode) LoginFieldBackgroundColor else Color.LightGray + if (viewConfiguration.darkMode) LoginFieldBackgroundColor else Color.LightGray, ), onClick = onLoginButtonClicked, - modifier = modifier.fillMaxWidth().testTag(LOGIN_BUTTON_TAG) + modifier = modifier.fillMaxWidth().testTag(LOGIN_BUTTON_TAG), ) { Text( color = Color.White, text = stringResource(id = R.string.login_text), - modifier = modifier.padding(8.dp) + modifier = modifier.padding(8.dp), ) } if (showProgressBar) { @@ -336,25 +336,25 @@ fun LoginPage( Row( horizontalArrangement = Arrangement.SpaceBetween, modifier = modifier.fillMaxWidth().padding(vertical = 20.dp), - verticalAlignment = Alignment.Bottom + verticalAlignment = Alignment.Bottom, ) { Column { Text( color = contentColor, text = stringResource(id = R.string.powered_by), - modifier = modifier.wrapContentWidth().padding(vertical = 8.dp).align(Alignment.Start) + modifier = modifier.wrapContentWidth().padding(vertical = 8.dp).align(Alignment.Start), ) Image( painter = painterResource(id = R.drawable.ic_opensrp_logo), contentDescription = stringResource(id = R.string.app_logo), - modifier = modifier.align(Alignment.CenterHorizontally).requiredHeight(40.dp) + modifier = modifier.align(Alignment.CenterHorizontally).requiredHeight(40.dp), ) } Text( color = contentColor, fontSize = 16.sp, text = stringResource(id = R.string.app_version, versionCode, versionName), - modifier = modifier.wrapContentWidth().padding(0.dp).testTag(LOGIN_FOOTER) + modifier = modifier.wrapContentWidth().padding(0.dp).testTag(LOGIN_FOOTER), ) } } @@ -365,7 +365,7 @@ fun LoginPage( fun ForgotPasswordDialog( forgotPassword: () -> Unit, onDismissDialog: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { AlertDialog( onDismissRequest = onDismissDialog, @@ -373,7 +373,7 @@ fun ForgotPasswordDialog( Text( text = stringResource(R.string.forgot_password_title), fontWeight = FontWeight.Bold, - fontSize = 18.sp + fontSize = 18.sp, ) }, text = { @@ -382,11 +382,11 @@ fun ForgotPasswordDialog( buttons = { Row( modifier = modifier.fillMaxWidth().padding(vertical = 20.dp), - horizontalArrangement = Arrangement.End + horizontalArrangement = Arrangement.End, ) { Text( text = stringResource(R.string.cancel), - modifier = modifier.padding(horizontal = 10.dp).clickable { onDismissDialog() } + modifier = modifier.padding(horizontal = 10.dp).clickable { onDismissDialog() }, ) Text( color = MaterialTheme.colors.primary, @@ -395,10 +395,10 @@ fun ForgotPasswordDialog( modifier.padding(horizontal = 10.dp).clickable { onDismissDialog() forgotPassword() - } + }, ) } - } + }, ) } @@ -407,8 +407,10 @@ fun LoginScreenLoadingConfig() { Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { CircularProgressBar(text = stringResource(id = R.string.loading)) } + horizontalAlignment = Alignment.CenterHorizontally, + ) { + CircularProgressBar(text = stringResource(id = R.string.loading)) + } } @Preview(showBackground = true) @@ -422,7 +424,7 @@ fun LoginScreenPreview() { password = "", onPasswordChanged = {}, forgotPassword = {}, - onLoginButtonClicked = {} + onLoginButtonClicked = {}, ) } @@ -437,7 +439,7 @@ fun LoginScreenPreviewDarkMode() { password = "", onPasswordChanged = {}, forgotPassword = {}, - onLoginButtonClicked = {} + onLoginButtonClicked = {}, ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginViewModel.kt index 09b3988093..fb058b23ab 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/login/LoginViewModel.kt @@ -101,7 +101,7 @@ constructor( private suspend fun fetchAccessToken( username: String, - password: CharArray + password: CharArray, ): Result = tokenAuthenticator.fetchAccessToken(username, password).onFailure { _showProgressBar.postValue(false) @@ -120,17 +120,20 @@ constructor( } private suspend fun fetchUserInfo(): Result = - runCatching { keycloakService.fetchUserInfo().body() }.onFailure { - Timber.e(it) - _showProgressBar.postValue(false) - _loginErrorState.postValue(LoginErrorState.ERROR_FETCHING_USER) - } + runCatching { keycloakService.fetchUserInfo().body() } + .onFailure { + Timber.e(it) + _showProgressBar.postValue(false) + _loginErrorState.postValue(LoginErrorState.ERROR_FETCHING_USER) + } private suspend fun fetchPractitioner(userInfo: UserInfo?): Result { val endpointResult = - userInfo?.keycloakUuid?.takeIf { it.isNotBlank() }?.practitionerEndpointUrl()?.runCatching { - fhirResourceService.getResource(url = this) - } + userInfo + ?.keycloakUuid + ?.takeIf { it.isNotBlank() } + ?.practitionerEndpointUrl() + ?.runCatching { fhirResourceService.getResource(url = this) } ?: Result.failure(NullPointerException("Keycloak user is null. Failed to fetch user.")) endpointResult.onFailure { _showProgressBar.postValue(false) @@ -259,11 +262,11 @@ constructor( sharedPreferences.write( SharedPreferenceKey.PRACTITIONER_LOCATION_HIERARCHIES.name, - locationHierarchies + locationHierarchies, ) sharedPreferences.write( key = SharedPreferenceKey.PRACTITIONER_ID.name, - value = practitionerDetails.fhirPractitionerDetails?.practitionerId.valueToString() + value = practitionerDetails.fhirPractitionerDetails?.practitionerId.valueToString(), ) sharedPreferences.write(SharedPreferenceKey.PRACTITIONER_DETAILS.name, practitionerDetails) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinLoginActivity.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinLoginActivity.kt index e68d05f8f2..3b71183a5d 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinLoginActivity.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinLoginActivity.kt @@ -36,7 +36,9 @@ import org.smartregister.fhircore.engine.ui.theme.AppTheme class PinLoginActivity : BaseMultiLanguageActivity() { @Inject lateinit var loginService: LoginService + @Inject lateinit var configurationRegistry: ConfigurationRegistry + @Inject lateinit var syncBroadcaster: Lazy val pinViewModel by viewModels() @@ -77,7 +79,7 @@ class PinLoginActivity : BaseMultiLanguageActivity() { addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addCategory(Intent.CATEGORY_LAUNCHER) - } + }, ) finish() } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinLoginScreen.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinLoginScreen.kt index 38c7f0c0cf..e400081ad1 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinLoginScreen.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinLoginScreen.kt @@ -81,7 +81,6 @@ const val PIN_SET_PIN_CONFIRM_BUTTON = "setPinConfirmButton" @Composable fun PinLoginScreen(viewModel: PinViewModel) { - val showError by viewModel.showError.observeAsState(initial = false) PinLoginPage( @@ -105,7 +104,6 @@ fun PinLoginPage( forgotPin: () -> Unit, appName: String = "", ) { - var showMenu by remember { mutableStateOf(false) } var showForgotPinDialog by remember { mutableStateOf(false) } @@ -117,29 +115,33 @@ fun PinLoginPage( Icon( Icons.Filled.ArrowBack, contentDescription = "Back arrow", - modifier = Modifier.size(0.dp).testTag(PIN_TOOLBAR_MENU_ICON) + modifier = Modifier.size(0.dp).testTag(PIN_TOOLBAR_MENU_ICON), ) } }, actions = { IconButton( onClick = { showMenu = !showMenu }, - modifier = Modifier.testTag(PIN_TOOLBAR_MENU_BUTTON) - ) { Icon(imageVector = Icons.Outlined.MoreVert, contentDescription = null) } + modifier = Modifier.testTag(PIN_TOOLBAR_MENU_BUTTON), + ) { + Icon(imageVector = Icons.Outlined.MoreVert, contentDescription = null) + } DropdownMenu( expanded = showMenu, onDismissRequest = { showMenu = false }, - Modifier.testTag(PIN_TOOLBAR_MENU) + Modifier.testTag(PIN_TOOLBAR_MENU), ) { DropdownMenuItem( onClick = { showMenu = false onMenuLoginClicked() }, - modifier = Modifier.testTag(PIN_TOOLBAR_MENU_LOGIN) - ) { Text(text = stringResource(id = R.string.pin_menu_login)) } + modifier = Modifier.testTag(PIN_TOOLBAR_MENU_LOGIN), + ) { + Text(text = stringResource(id = R.string.pin_menu_login)) + } } - } + }, ) if (showForgotPinDialog) { @@ -150,7 +152,7 @@ fun PinLoginPage( modifier = Modifier.fillMaxSize() .padding(horizontal = 16.dp, vertical = 70.dp) - .wrapContentWidth(Alignment.CenterHorizontally) + .wrapContentWidth(Alignment.CenterHorizontally), ) { Image( painter = painterResource(id = R.drawable.ic_app_logo), @@ -161,14 +163,14 @@ fun PinLoginPage( .align(Alignment.CenterHorizontally) .requiredHeight(120.dp) .requiredWidth(140.dp) - .testTag(APP_LOGO_TAG) + .testTag(APP_LOGO_TAG), ) Text( text = appName, textAlign = TextAlign.Center, fontWeight = FontWeight.Bold, fontSize = 22.sp, - modifier = modifier.padding(top = 16.dp).align(Alignment.CenterHorizontally) + modifier = modifier.padding(top = 16.dp).align(Alignment.CenterHorizontally), ) Text( @@ -176,25 +178,26 @@ fun PinLoginPage( textAlign = TextAlign.Center, fontWeight = FontWeight.Normal, fontSize = 20.sp, - modifier = modifier.padding(vertical = 16.dp).align(Alignment.CenterHorizontally) + modifier = modifier.padding(vertical = 16.dp).align(Alignment.CenterHorizontally), ) PinView( pinInputLength = PIN_INPUT_MAX_THRESHOLD, isDotted = true, onPinChanged = onPinChanged, - showError = showError + showError = showError, ) - if (showError) + if (showError) { Text( text = stringResource(R.string.incorrect_pin_please_retry), textAlign = TextAlign.Center, fontWeight = FontWeight.Normal, fontSize = 16.sp, color = colorResource(id = R.color.colorError), - modifier = modifier.padding(vertical = 16.dp).align(Alignment.CenterHorizontally) + modifier = modifier.padding(vertical = 16.dp).align(Alignment.CenterHorizontally), ) + } Text( text = stringResource(R.string.forgot_pin), @@ -206,7 +209,7 @@ fun PinLoginPage( .padding(top = 24.dp) .align(Alignment.CenterHorizontally) .testTag(PIN_FORGOT_PIN) - .clickable { showForgotPinDialog = !showForgotPinDialog } + .clickable { showForgotPinDialog = !showForgotPinDialog }, ) } } @@ -216,7 +219,7 @@ fun PinLoginPage( fun ForgotPinDialog( forgotPin: () -> Unit, onDismissDialog: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { AlertDialog( onDismissRequest = onDismissDialog, @@ -224,18 +227,18 @@ fun ForgotPinDialog( Text( text = stringResource(R.string.forgot_pin), fontWeight = FontWeight.Bold, - fontSize = 18.sp + fontSize = 18.sp, ) }, text = { Text(text = stringResource(R.string.please_contact_supervisor), fontSize = 16.sp) }, buttons = { Row( modifier = modifier.fillMaxWidth().padding(vertical = 20.dp), - horizontalArrangement = Arrangement.End + horizontalArrangement = Arrangement.End, ) { Text( text = stringResource(R.string.cancel), - modifier = modifier.padding(horizontal = 10.dp).clickable { onDismissDialog() } + modifier = modifier.padding(horizontal = 10.dp).clickable { onDismissDialog() }, ) Text( color = MaterialTheme.colors.primary, @@ -244,11 +247,11 @@ fun ForgotPinDialog( modifier.padding(horizontal = 10.dp).clickable { onDismissDialog() forgotPin() - } + }, ) } }, - modifier = Modifier.testTag(PIN_FORGOT_DIALOG) + modifier = Modifier.testTag(PIN_FORGOT_DIALOG), ) } @@ -261,7 +264,7 @@ fun PinLoginPreview() { showError = false, onMenuLoginClicked = {}, forgotPin = {}, - appName = "anc" + appName = "anc", ) } @@ -274,6 +277,6 @@ fun PinLoginErrorPreview() { showError = true, onMenuLoginClicked = {}, forgotPin = {}, - appName = "ecbis" + appName = "ecbis", ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinSetupActivity.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinSetupActivity.kt index 3e7d40561c..3e9d02c70b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinSetupActivity.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinSetupActivity.kt @@ -38,7 +38,9 @@ import org.smartregister.fhircore.engine.util.FORCE_LOGIN_VIA_USERNAME class PinSetupActivity : BaseMultiLanguageActivity() { @Inject lateinit var loginService: LoginService + @Inject lateinit var configurationRegistry: ConfigurationRegistry + @Inject lateinit var syncBroadcaster: Lazy val pinViewModel by viewModels() @@ -79,7 +81,7 @@ class PinSetupActivity : BaseMultiLanguageActivity() { addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addCategory(Intent.CATEGORY_LAUNCHER) - } + }, ) finish() } @@ -92,7 +94,7 @@ class PinSetupActivity : BaseMultiLanguageActivity() { addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addCategory(Intent.CATEGORY_LAUNCHER) - } + }, ) finish() } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinSetupScreen.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinSetupScreen.kt index 269ed838cf..8d910ac029 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinSetupScreen.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinSetupScreen.kt @@ -64,7 +64,6 @@ import org.smartregister.fhircore.engine.util.annotation.ExcludeFromJacocoGenera @Composable fun PinSetupScreen(viewModel: PinViewModel) { - val inputPin by viewModel.pin.observeAsState(initial = "") val enableSetPin by viewModel.enableSetPin.observeAsState(initial = false) @@ -87,9 +86,8 @@ fun PinSetupPage( setPinEnabled: Boolean = false, onPinConfirmed: () -> Unit, onMenuSettingClicked: () -> Unit, - onMenuLoginClicked: () -> Unit + onMenuLoginClicked: () -> Unit, ) { - var showMenu by remember { mutableStateOf(false) } Surface(color = colorResource(id = R.color.white_slightly_opaque)) { @@ -100,43 +98,49 @@ fun PinSetupPage( Icon( Icons.Filled.ArrowBack, contentDescription = "Back arrow", - modifier = Modifier.size(0.dp).testTag(PIN_TOOLBAR_MENU_ICON) + modifier = Modifier.size(0.dp).testTag(PIN_TOOLBAR_MENU_ICON), ) } }, actions = { IconButton( onClick = { showMenu = !showMenu }, - modifier = Modifier.testTag(PIN_TOOLBAR_MENU_BUTTON) - ) { Icon(imageVector = Icons.Outlined.MoreVert, contentDescription = null) } + modifier = Modifier.testTag(PIN_TOOLBAR_MENU_BUTTON), + ) { + Icon(imageVector = Icons.Outlined.MoreVert, contentDescription = null) + } DropdownMenu( expanded = showMenu, onDismissRequest = { showMenu = false }, - Modifier.testTag(PIN_TOOLBAR_MENU) + Modifier.testTag(PIN_TOOLBAR_MENU), ) { DropdownMenuItem( onClick = { showMenu = false onMenuSettingClicked() }, - modifier = Modifier.testTag(PIN_TOOLBAR_MENU_SETTINGS) - ) { Text(text = stringResource(id = R.string.settings)) } + modifier = Modifier.testTag(PIN_TOOLBAR_MENU_SETTINGS), + ) { + Text(text = stringResource(id = R.string.settings)) + } DropdownMenuItem( onClick = { showMenu = false onMenuLoginClicked() }, - modifier = Modifier.testTag(PIN_TOOLBAR_MENU_LOGIN) - ) { Text(text = stringResource(id = R.string.pin_menu_login)) } + modifier = Modifier.testTag(PIN_TOOLBAR_MENU_LOGIN), + ) { + Text(text = stringResource(id = R.string.pin_menu_login)) + } } - } + }, ) Column( modifier = Modifier.fillMaxSize() .padding(horizontal = 16.dp, vertical = 70.dp) - .wrapContentWidth(Alignment.CenterHorizontally) + .wrapContentWidth(Alignment.CenterHorizontally), ) { Image( painter = painterResource(id = R.drawable.ic_app_logo), @@ -154,7 +158,7 @@ fun PinSetupPage( textAlign = TextAlign.Center, fontWeight = FontWeight.Bold, fontSize = 22.sp, - modifier = modifier.padding(top = 20.dp).align(Alignment.CenterHorizontally) + modifier = modifier.padding(top = 20.dp).align(Alignment.CenterHorizontally), ) Text( @@ -163,24 +167,26 @@ fun PinSetupPage( fontWeight = FontWeight.Normal, fontSize = 18.sp, modifier = - modifier.padding(horizontal = 16.dp, vertical = 16.dp).align(Alignment.CenterHorizontally) + modifier + .padding(horizontal = 16.dp, vertical = 16.dp) + .align(Alignment.CenterHorizontally), ) PinView( pinInputLength = PIN_INPUT_MAX_THRESHOLD, onPinChanged = onPinChanged, - inputPin = inputPin + inputPin = inputPin, ) Button( enabled = setPinEnabled, onClick = onPinConfirmed, - modifier = Modifier.fillMaxWidth().padding(top = 30.dp).testTag(PIN_SET_PIN_CONFIRM_BUTTON) + modifier = Modifier.fillMaxWidth().padding(top = 30.dp).testTag(PIN_SET_PIN_CONFIRM_BUTTON), ) { Text( color = Color.White, text = stringResource(id = R.string.set_pin), - modifier = Modifier.padding(8.dp) + modifier = Modifier.padding(8.dp), ) } } @@ -197,7 +203,7 @@ fun PinSetupPreview() { inputPin = "", setPinEnabled = false, onMenuSettingClicked = {}, - onMenuLoginClicked = {} + onMenuLoginClicked = {}, ) } @@ -211,6 +217,6 @@ fun PinSetupFilledPreview() { inputPin = "1234", setPinEnabled = true, onMenuSettingClicked = {}, - onMenuLoginClicked = {} + onMenuLoginClicked = {}, ) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinViewModel.kt index 3a173f519b..5001e28f24 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/pin/PinViewModel.kt @@ -41,7 +41,7 @@ constructor( val sharedPreferences: SharedPreferencesHelper, val secureSharedPreference: SecureSharedPreference, val configurationRegistry: ConfigurationRegistry, - val app: Application + val app: Application, ) : ViewModel() { private val _launchDialPad: MutableLiveData = MutableLiveData(null) @@ -129,7 +129,6 @@ constructor( } fun onPinChanged(newPin: String) { - if (newPin.length == PIN_INPUT_MAX_THRESHOLD) { val pinMatched = newPin.equals(savedPin, false) enableSetPin.value = true diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/ExtractionProgress.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/ExtractionProgress.kt index c02d36d39f..54ebe2e16e 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/ExtractionProgress.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/ExtractionProgress.kt @@ -20,5 +20,6 @@ import org.hl7.fhir.r4.model.Resource sealed class ExtractionProgress { class Success(val extras: List? = null) : ExtractionProgress() + object Failed : ExtractionProgress() } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivity.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivity.kt index bbb3359b20..3ecb2bfc0e 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivity.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivity.kt @@ -195,7 +195,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList override fun onFragmentCreated( fm: FragmentManager, f: Fragment, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ) { super.onFragmentCreated(fm, f, savedInstanceState) tracer.stopTrace(QUESTIONNAIRE_TRACE) @@ -205,7 +205,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList fm: FragmentManager, f: Fragment, v: View, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ) { super.onFragmentViewCreated(fm, f, v, savedInstanceState) if (f is QuestionnaireFragment) { @@ -219,13 +219,15 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList } } }, - false + false, ) supportFragmentManager.commit { replace(R.id.container, fragment, QUESTIONNAIRE_FRAGMENT_TAG) } supportFragmentManager.setFragmentResultListener( QuestionnaireFragment.SUBMIT_REQUEST_KEY, - this - ) { _, _ -> onSubmitRequestResult() } + this, + ) { _, _ -> + onSubmitRequestResult() + } supportFragmentManager.addFragmentOnAttachListener { _, frag -> Timber.e(frag.tag?.uppercase()) @@ -239,7 +241,9 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList // setting the save button text from Questionnaire Config questionnaireConfig.saveButtonText ?: getString(R.string.questionnaire_alert_submit_button_title) - } else getString(R.string.questionnaire_alert_submit_button_title) + } else { + getString(R.string.questionnaire_alert_submit_button_title) + } } open fun onSubmitRequestResult() { @@ -259,7 +263,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList questionnaireViewModel.getQuestionnaireConfigPair( this@QuestionnaireActivity, formName, - questionnaireType + questionnaireType, ) questionnaireConfig = resultPair.first @@ -306,22 +310,23 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList } open fun showFormSubmissionConfirmAlert() { - if (questionnaire.experimental) + if (questionnaire.experimental) { showConfirmAlert( context = this, message = R.string.questionnaire_alert_test_only_message, title = R.string.questionnaire_alert_test_only_title, confirmButtonListener = { handleQuestionnaireSubmit() }, - confirmButtonText = R.string.questionnaire_alert_test_only_button_title + confirmButtonText = R.string.questionnaire_alert_test_only_button_title, ) - else + } else { showConfirmAlert( context = this, message = R.string.questionnaire_alert_submit_message, title = R.string.questionnaire_alert_submit_title, confirmButtonListener = { handleQuestionnaireSubmit() }, - confirmButtonText = R.string.questionnaire_alert_submit_button_title + confirmButtonText = R.string.questionnaire_alert_submit_button_title, ) + } } fun getQuestionnaireResponse(): QuestionnaireResponse { @@ -331,8 +336,9 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList } fun dismissSaveProcessing() { - if (::saveProcessingAlertDialog.isInitialized && saveProcessingAlertDialog.isShowing) + if (::saveProcessingAlertDialog.isInitialized && saveProcessingAlertDialog.isShowing) { saveProcessingAlertDialog.dismiss() + } } open fun handleQuestionnaireSubmit() { @@ -345,7 +351,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList AlertDialogue.showErrorAlert( this, R.string.questionnaire_alert_invalid_message, - R.string.questionnaire_alert_invalid_title + R.string.questionnaire_alert_invalid_title, ) return } @@ -364,7 +370,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList fun onPostSave( result: Boolean, questionnaireResponse: QuestionnaireResponse, - extras: List? = null + extras: List? = null, ) { dismissSaveProcessing() if (result) { @@ -380,10 +386,10 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList open fun postSaveSuccessful( questionnaireResponse: QuestionnaireResponse, - extras: List? = null + extras: List? = null, ) { val message = questionnaireViewModel.extractionProgressMessage.value - if (message?.isNotEmpty() == true) + if (message?.isNotEmpty() == true) { AlertDialogue.showInfoAlert( this, message, @@ -391,14 +397,17 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList { it.dismiss() finishActivity(questionnaireResponse, extras) - } + }, ) - else finishActivity(questionnaireResponse, extras) + } else { + finishActivity(questionnaireResponse, extras) + } } fun finishActivity(questionnaireResponse: QuestionnaireResponse, extras: List? = null) { val parcelResponse = questionnaireResponse.copy() - questionnaire.find(FieldType.TYPE, Questionnaire.QuestionnaireItemType.ATTACHMENT.name) + questionnaire + .find(FieldType.TYPE, Questionnaire.QuestionnaireItemType.ATTACHMENT.name) .forEach { parcelResponse.find(it.linkId)?.answer?.clear() } setResult( Activity.RESULT_OK, @@ -407,14 +416,14 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList putExtra(QUESTIONNAIRE_ARG_FORM, questionnaire.logicalId) putExtra( QUESTIONNAIRE_BACK_REFERENCE_KEY, - intent.getStringExtra(QUESTIONNAIRE_BACK_REFERENCE_KEY) + intent.getStringExtra(QUESTIONNAIRE_BACK_REFERENCE_KEY), ) extras?.map { res -> if (res is Encounter) { putExtra(QUESTIONNAIRE_RES_ENCOUNTER, res.status.toCode()) } } - } + }, ) finish() } @@ -423,7 +432,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList QuestionnaireResponseValidator.validateQuestionnaireResponse( questionnaire = questionnaire, questionnaireResponse = questionnaireResponse, - context = this + context = this, ) .values .flatten() @@ -436,7 +445,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList questionnaireResponse = questionnaireResponse, resourceId = intent.getStringExtra(QUESTIONNAIRE_ARG_PATIENT_KEY), groupResourceId = intent.getStringExtra(QUESTIONNAIRE_ARG_GROUP_KEY), - questionnaireType = questionnaireType + questionnaireType = questionnaireType, ) } @@ -459,7 +468,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList getDismissDialogMessage(), R.string.questionnaire_alert_back_pressed_title, { finish() }, - R.string.questionnaire_alert_back_pressed_button_title + R.string.questionnaire_alert_back_pressed_button_title, ) } } @@ -493,15 +502,15 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList questionnaireResponse: QuestionnaireResponse? = null, backReference: String? = null, launchContexts: ArrayList? = null, - populationResources: ArrayList = ArrayList() + populationResources: ArrayList = ArrayList(), ) = bundleOf( - Pair(QUESTIONNAIRE_ARG_PATIENT_KEY, clientIdentifier), - Pair(QUESTIONNAIRE_ARG_GROUP_KEY, groupIdentifier), - Pair(QUESTIONNAIRE_ARG_FORM, formName), - Pair(QUESTIONNAIRE_ARG_TYPE, questionnaireType.name), - Pair(QUESTIONNAIRE_BACK_REFERENCE_KEY, backReference) - ) + Pair(QUESTIONNAIRE_ARG_PATIENT_KEY, clientIdentifier), + Pair(QUESTIONNAIRE_ARG_GROUP_KEY, groupIdentifier), + Pair(QUESTIONNAIRE_ARG_FORM, formName), + Pair(QUESTIONNAIRE_ARG_TYPE, questionnaireType.name), + Pair(QUESTIONNAIRE_BACK_REFERENCE_KEY, backReference), + ) .apply { questionnaireResponse?.let { putString(QUESTIONNAIRE_RESPONSE, it.encodeResourceToString()) @@ -510,15 +519,17 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList if (resourcesList.isNotEmpty()) { putStringArrayList( QUESTIONNAIRE_POPULATION_RESOURCES, - resourcesList.toCollection(ArrayList()) - ) - } - launchContexts?.takeIf { it.isNotEmpty() }?.let { list -> - putStringArrayList( - QUESTIONNAIRE_LAUNCH_CONTEXT, - ArrayList(list.map { it.encodeResourceToString() }) + resourcesList.toCollection(ArrayList()), ) } + launchContexts + ?.takeIf { it.isNotEmpty() } + ?.let { list -> + putStringArrayList( + QUESTIONNAIRE_LAUNCH_CONTEXT, + ArrayList(list.map { it.encodeResourceToString() }), + ) + } } fun launchQuestionnaire( @@ -529,7 +540,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList questionnaireType: QuestionnaireType = QuestionnaireType.DEFAULT, intentBundle: Bundle = Bundle.EMPTY, launchContexts: ArrayList? = null, - populationResources: ArrayList? = null + populationResources: ArrayList? = null, ) { context.startActivity( Intent(context, QuestionnaireActivity::class.java) @@ -541,9 +552,9 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList formName = questionnaireId, questionnaireType = questionnaireType, launchContexts = launchContexts, - populationResources = populationResources ?: ArrayList() - ) - ) + populationResources = populationResources ?: ArrayList(), + ), + ), ) } @@ -555,7 +566,7 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList backReference: String? = null, intentBundle: Bundle = Bundle.EMPTY, launchContexts: ArrayList? = null, - populationResources: ArrayList? = null + populationResources: ArrayList? = null, ) { context.startActivityForResult( Intent(context, QuestionnaireActivity::class.java) @@ -567,10 +578,10 @@ open class QuestionnaireActivity : BaseMultiLanguageActivity(), View.OnClickList questionnaireType = questionnaireType, backReference = backReference, launchContexts = launchContexts, - populationResources = populationResources ?: ArrayList() - ) + populationResources = populationResources ?: ArrayList(), + ), ), - 0 + 0, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireConfig.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireConfig.kt index 4fb2a8fdbf..57cd1dbb1d 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireConfig.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireConfig.kt @@ -20,6 +20,7 @@ import kotlinx.serialization.Serializable /** * Data class to represent a form configuration. Questionnaires are synced from the server + * * @property appId Application id for the questionnaire * @property form A unique name for the form as declared in the `form_configurations.json file` * @property title The title of the form @@ -33,5 +34,5 @@ data class QuestionnaireConfig( val saveButtonText: String? = null, val setPractitionerDetails: Boolean = true, val setOrganizationDetails: Boolean = true, - val planDefinitions: List = listOf() + val planDefinitions: List = listOf(), ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl.kt index 639fefaede..9b5367e9c5 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl.kt @@ -25,7 +25,7 @@ object QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl : QuestionnaireItemViewHolderFactoryMatchersProviderFactory { override fun get( - provider: String + provider: String, ): QuestionnaireFragment.QuestionnaireItemViewHolderFactoryMatchersProvider { // Note: Returns irrespective of the 'provider' passed return QuestionnaireItemViewHolderFactoryMatchersProviderImpl @@ -40,12 +40,12 @@ object QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl : override fun get(): List { return listOf( QuestionnaireFragment.QuestionnaireItemViewHolderFactoryMatcher( - BarCodeReaderViewHolderFactory + BarCodeReaderViewHolderFactory, ) { questionnaireItem -> questionnaireItem.getExtensionByUrl(BARCODE_URL).let { if (it == null) false else it.value.asStringValue() == BARCODE_NAME } - } + }, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireNotFoundException.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireNotFoundException.kt index 025b8889e8..5ff9e19ca7 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireNotFoundException.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireNotFoundException.kt @@ -19,7 +19,8 @@ package org.smartregister.fhircore.engine.ui.questionnaire class QuestionnaireNotFoundException : Exception { constructor( formName: String, - cause: Throwable + cause: Throwable, ) : super("Questionnaire '$formName' not found", cause) + constructor(formName: String) : super("Questionnaire '$formName' not found") } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireType.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireType.kt index 0e0557d4a0..a6f3f362a7 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireType.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireType.kt @@ -19,8 +19,10 @@ package org.smartregister.fhircore.engine.ui.questionnaire enum class QuestionnaireType { READ_ONLY, EDIT, - DEFAULT; + DEFAULT, + ; fun isEditMode() = this == EDIT + fun isReadOnly() = this == READ_ONLY } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireViewModel.kt index 6b762a3157..351630c15a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireViewModel.kt @@ -110,7 +110,7 @@ constructor( val dispatcherProvider: DispatcherProvider, val sharedPreferencesHelper: SharedPreferencesHelper, val libraryEvaluatorProvider: Provider, - var tracer: PerformanceReporter + var tracer: PerformanceReporter, ) : ViewModel() { @Inject lateinit var fhirCarePlanGenerator: FhirCarePlanGenerator @@ -158,7 +158,7 @@ constructor( suspend fun getQuestionnaireConfigPair( context: Context, formName: String, - type: QuestionnaireType + type: QuestionnaireType, ): Pair { return try { val config = getQuestionnaireConfig(formName, context) @@ -172,7 +172,7 @@ constructor( QuestionnaireConfig( form = questionnaire.name ?: "", title = questionnaire.title ?: "", - identifier = questionnaire.logicalId + identifier = questionnaire.logicalId, ) Pair(questionnaireConfig, questionnaire) } @@ -182,7 +182,7 @@ constructor( return kotlin .runCatching { configurationRegistry.retrieveConfiguration( - AppConfigClassification.FORMS + AppConfigClassification.FORMS, ) } .getOrNull() @@ -190,14 +190,14 @@ constructor( } private suspend fun loadQuestionnaireConfigFromAssets( - context: Context + context: Context, ): List? = kotlin .runCatching { withContext(dispatcherProvider.io()) { AssetUtil.decodeAsset>( fileName = QuestionnaireActivity.FORM_CONFIGURATIONS, - context = context + context = context, ) } } @@ -216,10 +216,11 @@ constructor( val organizationRef = Reference().apply { reference = "${ResourceType.Organization.name}/$org" } - if (resource is Patient && !resource.hasManagingOrganization()) + if (resource is Patient && !resource.hasManagingOrganization()) { resource.managingOrganization = organizationRef - else if (resource is Group && !resource.hasManagingEntity()) + } else if (resource is Group && !resource.hasManagingEntity()) { resource.managingEntity = organizationRef + } } } @@ -227,18 +228,20 @@ constructor( practitionerId?.let { val practitionerRef = it.asReference(ResourceType.Practitioner) - if (resource is Encounter) + if (resource is Encounter) { resource.participant = arrayListOf( - Encounter.EncounterParticipantComponent().apply { individual = practitionerRef } + Encounter.EncounterParticipantComponent().apply { individual = practitionerRef }, ) - else if (resource is Patient) + } else if (resource is Patient) { if (resource.hasGeneralPractitioner()) { - if (!resource.generalPractitioner.contains(practitionerRef)) + if (!resource.generalPractitioner.contains(practitionerRef)) { resource.addGeneralPractitioner(practitionerRef) + } } else { resource.generalPractitioner = arrayListOf(practitionerRef) } + } } } @@ -249,7 +252,7 @@ constructor( Group.GroupMemberComponent().apply { entity = Reference().apply { reference = "${ResourceType.Patient.name}/${resource.logicalId}" } - } + }, ) } else { this.managingEntity = @@ -267,7 +270,7 @@ constructor( groupResourceId: String? = null, questionnaireResponse: QuestionnaireResponse, questionnaireType: QuestionnaireType = QuestionnaireType.DEFAULT, - questionnaire: Questionnaire + questionnaire: Questionnaire, ) { viewModelScope.launch(dispatcherProvider.io()) { tracer.startTrace(QUESTIONNAIRE_TRACE) @@ -284,23 +287,25 @@ constructor( appendOrganizationInfo(bundleEntry.resource) } // if it is new registration set response subject - if (resourceId == null) + if (resourceId == null) { questionnaireResponse.subject = bundleEntry.resource.asReference() + } } if (questionnaireConfig.setPractitionerDetails) { appendPractitionerInfo(bundleEntry.resource) } - if (questionnaireType != QuestionnaireType.EDIT && + if ( + questionnaireType != QuestionnaireType.EDIT && bundleEntry.resource.resourceType.isIn( ResourceType.Patient, - ResourceType.RelatedPerson + ResourceType.RelatedPerson, ) ) { groupResourceId?.let { appendPatientsAndRelatedPersonsToGroups( resource = bundleEntry.resource, - groupResourceId = it + groupResourceId = it, ) } } @@ -312,9 +317,9 @@ constructor( // for edit mode replace client and resource subject ids. // Ideally ResourceMapper should allow this internally via structure-map if (questionnaireType.isEditMode()) { - if (bundleEntry.resource.resourceType.isIn(ResourceType.Patient, ResourceType.Group)) + if (bundleEntry.resource.resourceType.isIn(ResourceType.Patient, ResourceType.Group)) { bundleEntry.resource.id = questionnaireResponse.subject.extractId() - else { + } else { bundleEntry.resource.setPropertySafely("subject", questionnaireResponse.subject) bundleEntry.resource.setPropertySafely("patient", questionnaireResponse.subject) } @@ -323,7 +328,8 @@ constructor( if (bundleEntry.resource is Encounter) extras.add(bundleEntry.resource) - if ((bundleEntry.resource is CarePlan || bundleEntry.resource is Patient) && + if ( + (bundleEntry.resource is CarePlan || bundleEntry.resource is Patient) && bundleEntry.resource.meta.tag.isNotEmpty() ) { carePlanAndPatientMetaExtraction(bundleEntry.resource) @@ -332,9 +338,11 @@ constructor( if (questionnaire.experimental) { Timber.w( - "${questionnaire.name}(${questionnaire.logicalId}) is experimental and not save any data" + "${questionnaire.name}(${questionnaire.logicalId}) is experimental and not save any data", ) - } else saveBundleResources(bundle) + } else { + saveBundleResources(bundle) + } if (questionnaireType.isEditMode() && editQuestionnaireResponse != null) { questionnaireResponse.retainMetadata(editQuestionnaireResponse!!) @@ -366,6 +374,7 @@ constructor( try { /** Get a FHIR [Resource] in the local storage. */ var resource = fhirEngine.get(source.resourceType, source.id) + /** Increment [Resource.meta] versionId of [source]. */ val versionId = resource.meta.versionId.toInt().plus(1).toString() /** Append passed [Resource.meta] to the [source]. */ @@ -406,7 +415,7 @@ constructor( suspend fun extractCqlOutput( questionnaire: Questionnaire, questionnaireResponse: QuestionnaireResponse, - bundle: Bundle? + bundle: Bundle?, ) { withContext(Dispatchers.Default) { val data = bundle ?: Bundle().apply { addEntry().apply { resource = questionnaireResponse } } @@ -414,9 +423,11 @@ constructor( .cqfLibraryIds() .map { val patient = - if (questionnaireResponse.hasSubject()) + if (questionnaireResponse.hasSubject()) { loadPatient(questionnaireResponse.subject.extractId()) - else null + } else { + null + } libraryEvaluatorProvider.get().runCqlLibrary(it, patient, data, defaultRepository) } .forEach { output -> @@ -432,7 +443,7 @@ constructor( fun handleQuestionnaireResponseSubject( resourceId: String?, questionnaire: Questionnaire, - questionnaireResponse: QuestionnaireResponse + questionnaireResponse: QuestionnaireResponse, ) { val subjectType = questionnaire.subjectType.firstOrNull()?.code ?: ResourceType.Patient.name questionnaireResponse.subject = @@ -445,11 +456,11 @@ constructor( suspend fun saveQuestionnaireResponse( questionnaire: Questionnaire, - questionnaireResponse: QuestionnaireResponse + questionnaireResponse: QuestionnaireResponse, ) { if (questionnaire.experimental) { Timber.w( - "${questionnaire.name}(${questionnaire.logicalId}) is experimental and not save any data" + "${questionnaire.name}(${questionnaire.logicalId}) is experimental and not save any data", ) return } @@ -463,9 +474,9 @@ constructor( questionnaireResponse.authored = Date() } - questionnaire.useContext.filter { it.hasValueCodeableConcept() }.forEach { - it.valueCodeableConcept.coding.forEach { questionnaireResponse.meta.addTag(it) } - } + questionnaire.useContext + .filter { it.hasValueCodeableConcept() } + .forEach { it.valueCodeableConcept.coding.forEach { questionnaireResponse.meta.addTag(it) } } defaultRepository.addOrUpdate(true, questionnaireResponse) } @@ -473,17 +484,16 @@ constructor( suspend fun performExtraction( context: Context, questionnaire: Questionnaire, - questionnaireResponse: QuestionnaireResponse + questionnaireResponse: QuestionnaireResponse, ): Bundle { - return ResourceMapper.extract( questionnaire = questionnaire, questionnaireResponse = questionnaireResponse, StructureMapExtractionContext( context = context, transformSupportServices = transformSupportServices, - structureMapProvider = retrieveStructureMapProvider() - ) + structureMapProvider = retrieveStructureMapProvider(), + ), ) } @@ -495,10 +505,9 @@ constructor( fun retrieveStructureMapProvider(): (suspend (String, IWorkerContext) -> StructureMap?) { if (structureMapProvider == null) { - structureMapProvider = - { structureMapUrl: String, _: IWorkerContext -> - fetchStructureMap(structureMapUrl) - } + structureMapProvider = { structureMapUrl: String, _: IWorkerContext -> + fetchStructureMap(structureMapUrl) + } } return structureMapProvider!! @@ -531,8 +540,8 @@ constructor( it.hasStart() && it.start.after( Date.from( - LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant().minusSeconds(30) - ) + LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant().minusSeconds(30), + ), ) } } @@ -545,7 +554,7 @@ constructor( filter( CarePlan.STATUS, { value = of(CarePlan.CarePlanStatus.COMPLETED.toCoding()) }, - operation = Operation.OR + operation = Operation.OR, ) } .map { it.resource } @@ -595,20 +604,20 @@ constructor( { value = of(CodeableConcept().addCoding(Coding("http://snomed.info/sct", "225368008", null))) - } + }, ) filter( Task.STATUS, { value = of(Task.TaskStatus.READY.toCode()) }, { value = of(Task.TaskStatus.INPROGRESS.toCode()) }, - operation = Operation.OR + operation = Operation.OR, ) filter( Task.PERIOD, { value = of(DateTimeType.now()) prefix = ParamPrefixEnum.GREATERTHAN - } + }, ) } .map { it.resource } @@ -635,7 +644,7 @@ constructor( fun getPopulationResourcesFromIntent( intent: Intent, - questionnaireLogicalId: String + questionnaireLogicalId: String, ): List { val resourcesList = mutableListOf() @@ -657,7 +666,7 @@ constructor( open suspend fun getPopulationResources( intent: Intent, - questionnaireLogicalId: String + questionnaireLogicalId: String, ): Array { val resourcesList = getPopulationResourcesFromIntent(intent, questionnaireLogicalId).toMutableList() @@ -671,13 +680,12 @@ constructor( value = logicalId use = Identifier.IdentifierUse.OFFICIAL system = QuestionnaireActivity.WHO_IDENTIFIER_SYSTEM - } + }, ) } resourcesList.add(this) - } - ?: defaultRepository.loadResource(patientId)?.apply { resourcesList.add(this) } + } ?: defaultRepository.loadResource(patientId)?.apply { resourcesList.add(this) } val bundleIndex = resourcesList.indexOfFirst { x -> x is Bundle } if (bundleIndex != -1) { @@ -697,7 +705,7 @@ constructor( currentBundle.addEntry( Bundle.BundleEntryComponent().setResource(bundle).apply { id = TracingHelpers.tracingBundleId - } + }, ) } @@ -728,7 +736,7 @@ constructor( suspend fun generateQuestionnaireResponse( questionnaire: Questionnaire, - intent: Intent + intent: Intent, ): QuestionnaireResponse { val resources = getPopulationResources(intent, questionnaire.logicalId) val questResponse = ResourceMapper.populate(questionnaire, *resources) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterActivity.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterActivity.kt index c32fdaf73e..282e833624 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterActivity.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterActivity.kt @@ -154,7 +154,8 @@ abstract class BaseRegisterActivity : private fun BaseRegisterActivityBinding.updateSyncStatus(state: SyncJobStatus) { when (state) { - is SyncJobStatus.Started, is SyncJobStatus.InProgress -> { + is SyncJobStatus.Started, + is SyncJobStatus.InProgress, -> { progressSync.show() tvLastSyncTimestamp.text = getString(R.string.syncing_in_progress) containerProgressSync.apply { @@ -162,13 +163,14 @@ abstract class BaseRegisterActivity : setOnClickListener(null) } } - is SyncJobStatus.Finished, is SyncJobStatus.Failed -> setLastSyncTimestamp(state) + is SyncJobStatus.Finished, + is SyncJobStatus.Failed, -> setLastSyncTimestamp(state) is SyncJobStatus.Glitch -> { progressSync.hide() val lastSyncTimestamp = sharedPreferencesHelper.read( SharedPreferenceKey.LAST_SYNC_TIMESTAMP.name, - getString(R.string.syncing_retry) + getString(R.string.syncing_retry), ) tvLastSyncTimestamp.text = lastSyncTimestamp?.formatSyncDate() ?: "" containerProgressSync.apply { @@ -244,14 +246,14 @@ abstract class BaseRegisterActivity : this.getDrawable(R.drawable.ic_search), null, null, - null + null, ) } else { setCompoundDrawablesWithIntrinsicBounds( null, null, getDrawable(R.drawable.ic_cancel), - null + null, ) this.addOnDrawableClickListener(DrawablePosition.DRAWABLE_RIGHT) { editable?.clear() @@ -265,23 +267,23 @@ abstract class BaseRegisterActivity : charSequence: CharSequence?, start: Int, count: Int, - after: Int + after: Int, ) {} override fun onTextChanged( charSequence: CharSequence?, start: Int, before: Int, - count: Int + count: Int, ) {} override fun afterTextChanged(editable: Editable?) { registerViewModel.updateFilterValue( RegisterFilterType.SEARCH_FILTER, - if (editable.isNullOrEmpty()) null else editable.toString() + if (editable.isNullOrEmpty()) null else editable.toString(), ) } - } + }, ) } } @@ -354,7 +356,8 @@ abstract class BaseRegisterActivity : val menu = registerActivityBinding.navView.menu sideMenuOptions().forEach { menuOption -> - menu.add(R.id.menu_group_clients, menuOption.itemId, Menu.NONE, menuOption.titleResource) + menu + .add(R.id.menu_group_clients, menuOption.itemId, Menu.NONE, menuOption.titleResource) .apply { icon = menuOption.iconResource actionView = layoutInflater.inflate(R.layout.drawable_menu_item_layout, null, false) @@ -374,14 +377,15 @@ abstract class BaseRegisterActivity : R.id.menu_group_empty, R.id.menu_group_empty_item_id, 2, - "" + "", ) // Hack to add last menu divider } private fun manipulateDrawer(open: Boolean = false) { with(registerActivityBinding) { - if (open) drawerLayout.openDrawer(GravityCompat.START) - else drawerLayout.closeDrawer(GravityCompat.START) + if (open) { + drawerLayout.openDrawer(GravityCompat.START) + } else drawerLayout.closeDrawer(GravityCompat.START) } } @@ -392,7 +396,8 @@ abstract class BaseRegisterActivity : showToast(getString(R.string.syncing)) registerActivityBinding.updateSyncStatus(state) } - is SyncJobStatus.Failed, is SyncJobStatus.Glitch -> { + is SyncJobStatus.Failed, + is SyncJobStatus.Glitch, -> { handleSyncFailed(state) } is SyncJobStatus.Finished -> { @@ -404,7 +409,7 @@ abstract class BaseRegisterActivity : } is SyncJobStatus.InProgress -> { Timber.d( - "Syncing in progress: ${state.syncOperation.name} ${state.completed.div(max(state.total, 1).toDouble()).times(100)}%" + "Syncing in progress: ${state.syncOperation.name} ${state.completed.div(max(state.total, 1).toDouble()).times(100)}%", ) registerActivityBinding.updateSyncStatus(state) } @@ -512,11 +517,11 @@ abstract class BaseRegisterActivity : tag: String, isRegisterFragment: Boolean = true, isFilterVisible: Boolean = true, - toolbarTitle: String? = null + toolbarTitle: String? = null, ) { registerActivityBinding.btnRegisterNewClient.toggleVisibility( tag == mainFragmentTag() && - registerViewModel.registerViewConfiguration.value!!.showNewClientButton + registerViewModel.registerViewConfiguration.value!!.showNewClientButton, ) if (supportedFragments.isEmpty() && !supportedFragments.containsKey(tag)) { throw IllegalAccessException("No fragment exists with the tag $tag") @@ -541,7 +546,7 @@ abstract class BaseRegisterActivity : null, null, this.getDrawable(R.drawable.ic_dropdown_arrow), - null + null, ) setOnClickListener { supportFragmentManager.commitNow { remove(navigationBottomSheet) } @@ -578,16 +583,15 @@ abstract class BaseRegisterActivity : * BottomNavigation */ open fun bottomNavigationMenuOptions( - viewConfiguration: RegisterViewConfiguration + viewConfiguration: RegisterViewConfiguration, ): List { return viewConfiguration.bottomNavigationOptions?.map { NavigationMenuOption( id = it.id.hashCode(), title = it.title, - iconResource = getDrawable(it.icon) + iconResource = getDrawable(it.icon), ) - } - ?: emptyList() + } ?: emptyList() } /** @@ -605,7 +609,7 @@ abstract class BaseRegisterActivity : open fun onBottomNavigationOptionItemSelected( item: MenuItem, - viewConfiguration: RegisterViewConfiguration + viewConfiguration: RegisterViewConfiguration, ): Boolean = true open fun registerClient(clientIdentifier: String? = null) { @@ -614,9 +618,9 @@ abstract class BaseRegisterActivity : .putExtras( QuestionnaireActivity.intentArgs( clientIdentifier = clientIdentifier, - formName = registerViewModel.registerViewConfiguration.value?.registrationForm!! - ) - ) + formName = registerViewModel.registerViewConfiguration.value?.registrationForm!!, + ), + ), ) } @@ -667,12 +671,13 @@ abstract class BaseRegisterActivity : onBarcodeResult(barcode, view) liveBarcodeScanningFragment.onDestroy() - } + }, ) } private fun launchBarcodeReader(requestPermissionLauncher: ActivityResultLauncher) { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == + if ( + ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED ) { liveBarcodeScanningFragment.show(this.supportFragmentManager, "LiveBarcodeScanningFragment") @@ -690,7 +695,7 @@ abstract class BaseRegisterActivity : Toast.makeText( this, "Camera permissions are needed to launch barcode reader!", - Toast.LENGTH_LONG + Toast.LENGTH_LONG, ) .show() } @@ -700,7 +705,6 @@ abstract class BaseRegisterActivity : open fun onBarcodeResult(barcode: String, view: View) {} private fun handleSyncFailed(state: SyncJobStatus) { - val exceptions = when (state) { is SyncJobStatus.Glitch -> if (state.exceptions != null) state.exceptions else emptyList() @@ -708,15 +712,16 @@ abstract class BaseRegisterActivity : else -> listOf() } - if (exceptions.map { it.exception }.filterIsInstance().firstOrNull()?.code() == - 401 + if ( + exceptions.map { it.exception }.filterIsInstance().firstOrNull()?.code() == 401 ) { showToast(getString(R.string.session_expired)) accountAuthenticator.logout { launchActivityWithNoBackStackHistory() } } else { - if (exceptions.map { it.exception }.any { - it is InterruptedIOException || it is UnknownHostException - } + if ( + exceptions + .map { it.exception } + .any { it is InterruptedIOException || it is UnknownHostException } ) { showToast(getString(R.string.sync_failed)) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterFragment.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterFragment.kt index 37068f619c..1ad09c7ca3 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterFragment.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterFragment.kt @@ -47,7 +47,6 @@ abstract class BaseRegisterFragment : Fragment() { abstract fun onItemClicked(listenerIntent: ListenerIntent, data: O) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - registerDataViewModel = initializeRegisterDataViewModel().apply { this.currentPage.observe(viewLifecycleOwner) { registerDataViewModel.loadPageData(it) } @@ -61,7 +60,7 @@ abstract class BaseRegisterFragment : Fragment() { filterRegisterData( registerFilterType = registerFilterType, filterValue = value, - registerFilter = this@BaseRegisterFragment::performFilter + registerFilter = this@BaseRegisterFragment::performFilter, ) } } else { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/ComposeRegisterFragment.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/ComposeRegisterFragment.kt index 471e8d8e0c..9324eb60c8 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/ComposeRegisterFragment.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/ComposeRegisterFragment.kt @@ -41,7 +41,7 @@ abstract class ComposeRegisterFragment : override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ) = ComposeView(requireContext()).apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/RegisterDataViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/RegisterDataViewModel.kt index dd7da3f46d..2683431ce9 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/RegisterDataViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/RegisterDataViewModel.kt @@ -42,7 +42,7 @@ import org.smartregister.fhircore.engine.util.DispatcherProvider class RegisterDataViewModel( application: Application, val registerRepository: RegisterRepository, - val dispatcherProvider: DispatcherProvider = DefaultDispatcherProvider() + val dispatcherProvider: DispatcherProvider = DefaultDispatcherProvider(), ) : AndroidViewModel(application) { private val _registerViewConfiguration = MutableLiveData(RegisterViewConfiguration()) @@ -89,7 +89,7 @@ class RegisterDataViewModel( fun filterRegisterData( registerFilterType: RegisterFilterType, filterValue: Any, - registerFilter: (RegisterFilterType, O, Any) -> Boolean + registerFilter: (RegisterFilterType, O, Any) -> Boolean, ) { viewModelScope.launch(dispatcherProvider.io()) { registerData.value = @@ -117,7 +117,7 @@ class RegisterDataViewModel( this.loadAll = loadAll this.currentPage = currentPage } - } + }, ) .flow @@ -140,8 +140,7 @@ class RegisterDataViewModel( fun countPages() = _totalRecordsCount.value?.toDouble()?.div(PaginationConstant.DEFAULT_PAGE_SIZE.toLong())?.let { ceil(it).toInt() - } - ?: 1 + } ?: 1 fun showResultsCount(showResultsCount: Boolean) { this._showResultsCount.postValue(showResultsCount) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/RegisterViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/RegisterViewModel.kt index 4cc0602833..7b29e69a75 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/RegisterViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/RegisterViewModel.kt @@ -59,7 +59,7 @@ constructor( private val applicationConfiguration = configurationRegistry.retrieveConfiguration( - AppConfigClassification.APPLICATION + AppConfigClassification.APPLICATION, ) private val _lastSyncTimestamp = @@ -79,7 +79,7 @@ constructor( var selectedLanguage = MutableLiveData( - sharedPreferencesHelper.read(SharedPreferenceKey.LANG.name, Locale.UK.toLanguageTag()) + sharedPreferencesHelper.read(SharedPreferenceKey.LANG.name, Locale.UK.toLanguageTag()), ) val registerViewConfiguration: MutableLiveData = MutableLiveData() diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/model/RegisterFilterType.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/model/RegisterFilterType.kt index 4d771b643b..f641644afc 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/model/RegisterFilterType.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/model/RegisterFilterType.kt @@ -18,5 +18,5 @@ package org.smartregister.fhircore.engine.ui.register.model enum class RegisterFilterType { SEARCH_FILTER, - OVERDUE_FILTER + OVERDUE_FILTER, } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/model/SideMenuOption.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/model/SideMenuOption.kt index b27ec2e544..13b1ac71fc 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/model/SideMenuOption.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/register/model/SideMenuOption.kt @@ -24,10 +24,11 @@ import android.graphics.drawable.Drawable * @property iconResource Android drawable resource used as icon for menu option * @property count The current count for the menu item. Default is 0 * @property showCount Show clients count against the menu option queries for resources other than - * Patient + * Patient * @property countMethod High order function used to return count for the menu option. Defaults to - * returning -1. -1 is used to determine whether to count active patients or not. Override to - * provide custom count implementation for instance calling a view model method to perform the count + * returning -1. -1 is used to determine whether to count active patients or not. Override to + * provide custom count implementation for instance calling a view model method to perform the + * count */ data class SideMenuOption( val itemId: Int, @@ -35,5 +36,5 @@ data class SideMenuOption( val iconResource: Drawable, var count: Long = 0, val showCount: Boolean = true, - val countMethod: () -> Long = { -1 } + val countMethod: () -> Long = { -1 }, ) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/DevViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/DevViewModel.kt index 888a18d324..2909aa4e2e 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/DevViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/DevViewModel.kt @@ -88,8 +88,7 @@ constructor( log = "${log}Id,${group.key},Date" + "\n" + - group.value.joinToString(separator = "\n") @ExcludeFromJacocoGeneratedReport - { + group.value.joinToString(separator = "\n") @ExcludeFromJacocoGeneratedReport { "${it.id},${it.version},${it.date}" } + "" + @@ -105,21 +104,22 @@ constructor( suspend fun getResourcesToReport(): Map> { val questionnaire = - fhirEngine.search {}.map { it.resource }.map { - ResourceField(it.logicalId, it.meta.versionId, it.meta.lastUpdated.asDdMmmYyyy()) - } + fhirEngine + .search {} + .map { it.resource } + .map { ResourceField(it.logicalId, it.meta.versionId, it.meta.lastUpdated.asDdMmmYyyy()) } val structureMaps = - fhirEngine.search {}.map { it.resource }.map { - ResourceField(it.logicalId, it.meta.versionId, it.meta.lastUpdated.asDdMmmYyyy()) - } + fhirEngine + .search {} + .map { it.resource } + .map { ResourceField(it.logicalId, it.meta.versionId, it.meta.lastUpdated.asDdMmmYyyy()) } return mapOf(Pair("Questionnaire", questionnaire), Pair("StructureMap", structureMaps)) } fun fetchDetails() { try { - viewModelScope.launch @ExcludeFromJacocoGeneratedReport - { + viewModelScope.launch @ExcludeFromJacocoGeneratedReport { val userInfo = keycloakService.fetchUserInfo().body() if (userInfo != null && !userInfo.keycloakUuid.isNullOrEmpty()) { val bundle = diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/InfoCard.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/InfoCard.kt index 0d435986a1..80eff6e1a4 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/InfoCard.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/InfoCard.kt @@ -61,8 +61,10 @@ fun InfoCard(viewModel: SettingsViewModel) { Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.fillMaxWidth() - ) { CircularProgressIndicator(Modifier.testTag("ProgressBarItem")) } + modifier = Modifier.fillMaxWidth(), + ) { + CircularProgressIndicator(Modifier.testTag("ProgressBarItem")) + } is DataLoadState.Error -> Column { Text(text = "Something went wrong while fetching data..") } is DataLoadState.Success -> { val data = (state as DataLoadState.Success).data @@ -71,21 +73,21 @@ fun InfoCard(viewModel: SettingsViewModel) { Column(modifier = Modifier.fillMaxWidth().padding(horizontal = 20.dp)) { Box( modifier = Modifier.clip(CircleShape).background(color = LighterBlue).size(80.dp), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Text( text = username.first().uppercase(), textAlign = TextAlign.Center, fontWeight = FontWeight.Bold, fontSize = 28.sp, - color = BlueTextColor + color = BlueTextColor, ) } Text( text = username.capitalize(Locale.current), fontSize = 22.sp, modifier = Modifier.padding(vertical = 22.dp), - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/ProfileData.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/ProfileData.kt index 491b418cae..e29d9153a9 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/ProfileData.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/ProfileData.kt @@ -26,7 +26,7 @@ data class ProfileData( val organisations: List = listOf(), val careTeams: List = listOf(), val isUserValid: Boolean, - val practitionerDetails: PractitionerDetails? + val practitionerDetails: PractitionerDetails?, ) @ExcludeFromJacocoGeneratedReport data class FieldData(val id: String, val value: String) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreen.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreen.kt index 886c0f289d..35c96d71e7 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreen.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreen.kt @@ -69,7 +69,7 @@ fun SettingsScreen( modifier: Modifier = Modifier, navController: NavController? = null, settingsViewModel: SettingsViewModel = hiltViewModel(), - devViewModel: DevViewModel = hiltViewModel() + devViewModel: DevViewModel = hiltViewModel(), ) { val context = LocalContext.current val devMenuSheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden) @@ -78,7 +78,7 @@ fun SettingsScreen( ModalBottomSheetLayout( sheetState = viewResSheetState, - sheetContent = { ViewResourceReport(devViewModel) } + sheetContent = { ViewResourceReport(devViewModel) }, ) { ModalBottomSheetLayout( sheetState = devMenuSheetState, @@ -89,7 +89,7 @@ fun SettingsScreen( viewResSheetState.show() } } - } + }, ) { Scaffold( topBar = { @@ -99,16 +99,16 @@ fun SettingsScreen( IconButton(onClick = { navController?.popBackStack() }) { Icon(Icons.Default.ArrowBack, "") } - } + }, ) - } + }, ) { paddingValues -> Column( modifier = modifier .padding(paddingValues) .padding(vertical = 20.dp) - .verticalScroll(rememberScrollState()) + .verticalScroll(rememberScrollState()), ) { InfoCard(viewModel = settingsViewModel) Divider(color = DividerColor) @@ -116,26 +116,26 @@ fun SettingsScreen( icon = Icons.Rounded.Download, text = stringResource(R.string.re_fetch_practitioner), clickListener = settingsViewModel::fetchPractitionerDetails, - modifier = modifier + modifier = modifier, ) UserProfileRow( icon = Icons.Rounded.Sync, text = stringResource(id = R.string.sync), clickListener = settingsViewModel::runSync, - modifier = modifier + modifier = modifier, ) UserProfileRow( icon = Icons.Rounded.BugReport, text = stringResource(R.string.dev_menu), clickListener = { scope.launch { devMenuSheetState.show() } }, - modifier = modifier + modifier = modifier, ) UserProfileRow( icon = Icons.Rounded.Logout, text = stringResource(id = R.string.logout), clickListener = { settingsViewModel.logoutUser(context) }, - modifier = modifier + modifier = modifier, ) } } @@ -148,7 +148,7 @@ fun UserProfileRow( icon: ImageVector, text: String, clickListener: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( modifier = @@ -156,7 +156,7 @@ fun UserProfileRow( .fillMaxWidth() .clickable { clickListener() } .padding(vertical = 16.dp, horizontal = 20.dp), - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.SpaceBetween, ) { Row { Icon(imageVector = icon, "", tint = BlueTextColor) @@ -167,7 +167,7 @@ fun UserProfileRow( imageVector = Icons.Rounded.ChevronRight, "", tint = Color.LightGray, - modifier = modifier.wrapContentWidth(Alignment.End) + modifier = modifier.wrapContentWidth(Alignment.End), ) } Divider(color = DividerColor) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsViewModel.kt index 6d9a17331a..2f6a1566a1 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/SettingsViewModel.kt @@ -78,16 +78,18 @@ constructor( profileData.value = DataLoadState.Loading var practitionerName: String? = null - sharedPreferences.read(key = SharedPreferenceKey.PRACTITIONER_ID.name, defaultValue = null) + sharedPreferences + .read(key = SharedPreferenceKey.PRACTITIONER_ID.name, defaultValue = null) ?.let { val practitioner = fhirEngine.get(ResourceType.Practitioner, it) as Practitioner practitionerName = practitioner.nameFirstRep.nameAsSingleString } val organizationIds = - sharedPreferences.read>( + sharedPreferences + .read>( key = ResourceType.Organization.name, - decodeWithGson = true + decodeWithGson = true, ) ?.map { val resource = (fhirEngine.get(ResourceType.Organization, it) as Organization) @@ -95,9 +97,10 @@ constructor( } val locationIds = - sharedPreferences.read>( + sharedPreferences + .read>( key = ResourceType.Location.name, - decodeWithGson = true + decodeWithGson = true, ) ?.map { val resource = (fhirEngine.get(ResourceType.Location, it) as Location) @@ -105,9 +108,10 @@ constructor( } val careTeamIds = - sharedPreferences.read>( + sharedPreferences + .read>( key = ResourceType.CareTeam.name, - decodeWithGson = true + decodeWithGson = true, ) ?.map { val resource = (fhirEngine.get(ResourceType.CareTeam, it) as CareTeam) @@ -124,8 +128,8 @@ constructor( locations = locationIds ?: listOf(), careTeams = careTeamIds ?: listOf(), isUserValid = isValid, - practitionerDetails = null - ) + practitionerDetails = null, + ), ) } catch (e: Exception) { profileData.value = DataLoadState.Error(e) @@ -138,14 +142,14 @@ constructor( fun logoutUser(context: Context) { onLogout.postValue(true) - accountAuthenticator.logout @ExcludeFromJacocoGeneratedReport - { + accountAuthenticator.logout @ExcludeFromJacocoGeneratedReport { context.getActivity()?.launchActivityWithNoBackStackHistory() } } fun retrieveUsername(): String? = - sharedPreferences.read(key = LOGGED_IN_PRACTITIONER, decodeWithGson = true) + sharedPreferences + .read(key = LOGGED_IN_PRACTITIONER, decodeWithGson = true) ?.nameFirstRep ?.nameAsSingleString diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/DevMenu.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/DevMenu.kt index 6059bdfdfb..0c8f314dc4 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/DevMenu.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/DevMenu.kt @@ -38,22 +38,25 @@ fun DevMenu(viewModel: DevViewModel, viewRes: () -> Unit) { val scope = rememberCoroutineScope() Column( verticalArrangement = Arrangement.spacedBy(6.dp), - modifier = Modifier.padding(16.dp).fillMaxWidth() + modifier = Modifier.padding(16.dp).fillMaxWidth(), ) { Button( modifier = Modifier.fillMaxWidth(), onClick = - @ExcludeFromJacocoGeneratedReport - { + @ExcludeFromJacocoGeneratedReport { scope.launch @ExcludeFromJacocoGeneratedReport { viewModel.createResourceReport(context) } - } - ) { Text(text = "Export Report Resources") } + }, + ) { + Text(text = "Export Report Resources") + } Button(modifier = Modifier.fillMaxWidth(), onClick = viewRes) { Text(text = "View Report Resources") } Button( modifier = Modifier.fillMaxWidth(), - onClick = @ExcludeFromJacocoGeneratedReport { viewModel.fetchDetails() } - ) { Text(text = "Test Fetch") } + onClick = @ExcludeFromJacocoGeneratedReport { viewModel.fetchDetails() }, + ) { + Text(text = "Test Fetch") + } } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/ViewResources.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/ViewResources.kt index c477b645d9..2d145f97f5 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/ViewResources.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/settings/views/ViewResources.kt @@ -47,28 +47,25 @@ import org.smartregister.fhircore.engine.util.annotation.ExcludeFromJacocoGenera fun ViewResourceReport(viewModel: DevViewModel) { var data by remember { mutableStateOf(mapOf>()) } - LaunchedEffect(viewModel) @ExcludeFromJacocoGeneratedReport - { + LaunchedEffect(viewModel) @ExcludeFromJacocoGeneratedReport { data = viewModel.getResourcesToReport() } Scaffold { paddingValues -> LazyColumn( verticalArrangement = Arrangement.spacedBy(8.dp), - modifier = Modifier.padding(paddingValues).padding(horizontal = 12.dp) - ) @ExcludeFromJacocoGeneratedReport - { + modifier = Modifier.padding(paddingValues).padding(horizontal = 12.dp), + ) @ExcludeFromJacocoGeneratedReport { data.entries.forEach { group -> run { - stickyHeader @ExcludeFromJacocoGeneratedReport - { + stickyHeader @ExcludeFromJacocoGeneratedReport { Text(text = group.key, style = MaterialTheme.typography.h5) } items(group.value) { item -> Card(Modifier.fillMaxWidth()) { Column( verticalArrangement = Arrangement.spacedBy(4.dp), - modifier = Modifier.padding(6.dp).fillMaxWidth() + modifier = Modifier.padding(6.dp).fillMaxWidth(), ) { Chip(onClick = {}, enabled = false) { Text(text = item.version) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/theme/Themes.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/theme/Themes.kt index 561b65de64..974e5a941b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/theme/Themes.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/theme/Themes.kt @@ -26,6 +26,9 @@ import androidx.compose.runtime.Composable * To enable app theme set darkTheme = isSystemInDarkTheme */ @Composable -fun AppTheme(darkTheme: Boolean = false, content: (@Composable() () -> Unit)) { +fun AppTheme( + darkTheme: Boolean = false, + content: (@Composable() () -> Unit), +) { MaterialTheme(colors = if (darkTheme) DarkColors else LightColors, content = content) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileFragment.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileFragment.kt index a5760af227..6bd401262d 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileFragment.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileFragment.kt @@ -39,16 +39,16 @@ class UserProfileFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { return ComposeView(requireContext()).apply { setContent { AppTheme { UserProfileScreen() } } } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - userProfileViewModel.onLogout.observe(viewLifecycleOwner) { shouldLogout: Boolean? -> - if (shouldLogout != null && shouldLogout) + if (shouldLogout != null && shouldLogout) { AlertDialogue.showProgressAlert(requireActivity(), R.string.logging_out) + } } userProfileViewModel.language.observe(viewLifecycleOwner) { language: Language? -> diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileScreen.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileScreen.kt index 4e2625c3a3..eaf6615b04 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileScreen.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileScreen.kt @@ -66,9 +66,8 @@ import org.smartregister.fhircore.engine.ui.theme.LighterBlue @Composable fun UserProfileScreen( modifier: Modifier = Modifier, - userProfileViewModel: UserProfileViewModel = hiltViewModel() + userProfileViewModel: UserProfileViewModel = hiltViewModel(), ) { - val username by remember { mutableStateOf(userProfileViewModel.retrieveUsername()) } var expanded by remember { mutableStateOf(false) } val context = LocalContext.current @@ -78,21 +77,21 @@ fun UserProfileScreen( Column(modifier = modifier.fillMaxWidth().padding(horizontal = 20.dp)) { Box( modifier = modifier.clip(CircleShape).background(color = LighterBlue).size(80.dp), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Text( text = username!!.first().uppercase(), textAlign = TextAlign.Center, fontWeight = FontWeight.Bold, fontSize = 28.sp, - color = BlueTextColor + color = BlueTextColor, ) } Text( text = username!!.capitalize(Locale.current), fontSize = 22.sp, modifier = modifier.padding(vertical = 22.dp), - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) } } @@ -101,7 +100,7 @@ fun UserProfileScreen( icon = Icons.Rounded.Sync, text = stringResource(id = R.string.sync), clickListener = userProfileViewModel::runSync, - modifier = modifier + modifier = modifier, ) // Language option @@ -112,14 +111,14 @@ fun UserProfileScreen( .fillMaxWidth() .clickable { expanded = true } .padding(vertical = 16.dp, horizontal = 20.dp), - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.SpaceBetween, ) { Row(modifier = Modifier.align(Alignment.CenterVertically)) { Icon( painterResource(R.drawable.ic_outline_language_black), stringResource(R.string.language), tint = BlueTextColor, - modifier = Modifier.size(26.dp) + modifier = Modifier.size(26.dp), ) Spacer(modifier = modifier.width(20.dp)) Text(text = stringResource(id = R.string.language), fontSize = 18.sp) @@ -129,12 +128,12 @@ fun UserProfileScreen( text = userProfileViewModel.loadSelectedLanguage(), fontSize = 18.sp, fontWeight = FontWeight.Bold, - modifier = modifier.wrapContentWidth(Alignment.End) + modifier = modifier.wrapContentWidth(Alignment.End), ) DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false }, - modifier = modifier.wrapContentWidth(Alignment.End) + modifier = modifier.wrapContentWidth(Alignment.End), ) { for (language in userProfileViewModel.languages) { DropdownMenuItem(onClick = { userProfileViewModel.setLanguage(language) }) { @@ -147,7 +146,7 @@ fun UserProfileScreen( imageVector = Icons.Rounded.ChevronRight, "", tint = Color.LightGray, - modifier = modifier.wrapContentWidth(Alignment.End) + modifier = modifier.wrapContentWidth(Alignment.End), ) } Divider(color = DividerColor) @@ -157,7 +156,7 @@ fun UserProfileScreen( icon = Icons.Rounded.Logout, text = stringResource(id = R.string.logout), clickListener = { userProfileViewModel.logoutUser(context) }, - modifier = modifier + modifier = modifier, ) } } @@ -167,7 +166,7 @@ fun UserProfileRow( icon: ImageVector, text: String, clickListener: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( modifier = @@ -175,7 +174,7 @@ fun UserProfileRow( .fillMaxWidth() .clickable { clickListener() } .padding(vertical = 16.dp, horizontal = 20.dp), - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.SpaceBetween, ) { Row { Icon(imageVector = icon, "", tint = BlueTextColor) @@ -186,7 +185,7 @@ fun UserProfileRow( imageVector = Icons.Rounded.ChevronRight, "", tint = Color.LightGray, - modifier = modifier.wrapContentWidth(Alignment.End) + modifier = modifier.wrapContentWidth(Alignment.End), ) } Divider(color = DividerColor) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileViewModel.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileViewModel.kt index 88409bad9f..70ab686d4a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileViewModel.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileViewModel.kt @@ -42,7 +42,7 @@ constructor( val accountAuthenticator: AccountAuthenticator, val secureSharedPreference: SecureSharedPreference, val sharedPreferencesHelper: SharedPreferencesHelper, - val configurationRegistry: ConfigurationRegistry + val configurationRegistry: ConfigurationRegistry, ) : ViewModel() { val languages by lazy { configurationRegistry.fetchLanguages() } @@ -68,7 +68,7 @@ constructor( fun loadSelectedLanguage(): String = Locale.forLanguageTag( - sharedPreferencesHelper.read(SharedPreferenceKey.LANG.name, Locale.UK.toLanguageTag())!! + sharedPreferencesHelper.read(SharedPreferenceKey.LANG.name, Locale.UK.toLanguageTag())!!, ) .displayName diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/AppDataStore.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/AppDataStore.kt index 68e4e6d10b..9e6ab1b76c 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/AppDataStore.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/AppDataStore.kt @@ -28,9 +28,10 @@ import javax.inject.Inject import kotlinx.coroutines.flow.first import org.hl7.fhir.r4.model.ResourceType -private val Context.dataStorage: DataStore by preferencesDataStore( - name = "app_datastore" -) +private val Context.dataStorage: DataStore by + preferencesDataStore( + name = "app_datastore", + ) /** * Stores the lastUpdated timestamp per resource to be used by [DownloadWorkManager]'s diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/DateUtils.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/DateUtils.kt index f02bcbcd56..93e589d410 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/DateUtils.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/DateUtils.kt @@ -38,12 +38,13 @@ object DateUtils { initialDate: String, daysToAdd: Int = 0, returnDateFormat: String = "M-d-Y", - dateTimeFormat: String? = null + dateTimeFormat: String? = null, ): String { val fmt: DateTimeFormatter = DateTimeFormat.forPattern(returnDateFormat) val date: DateTime = - if (dateTimeFormat == null) DateTime.parse(initialDate) - else DateTime.parse(initialDate, DateTimeFormat.forPattern(dateTimeFormat)) + if (dateTimeFormat == null) { + DateTime.parse(initialDate) + } else DateTime.parse(initialDate, DateTimeFormat.forPattern(dateTimeFormat)) return date.plusDays(daysToAdd).toString(fmt) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/DispatcherProvider.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/DispatcherProvider.kt index 68d7e44734..60637930cd 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/DispatcherProvider.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/DispatcherProvider.kt @@ -22,8 +22,11 @@ import kotlinx.coroutines.Dispatchers interface DispatcherProvider { fun main(): CoroutineDispatcher = Dispatchers.Main + fun default(): CoroutineDispatcher = Dispatchers.Default + fun io(): CoroutineDispatcher = Dispatchers.IO + fun unconfined(): CoroutineDispatcher = Dispatchers.Unconfined } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/FileUtil.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/FileUtil.kt index 2af8554784..97b9609444 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/FileUtil.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/FileUtil.kt @@ -34,6 +34,7 @@ object FileUtil { /** * This method loads a property value from a .config file in android assets + * * @param key property key * @param context Android application context * @param fileName File name @@ -46,6 +47,7 @@ object FileUtil { /** * Method to read Json from file and return string + * * @param fileName File name */ @Throws(IOException::class) @@ -58,7 +60,7 @@ object FileUtil { context: Context, fileName: String, body: String = "", - dirName: String + dirName: String, ) { val dir = File(context.filesDir, dirName) if (!dir.exists()) { @@ -81,6 +83,7 @@ object FileUtil { /** * Method for returning all files in a dir + * * @param dir Directory to recurse */ @Throws(IOException::class) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecureSharedPreference.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecureSharedPreference.kt index 481bfc5bc5..9d26d0aec4 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecureSharedPreference.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecureSharedPreference.kt @@ -38,7 +38,7 @@ class SecureSharedPreference @Inject constructor(@ApplicationContext val context SECURE_STORAGE_FILE_NAME, getMasterKey(), EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, - EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM, ) private fun getMasterKey() = @@ -55,7 +55,7 @@ class SecureSharedPreference @Inject constructor(@ApplicationContext val context salt = Base64.getEncoder().encodeToString(randomSaltBytes), passwordHash = password.toPasswordHash(randomSaltBytes), ) - .encodeJson() + .encodeJson(), ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecurityUtil.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecurityUtil.kt index 1764380da9..3f9536920a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecurityUtil.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecurityUtil.kt @@ -30,8 +30,11 @@ fun passwordHashString(password: CharArray, salt: ByteArray): String { val pbKeySpec = PBEKeySpec(password, salt, 1000000, 256) val secretKeyFactory = SecretKeyFactory.getInstance( - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) "PBKDF2withHmacSHA256" - else "PBKDF2WithHmacSHA1" + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + "PBKDF2withHmacSHA256" + } else { + "PBKDF2WithHmacSHA1" + }, ) return secretKeyFactory.generateSecret(pbKeySpec).encoded.toString(StandardCharsets.UTF_8) } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferenceKey.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferenceKey.kt index d4419c8a1a..a7f712bbe3 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferenceKey.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferenceKey.kt @@ -27,5 +27,5 @@ enum class SharedPreferenceKey { REMOTE_SYNC_RESOURCES, OVERDUE_TASK_LAST_AUTHORED_ON_DATE, LOGIN_CREDENTIAL_KEY, - LOGIN_PIN_KEY + LOGIN_PIN_KEY, } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelper.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelper.kt index 1da5a76af4..b1aae61bdf 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelper.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelper.kt @@ -73,20 +73,21 @@ constructor(@ApplicationContext val context: Context, val gson: Gson) { /** Read any JSON object with type T */ inline fun read(key: String, decodeWithGson: Boolean = true): T? = - if (decodeWithGson) + if (decodeWithGson) { try { gson.fromJson(this.read(key, null), T::class.java) } catch (jsonIoException: JsonIOException) { Timber.e(jsonIoException) null } - else + } else { try { this.read(key, null)?.decodeJson() } catch (serializationException: SerializationException) { Timber.e(serializationException) null } + } /** Write any object by saving it as JSON */ inline fun write(key: String, value: T?, encodeWithGson: Boolean = true) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/TracingHelpers.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/TracingHelpers.kt index e426f8e1d5..bb269f4eca 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/TracingHelpers.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/TracingHelpers.kt @@ -33,9 +33,10 @@ object TracingHelpers { "art-client-sexual-contact-registration", "art-client-sibling-contact-registration", "art-client-social-network-contact-registration", - "contact-and-community-positive-hiv-test-and-next-appointment" + "contact-and-community-positive-hiv-test-and-next-appointment", ) const val tracingBundleId = "tracing" + fun requireTracingTasks(id: String): Boolean = tracingQuestionnaires.firstOrNull { x -> x == id } != null } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/AndroidExtensions.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/AndroidExtensions.kt index 144bddd3de..7a9e6970a9 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/AndroidExtensions.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/AndroidExtensions.kt @@ -113,7 +113,7 @@ fun Context.isDeviceOnline(): Boolean { NetworkCapabilities.TRANSPORT_ETHERNET, NetworkCapabilities.TRANSPORT_CELLULAR, NetworkCapabilities.TRANSPORT_WIFI, - NetworkCapabilities.TRANSPORT_VPN + NetworkCapabilities.TRANSPORT_VPN, ) return transports.any { capabilities.hasTransport(it) } @@ -126,7 +126,7 @@ fun Context.isDeviceOnline(): Boolean { */ inline fun Activity.launchActivityWithNoBackStackHistory( finishLauncherActivity: Boolean = true, - bundle: Bundle = bundleOf() + bundle: Bundle = bundleOf(), ) { startActivity( Intent(this, A::class.java).apply { @@ -134,7 +134,7 @@ inline fun Activity.launchActivityWithNoBackStackHistory( addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) putExtras(bundle) - } + }, ) if (finishLauncherActivity) finish() } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ApplicationExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ApplicationExtension.kt index c779a0604e..2c4f423c04 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ApplicationExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ApplicationExtension.kt @@ -50,15 +50,15 @@ fun Context.loadResourceTemplate(id: String, clazz: Class, data: Map json = json.replace(it.key, v) } } - return if (Resource::class.java.isAssignableFrom(clazz)) + return if (Resource::class.java.isAssignableFrom(clazz)) { FhirContext.forR4Cached().newJsonParser().parseResource(json) as T - else Gson().fromJson(json, clazz) + } else Gson().fromJson(json, clazz) } suspend fun FhirEngine.searchActivePatients( query: String, pageNumber: Int, - loadAll: Boolean = false + loadAll: Boolean = false, ) = this.search { filter(Patient.ACTIVE, { value = of(true) }) @@ -68,13 +68,14 @@ suspend fun FhirEngine.searchActivePatients( { modifier = StringFilterModifier.CONTAINS value = query.trim() - } + }, ) } sort(Patient.NAME, Order.ASCENDING) count = - if (loadAll) this@searchActivePatients.countActivePatients().toInt() - else PaginationConstant.DEFAULT_PAGE_SIZE + if (loadAll) { + this@searchActivePatients.countActivePatients().toInt() + } else PaginationConstant.DEFAULT_PAGE_SIZE from = pageNumber * PaginationConstant.DEFAULT_PAGE_SIZE } @@ -83,8 +84,7 @@ suspend fun FhirEngine.countActivePatients(): Long = suspend fun FhirEngine.loadRelatedPersons(patientId: String): List? { return try { - this@loadRelatedPersons - .search { + this@loadRelatedPersons.search { apply { filter(RelatedPerson.PATIENT, { value = "Patient/$patientId" }) }.getQuery() } .map { it.resource } @@ -95,8 +95,7 @@ suspend fun FhirEngine.loadRelatedPersons(patientId: String): List? { return try { - this@loadPatientImmunizations - .search { + this@loadPatientImmunizations.search { filter(Immunization.PATIENT, { value = "Patient/$patientId" }) apply { filter(Immunization.PATIENT, { value = "Patient/$patientId" }) }.getQuery() } @@ -110,7 +109,7 @@ suspend fun FhirEngine.loadCqlLibraryBundle( context: Context, sharedPreferencesHelper: SharedPreferencesHelper, fhirOperator: FhirOperator, - resourcesBundlePath: String + resourcesBundlePath: String, ) = try { val jsonParser = FhirContext.forR4().newJsonParser() @@ -127,7 +126,7 @@ suspend fun FhirEngine.loadCqlLibraryBundle( create(entry.resource) sharedPreferencesHelper.write( SharedPreferencesHelper.MEASURE_RESOURCES_LOADED, - savedResources.plus(",").plus(resourcesBundlePath) + savedResources.plus(",").plus(resourcesBundlePath), ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/CarePlanExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/CarePlanExtension.kt index d7c210a95d..1d5220b4e7 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/CarePlanExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/CarePlanExtension.kt @@ -45,19 +45,21 @@ fun CarePlan.CarePlanActivityDetailComponent.ended(): Boolean = scheduledPeriod?.end?.before(Date()) ?: false fun CarePlan.CarePlanActivityComponent.due() = - if (!hasDetail()) true - else + if (!hasDetail()) { + true + } else detail.status.isIn( CarePlan.CarePlanActivityStatus.SCHEDULED, - CarePlan.CarePlanActivityStatus.NOTSTARTED + CarePlan.CarePlanActivityStatus.NOTSTARTED, ) && detail.started() && !detail.ended() fun CarePlan.CarePlanActivityComponent.overdue() = - if (!hasDetail()) false - else + if (!hasDetail()) { + false + } else detail.status.isIn( CarePlan.CarePlanActivityStatus.SCHEDULED, - CarePlan.CarePlanActivityStatus.NOTSTARTED + CarePlan.CarePlanActivityStatus.NOTSTARTED, ) && detail.ended() fun CarePlan.CarePlanStatus.toCoding() = Coding(this.system, this.toCode(), this.display) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/DateTimeExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/DateTimeExtension.kt index f9c11069d0..9b0192143f 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/DateTimeExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/DateTimeExtension.kt @@ -52,8 +52,9 @@ fun Date.toHumanDisplay(): String = SimpleDateFormat("MMM d, yyyy h:mm:ss a", Locale.getDefault()).format(this) fun Date?.makeItReadable(): String { - return if (this == null) "N/A" - else { + return if (this == null) { + "N/A" + } else { SimpleDateFormat("dd-MMM-yyyy", Locale.getDefault()).run { format(this@makeItReadable) } } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/FhirContextExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/FhirContextExtension.kt index 655248d10c..1f5606adef 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/FhirContextExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/FhirContextExtension.kt @@ -31,7 +31,7 @@ fun FhirContext.getCustomJsonParser(): IParser { LocationHierarchy::class.java, // KeycloakUserDetails::class.java, // UserBioData::class.java - ) + ), ) } .newJsonParser() diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/FhirEngineExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/FhirEngineExtension.kt index 57d9f6da3c..85cc3522fc 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/FhirEngineExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/FhirEngineExtension.kt @@ -64,25 +64,29 @@ suspend fun FhirEngine.loadLibraryAtPath(fhirOperator: FhirOperator, path: Strin suspend fun FhirEngine.loadLibraryAtPath( fhirOperator: FhirOperator, - relatedArtifact: RelatedArtifact + relatedArtifact: RelatedArtifact, ) { - if (relatedArtifact.type.isIn( + if ( + relatedArtifact.type.isIn( RelatedArtifact.RelatedArtifactType.COMPOSEDOF, - RelatedArtifact.RelatedArtifactType.DEPENDSON + RelatedArtifact.RelatedArtifactType.DEPENDSON, ) - ) + ) { loadLibraryAtPath(fhirOperator, relatedArtifact.resource) + } } suspend fun FhirEngine.loadCqlLibraryBundle(fhirOperator: FhirOperator, measurePath: String) = try { // resource path could be Measure/123 OR something like http://fhir.labs.common/Measure/123 val measure: Measure? = - if (UrlUtil.isValid(measurePath)) + if (UrlUtil.isValid(measurePath)) { search { filter(Measure.URL, { value = measurePath }) } .map { it.resource } .firstOrNull() - else get(measurePath) + } else { + get(measurePath) + } measure?.apply { relatedArtifact.forEach { loadLibraryAtPath(fhirOperator, it) } @@ -94,11 +98,10 @@ suspend fun FhirEngine.loadCqlLibraryBundle(fhirOperator: FhirOperator, measureP suspend fun FhirEngine.addDateTimeIndex() { try { - search { SearchQuery( "CREATE INDEX IF NOT EXISTS `index_DateTimeIndexEntity_index_from` ON `DateTimeIndexEntity` (`index_from`)", - emptyList() + emptyList(), ) } } catch (ex: SQLException) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/PatientExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/PatientExtension.kt index b5ec25fc10..c5055a0028 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/PatientExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/PatientExtension.kt @@ -44,7 +44,9 @@ fun List.canonicalName(): String { (humanName.given + humanName.family).filterNotNull().joinToString(" ") { it.toString().trim().capitalizeFirstLetter() } - } else "" + } else { + "" + } } fun Patient.extractName(): String { @@ -56,7 +58,9 @@ fun List.familyName(): String { val humanName = this.firstOrNull() return if (humanName != null) { humanName.family?.capitalizeFirstLetter()?.plus(" Family") ?: "" - } else "" + } else { + "" + } } fun Patient.extractFamilyName(): String { @@ -68,7 +72,9 @@ fun List.givenName(): String { val humanName = this.firstOrNull() return if (humanName != null) { humanName.given?.toString()?.trim('[')?.trim(']')?.capitalizeFirstLetter() ?: "" - } else "" + } else { + "" + } } fun Patient.extractGivenName(): String { @@ -87,7 +93,9 @@ fun Patient.extractGender(context: Context): String? = AdministrativeGender.UNKNOWN -> context.getString(R.string.unknown) AdministrativeGender.NULL -> "" } - } else null + } else { + null + } fun Patient.extractAge(): String { if (!hasBirthDate()) return "" @@ -116,16 +124,24 @@ fun getAgeStringFromDays(days: Long): String { } else if (days >= DAYS_IN_YEAR) { if (elapsedMonths > 0) { "$elapseYearsString $elapseMonthsString" - } else elapseYearsString + } else { + elapseYearsString + } } else if (days >= DAYS_IN_MONTH) { if (elapsedWeeks > 0) { "$elapseMonthsString $elapseWeeksString" - } else elapseMonthsString + } else { + elapseMonthsString + } } else if (days >= DAYS_IN_WEEK) { if (elapsedDays > 0) { "$elapseWeeksString $elapseDaysString" - } else elapseWeeksString - } else elapseDaysString + } else { + elapseWeeksString + } + } else { + elapseDaysString + } } fun Patient.atRisk() = @@ -135,14 +151,15 @@ fun Patient.getLastSeen(immunizations: List): String { return immunizations .maxByOrNull { it.protocolAppliedFirstRep.doseNumberPositiveIntType.value } ?.occurrenceDateTimeType - ?.toDisplay() - ?: this.meta?.lastUpdated.lastSeenFormat() + ?.toDisplay() ?: this.meta?.lastUpdated.lastSeenFormat() } fun Date?.lastSeenFormat(): String { return if (this != null) { SimpleDateFormat("MM-dd-yyyy", Locale.ENGLISH).run { format(this@lastSeenFormat) } - } else "" + } else { + "" + } } fun Address.canonical(): String { @@ -208,9 +225,10 @@ fun List.hasActivePregnancy() = // is active and any of the display / text in code is pregnant val active = condition.clinicalStatus.coding.any { it.code == "active" } val pregnancy = - condition.code.coding.map { it.display }.plus(condition.code.text).any { - it.contentEquals("pregnant", true) - } + condition.code.coding + .map { it.display } + .plus(condition.code.text) + .any { it.contentEquals("pregnant", true) } active && pregnancy } @@ -219,9 +237,10 @@ fun List.activelyBreastfeeding() = this.any { condition -> val active = condition.clinicalStatus.coding.any { it.code == "active" } val pregnancy = - condition.code.coding.map { it.display }.plus(condition.code.text).any { - it.contentEquals("breastfeeding", true) - } + condition.code.coding + .map { it.display } + .plus(condition.code.text) + .any { it.contentEquals("breastfeeding", true) } active && pregnancy } @@ -229,11 +248,14 @@ fun List.activelyBreastfeeding() = fun List.pregnancyCondition(): Condition { var pregnancyCondition = Condition() this.forEach { condition -> - if (condition.code.coding.map { it.display }.plus(condition.code.text).any { - it.contentEquals("pregnant", true) - } - ) + if ( + condition.code.coding + .map { it.display } + .plus(condition.code.text) + .any { it.contentEquals("pregnant", true) } + ) { pregnancyCondition = condition + } } return pregnancyCondition @@ -254,16 +276,19 @@ fun Patient.extractSecondaryIdentifier(): String? { } fun Patient.extractOfficialIdentifier(): String? = - if (this.hasIdentifier()) + if (this.hasIdentifier()) { this.identifier.firstOrNull { it.use == Identifier.IdentifierUse.OFFICIAL }?.value - else null + } else { + null + } fun Coding.toHealthStatus(): HealthStatus { return try { HealthStatus.valueOf(this.code.uppercase(Locale.getDefault()).replace("-", "_")).apply { this@apply.display = when (this@apply) { - HealthStatus.NEWLY_DIAGNOSED_CLIENT, HealthStatus.CLIENT_ALREADY_ON_ART -> "ART Client" + HealthStatus.NEWLY_DIAGNOSED_CLIENT, + HealthStatus.CLIENT_ALREADY_ON_ART, -> "ART Client" HealthStatus.COMMUNITY_POSITIVE -> "No Conf Test" else -> this@toHealthStatus.display } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/QuestionnaireExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/QuestionnaireExtension.kt index 207c6bebfd..e6b7ae35e9 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/QuestionnaireExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/QuestionnaireExtension.kt @@ -36,9 +36,9 @@ fun Questionnaire.isExtractionCandidate() = this.extension.any { it.url.contains("sdc-questionnaire-itemExtractionContext") } fun Questionnaire.cqfLibraryIds() = - this.extension.filter { it.url.contains("cqf-library") }.mapNotNull { - it.value?.asStringValue()?.replace("Library/", "") - } + this.extension + .filter { it.url.contains("cqf-library") } + .mapNotNull { it.value?.asStringValue()?.replace("Library/", "") } fun QuestionnaireResponse.findSubject(bundle: Bundle) = IdType(this.subject.reference).let { subject -> @@ -52,14 +52,14 @@ fun Questionnaire.find(linkId: String): Questionnaire.QuestionnaireItemComponent } fun QuestionnaireResponse.find( - linkId: String + linkId: String, ): QuestionnaireResponse.QuestionnaireResponseItemComponent? { return item.find(linkId, null) } fun List.find( linkId: String, - default: QuestionnaireResponse.QuestionnaireResponseItemComponent? + default: QuestionnaireResponse.QuestionnaireResponseItemComponent?, ): QuestionnaireResponse.QuestionnaireResponseItemComponent? { var result = default run loop@{ @@ -81,12 +81,12 @@ fun List.find( enum class FieldType { DEFINITION, LINK_ID, - TYPE + TYPE, } fun Questionnaire.find( fieldType: FieldType, - value: String + value: String, ): List { val result = mutableListOf() item.find(fieldType, value, result) @@ -96,7 +96,7 @@ fun Questionnaire.find( fun List.find( fieldType: FieldType, value: String, - target: MutableList + target: MutableList, ) { forEach { when (fieldType) { @@ -124,16 +124,17 @@ fun List.find( /** To ensure multiple linkId only when they have answers, otherwise only have one distinct */ fun QuestionnaireResponse.distinctifyLinkId() { fun distinctLinkId( - itemComponents: List + itemComponents: List, ): List { return itemComponents .groupBy { it.linkId } .flatMap { - it.value.filter(QuestionnaireResponse.QuestionnaireResponseItemComponent::hasAnswer) + it.value + .filter(QuestionnaireResponse.QuestionnaireResponseItemComponent::hasAnswer) .ifEmpty { it.value.distinctBy { elem -> elem.item.joinToString( - transform = QuestionnaireResponse.QuestionnaireResponseItemComponent::getLinkId + transform = QuestionnaireResponse.QuestionnaireResponseItemComponent::getLinkId, ) } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ReferenceExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ReferenceExtension.kt index 990a842255..11172cd067 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ReferenceExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ReferenceExtension.kt @@ -20,8 +20,9 @@ import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.ResourceType fun Reference.extractId(): String = - if (this.reference.isNullOrEmpty()) "" - else this.reference.substringAfterLast(delimiter = '/', missingDelimiterValue = "") + if (this.reference.isNullOrEmpty()) { + "" + } else this.reference.substringAfterLast(delimiter = '/', missingDelimiterValue = "") fun String.asReference(resourceType: ResourceType): Reference { val resourceId = this diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ResourceExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ResourceExtension.kt index 9a07a5a089..ce2fe9751a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ResourceExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ResourceExtension.kt @@ -142,7 +142,7 @@ fun QuestionnaireResponse.generateMissingItems(questionnaire: Questionnaire) = questionnaire.item.generateMissingItems(this.item) fun List.generateMissingItems( - qrItems: MutableList + qrItems: MutableList, ) { this.forEachIndexed { index, qItem -> // generate complete hierarchy if response item missing otherwise check for nested items @@ -151,6 +151,7 @@ fun List.generateMissingItems( } else qItem.item.generateMissingItems(qrItems[index].item) } } + /** * Set all questions that are not of type [Questionnaire.QuestionnaireItemType.GROUP] to readOnly if * [readOnly] is true. This also generates the correct FHIRPath population expression for each @@ -165,12 +166,12 @@ fun List.prepareQuestionsForReadingOrE item.readOnly = readOnly item.item.prepareQuestionsForReadingOrEditing( "$path.where(linkId = '${item.linkId}').answer.item", - readOnly + readOnly, ) } else { item.item.prepareQuestionsForReadingOrEditing( "$path.where(linkId = '${item.linkId}').item", - readOnly + readOnly, ) } } @@ -195,8 +196,9 @@ fun QuestionnaireResponse.retainMetadata(questionnaireResponse: QuestionnaireRes } fun QuestionnaireResponse.assertSubject() { - if (!this.hasSubject() || !this.subject.hasReference()) + if (!this.hasSubject() || !this.subject.hasReference()) { throw IllegalStateException("QuestionnaireResponse must have a subject reference assigned") + } } fun QuestionnaireResponse.getEncounterId(): String? { @@ -282,10 +284,8 @@ fun ArrayList.asCarePlanDomainResource(): ArrayList { * A function that extracts only the UUID part of a resource logicalId. * * Examples: - * * 1. "Group/0acda8c9-3fa3-40ae-abcd-7d1fba7098b4/_history/2" returns - * "0acda8c9-3fa3-40ae-abcd-7d1fba7098b4". - * + * "0acda8c9-3fa3-40ae-abcd-7d1fba7098b4". * 2. "Group/0acda8c9-3fa3-40ae-abcd-7d1fba7098b4" returns "0acda8c9-3fa3-40ae-abcd-7d1fba7098b4". */ fun String.extractLogicalIdUuid() = this.substringAfter("/").substringBefore("/") diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/SearchExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/SearchExtension.kt index bc5a53594c..9599ab959e 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/SearchExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/SearchExtension.kt @@ -31,7 +31,7 @@ import org.smartregister.fhircore.engine.configuration.view.asCoding fun Search.filterByResourceTypeId( reference: ReferenceClientParam, resourceType: ResourceType, - resourceId: String + resourceId: String, ) { filter(reference, { value = "${resourceType.name}/$resourceId" }) } @@ -39,7 +39,7 @@ fun Search.filterByResourceTypeId( fun Search.filterByResourceTypeId( token: TokenClientParam, resourceType: ResourceType, - resourceId: String + resourceId: String, ) { filter(token, { value = of("${resourceType.name}/$resourceId") }) } @@ -51,7 +51,7 @@ fun Search.filterByPatientName(name: String?) { { modifier = StringFilterModifier.CONTAINS value = name.trim() - } + }, ) } } @@ -86,7 +86,7 @@ fun Search.filterString(filter: SearchFilter) { { this.modifier = StringFilterModifier.MATCHES_EXACTLY this.value = filter.valueString!! - } + }, ) Enumerations.DataType.BOOLEAN -> filter( @@ -94,7 +94,7 @@ fun Search.filterString(filter: SearchFilter) { { this.modifier = StringFilterModifier.MATCHES_EXACTLY this.value = filter.valueBoolean.toString() - } + }, ) else -> throw UnsupportedOperationException("SDK does not support value type ${filter.valueType}") diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/TaskExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/TaskExtension.kt index 708123987a..ab4d8c3f5a 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/TaskExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/TaskExtension.kt @@ -38,8 +38,7 @@ fun Task.hasStarted() = fun Task.TaskStatus.toCoding() = Coding(this.system, this.toCode(), this.display) fun Task.clinicVisitOrder(systemTag: String): Double? = - this.meta - .tag + this.meta.tag .asSequence() .filter { it.system.equals(systemTag, true) } .filter { !it.code.isNullOrBlank() } @@ -52,9 +51,9 @@ fun Task.clinicVisitOrder(systemTag: String): Double? = .lastOrNull() fun Task.isGuardianVisit(systemTag: String) = - this.meta.tag.filter { it.system.equals(systemTag, true) }.any { - it.code.replace("_", "-").equals(GUARDIAN_VISIT_CODE, true) - } + this.meta.tag + .filter { it.system.equals(systemTag, true) } + .any { it.code.replace("_", "-").equals(GUARDIAN_VISIT_CODE, true) } fun Task.isNotCompleted() = this.status != Task.TaskStatus.COMPLETED @@ -63,8 +62,9 @@ fun Task.canBeCompleted() = this.hasReasonReference().and(this.isNotCompleted()) fun Task.extractedTracingCategoryIsPhone(filterTag: String): Boolean { val tagList = this.meta.tag.filter { it.system.equals(filterTag, true) }.filterNot { it.code.isNullOrBlank() } - return if (filterTag.isEmpty() || tagList.isEmpty()) false - else { + return if (filterTag.isEmpty() || tagList.isEmpty()) { + false + } else { tagList.last().code.equals("phone-tracing") } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ViewExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ViewExtension.kt index 9437ece943..46acd5b9a5 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ViewExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/ViewExtension.kt @@ -38,7 +38,7 @@ enum class DrawablePosition(val position: Int) { DRAWABLE_LEFT(0), DRAWABLE_TOP(1), DRAWABLE_RIGHT(2), - DRAWABLE_BOTTOM(3) + DRAWABLE_BOTTOM(3), } @SuppressLint("ClickableViewAccessibility") @@ -47,7 +47,8 @@ fun EditText.addOnDrawableClickListener(drawablePosition: DrawablePosition, onCl object : View.OnTouchListener { override fun onTouch(view: View?, motionEvent: MotionEvent?): Boolean { if (motionEvent == null || view == null) return false - if (motionEvent.action == MotionEvent.ACTION_UP && + if ( + motionEvent.action == MotionEvent.ACTION_UP && (view as EditText).isDrawableClicked(drawablePosition, motionEvent) ) { onClicked() @@ -55,7 +56,7 @@ fun EditText.addOnDrawableClickListener(drawablePosition: DrawablePosition, onCl } return false } - } + }, ) } @@ -70,7 +71,8 @@ private fun EditText.isDrawableClicked( (this.right - this.compoundDrawables[drawablePosition.position].bounds.width()) DrawablePosition.DRAWABLE_LEFT -> motionEvent.rawX <= (this.compoundDrawables[drawablePosition.position].bounds.width()) - DrawablePosition.DRAWABLE_TOP, DrawablePosition.DRAWABLE_BOTTOM -> return false + DrawablePosition.DRAWABLE_TOP, + DrawablePosition.DRAWABLE_BOTTOM, -> return false } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/AppConfigService.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/AppConfigService.kt index c30450fe42..20af7ef47e 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/AppConfigService.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/AppConfigService.kt @@ -34,7 +34,7 @@ class AppConfigService @Inject constructor(@ApplicationContext val context: Cont oauthServerBaseUrl = "http://fake.keycloak.url.com", clientId = "fake-client-id", clientSecret = "siri-fake", - accountType = context.packageName + accountType = context.packageName, ) override fun defineResourceTags() = @@ -45,7 +45,7 @@ class AppConfigService @Inject constructor(@ApplicationContext val context: Cont Coding().apply { system = CARETEAM_SYSTEM display = CARETEAM_DISPLAY - } + }, ), ResourceTag( type = ResourceType.Location.name, @@ -53,7 +53,7 @@ class AppConfigService @Inject constructor(@ApplicationContext val context: Cont Coding().apply { system = LOCATION_SYSTEM display = LOCATION_DISPLAY - } + }, ), ResourceTag( type = ResourceType.Organization.name, @@ -61,7 +61,7 @@ class AppConfigService @Inject constructor(@ApplicationContext val context: Cont Coding().apply { system = ORGANIZATION_SYSTEM display = ORGANIZATION_DISPLAY - } + }, ), ResourceTag( type = SharedPreferenceKey.PRACTITIONER_ID.name, @@ -70,8 +70,8 @@ class AppConfigService @Inject constructor(@ApplicationContext val context: Cont system = PRACTITIONER_SYSTEM display = PRACTITIONER_DISPLAY }, - isResource = false - ) + isResource = false, + ), ) companion object { diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/ConfigServiceTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/ConfigServiceTest.kt index 20187853fb..9644f22c4d 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/ConfigServiceTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/ConfigServiceTest.kt @@ -34,6 +34,7 @@ import org.smartregister.fhircore.engine.util.SharedPreferencesHelper @HiltAndroidTest class ConfigServiceTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) + @Inject lateinit var gson: Gson private val application = ApplicationProvider.getApplicationContext() @@ -45,6 +46,7 @@ class ConfigServiceTest : RobolectricTest() { hiltRule.inject() sharedPreferencesHelper = SharedPreferencesHelper(application, gson) } + @Test fun testProvideSyncTagsShouldHaveOrganizationId() { val practitionerId = "practitioner-id" @@ -76,7 +78,7 @@ class ConfigServiceTest : RobolectricTest() { val organizationId2 = "organization-id2" sharedPreferencesHelper.write( ResourceType.Organization.name, - listOf(organizationId1, organizationId2) + listOf(organizationId1, organizationId2), ) val resourceTags = configService.provideResourceTags(sharedPreferencesHelper) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeKeystore.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeKeyStore.kt similarity index 97% rename from android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeKeystore.kt rename to android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeKeyStore.kt index bcca8eb67f..0aec8fb5c9 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeKeystore.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeKeyStore.kt @@ -41,7 +41,7 @@ object FakeKeyStore { put("KeyGenerator.AES", FakeAesKeyGenerator::class.java.name) put("KeyStore.AndroidKeyStore", FakeKeyStore::class.java.name) } - } + }, ) } @@ -49,36 +49,50 @@ object FakeKeyStore { private val wrapped = KeyStore.getInstance(KeyStore.getDefaultType()) override fun engineIsKeyEntry(alias: String?): Boolean = wrapped.isKeyEntry(alias) + override fun engineIsCertificateEntry(alias: String?): Boolean = wrapped.isCertificateEntry(alias) + override fun engineGetCertificate(alias: String?): Certificate = wrapped.getCertificate(alias) + override fun engineGetCreationDate(alias: String?): Date = wrapped.getCreationDate(alias) + override fun engineDeleteEntry(alias: String?) = wrapped.deleteEntry(alias) + override fun engineSetKeyEntry( alias: String?, key: Key?, password: CharArray?, - chain: Array? + chain: Array?, ) = wrapped.setKeyEntry(alias, key, password, chain) override fun engineSetKeyEntry( alias: String?, key: ByteArray?, - chain: Array? + chain: Array?, ) = wrapped.setKeyEntry(alias, key, chain) + override fun engineStore(stream: OutputStream?, password: CharArray?) = wrapped.store(stream, password) + override fun engineSize(): Int = wrapped.size() + override fun engineAliases(): Enumeration = wrapped.aliases() + override fun engineContainsAlias(alias: String?): Boolean = wrapped.containsAlias(alias) + override fun engineLoad(stream: InputStream?, password: CharArray?) = wrapped.load(stream, password) + override fun engineGetCertificateChain(alias: String?): Array = wrapped.getCertificateChain(alias) + override fun engineSetCertificateEntry(alias: String?, cert: Certificate?) = wrapped.setCertificateEntry(alias, cert) + override fun engineGetCertificateAlias(cert: Certificate?): String = wrapped.getCertificateAlias(cert) + override fun engineGetKey(alias: String?, password: CharArray?): Key? = wrapped.getKey(alias, password) } @@ -87,8 +101,11 @@ object FakeKeyStore { private val wrapped = KeyGenerator.getInstance("AES") override fun engineInit(random: SecureRandom?) = Unit + override fun engineInit(params: AlgorithmParameterSpec?, random: SecureRandom?) = Unit + override fun engineInit(keysize: Int, random: SecureRandom?) = Unit + override fun engineGenerateKey(): SecretKey = wrapped.generateKey() } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeModel.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeModel.kt index bb880def29..229777f8fc 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeModel.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/FakeModel.kt @@ -29,6 +29,6 @@ object FakeModel { passwordHash = "51r1K4l1".toCharArray().toPasswordHash(salt), salt = Base64.getEncoder().encodeToString(salt), sessionToken = "49fad390491a5b547d0f782309b6a5b33f7ac087", - refreshToken = "USrAgmSf5MJ8N_RLQODa7rZ3zNs1Sj1GkSIsTsb4n-Y" + refreshToken = "USrAgmSf5MJ8N_RLQODa7rZ3zNs1Sj1GkSIsTsb4n-Y", ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/Faker.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/Faker.kt index 60a91adc61..386b60d867 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/Faker.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/app/fakes/Faker.kt @@ -58,7 +58,7 @@ object Faker { fun loadTestConfigurationRegistryData( fhirEngine: FhirEngine, - configurationRegistry: ConfigurationRegistry + configurationRegistry: ConfigurationRegistry, ) { val composition = getBasePath("composition").readFile(systemPath).decodeResourceFromString() as Composition @@ -113,7 +113,7 @@ object Faker { sharedPreferencesHelper = mockk(), dispatcherProvider = mockk(), context = ApplicationProvider.getApplicationContext(), - ) + ), ) runBlocking { @@ -133,7 +133,7 @@ object Faker { gender: Enumerations.AdministrativeGender? = Enumerations.AdministrativeGender.MALE, patientType: String = "", practitionerReference: String = "", - deceased: Boolean = false + deceased: Boolean = false, ): Patient { return Patient().apply { this.id = id @@ -155,7 +155,7 @@ object Faker { system = "https://d-tree.org" code = patientType display = "Exposed Infant" - } + }, ) this.meta.addTag( @@ -163,7 +163,7 @@ object Faker { system = ORGANISATION_SYSTEM code = "123" display = ORGANISATION_DISPLAY - } + }, ) this.generalPractitionerFirstRep.apply { reference = practitionerReference } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/AppFeatureManagerTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/AppFeatureManagerTest.kt index 9e914e6713..f579a1f970 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/AppFeatureManagerTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/AppFeatureManagerTest.kt @@ -31,7 +31,6 @@ class AppFeatureManagerTest : RobolectricTest() { @Before fun setUp() { - appFeatureManager = AppFeatureManager(Faker.buildTestConfigurationRegistry()) } @@ -68,7 +67,7 @@ class AppFeatureManagerTest : RobolectricTest() { appFeatureManager.loadAndActivateFeatures() Assert.assertEquals( 1, - appFeatureManager.appFeatureSettings(AppFeature.HouseholdManagement).size + appFeatureManager.appFeatureSettings(AppFeature.HouseholdManagement).size, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/AppFeatureTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/AppFeatureTest.kt index d4cb770df4..d9f1e9109d 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/AppFeatureTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/AppFeatureTest.kt @@ -28,17 +28,17 @@ class AppFeatureTest { val appFeaturePatientManagement = AppFeature.PatientManagement Assert.assertTrue( - appFeaturePatientManagement.name.equals("PatientManagement", ignoreCase = true) + appFeaturePatientManagement.name.equals("PatientManagement", ignoreCase = true), ) val appFeatureHouseholdManagement = AppFeature.HouseholdManagement Assert.assertTrue( - appFeatureHouseholdManagement.name.equals("HouseholdManagement", ignoreCase = true) + appFeatureHouseholdManagement.name.equals("HouseholdManagement", ignoreCase = true), ) val appFeatureDeviceToDeviceSync = AppFeature.DeviceToDeviceSync Assert.assertTrue( - appFeatureDeviceToDeviceSync.name.equals("DeviceToDeviceSync", ignoreCase = true) + appFeatureDeviceToDeviceSync.name.equals("DeviceToDeviceSync", ignoreCase = true), ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/model/AppFeatureConfigTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/model/AppFeatureConfigTest.kt index 7674ed68f2..0050adc218 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/model/AppFeatureConfigTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/model/AppFeatureConfigTest.kt @@ -31,7 +31,7 @@ class AppFeatureConfigTest { AppFeatureConfig( appId = "quest", classification = "app_feature", - appFeatures = listOf(mockk(), mockk(), mockk()) + appFeatures = listOf(mockk(), mockk(), mockk()), ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/model/FeatureConfigTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/model/FeatureConfigTest.kt index 793224191a..c271b9e811 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/model/FeatureConfigTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/appfeature/model/FeatureConfigTest.kt @@ -39,8 +39,8 @@ class FeatureConfigTest { "HOUSEHOLD_REGISTRATION", "REMOVE_HOUSEHOLD", "HOUSEHOLD_VISITS", - "REMOVE_HOUSEHOLD_MEMBER" - ) + "REMOVE_HOUSEHOLD_MEMBER", + ), ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/appointment/MissedFHIRAppointmentsWorkerTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/appointment/MissedFHIRAppointmentsWorkerTest.kt index 5b819db6ec..b23a4546ce 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/appointment/MissedFHIRAppointmentsWorkerTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/appointment/MissedFHIRAppointmentsWorkerTest.kt @@ -68,10 +68,10 @@ class MissedFHIRAppointmentsWorkerTest : RobolectricTest() { override fun createWorker( appContext: Context, workerClassName: String, - workerParameters: WorkerParameters + workerParameters: WorkerParameters, ): ListenableWorker = MissedFHIRAppointmentsWorker(appContext, workerParameters, fhirEngine) - } + }, ) .build() } @@ -99,7 +99,7 @@ class MissedFHIRAppointmentsWorkerTest : RobolectricTest() { listOf( SearchResult(missedAppointment, included = null, revIncluded = null), SearchResult(bookedAppointment, included = null, revIncluded = null), - SearchResult(bookedAppointmentStartNull, included = null, revIncluded = null) + SearchResult(bookedAppointmentStartNull, included = null, revIncluded = null), ) coEvery { fhirEngine.search(any()) } returns appointments coEvery { fhirEngine.update(*anyVararg()) } just runs diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/auth/AccountAuthenticatorTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/auth/AccountAuthenticatorTest.kt index 7ff03f3ea5..e64d52a982 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/auth/AccountAuthenticatorTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/auth/AccountAuthenticatorTest.kt @@ -64,6 +64,7 @@ import retrofit2.HttpException class AccountAuthenticatorTest : RobolectricTest() { @get:Rule val hiltRule = HiltAndroidRule(this) + @get:Rule(order = 1) var instantTaskExecutorRule = InstantTaskExecutorRule() var accountManager: AccountManager = mockk() @@ -94,7 +95,7 @@ class AccountAuthenticatorTest : RobolectricTest() { accountManager = accountManager, tokenAuthenticator = tokenAuthenticator, secureSharedPreference = secureSharedPreference, - ) + ), ) } @@ -107,7 +108,7 @@ class AccountAuthenticatorTest : RobolectricTest() { accountType = accountType, authTokenType = authTokenType, requiredFeatures = emptyArray(), - options = bundleOf() + options = bundleOf(), ) Assert.assertNotNull(bundle) val parcelable = bundle.getParcelable(KEY_INTENT) @@ -118,7 +119,7 @@ class AccountAuthenticatorTest : RobolectricTest() { Assert.assertEquals(accountType, parcelable.getStringExtra(AccountAuthenticator.ACCOUNT_TYPE)) Assert.assertEquals( authTokenType, - parcelable.getStringExtra(TokenAuthenticator.AUTH_TOKEN_TYPE) + parcelable.getStringExtra(TokenAuthenticator.AUTH_TOKEN_TYPE), ) } @@ -127,8 +128,8 @@ class AccountAuthenticatorTest : RobolectricTest() { Assert.assertNotNull( accountAuthenticator.editProperties( response = null, - accountType = configService.provideAuthConfiguration().accountType - ) + accountType = configService.provideAuthConfiguration().accountType, + ), ) } @@ -191,16 +192,20 @@ class AccountAuthenticatorTest : RobolectricTest() { any(), any(), any>(), - any() + any(), ) } answers { val accountManagerBundleFuture = object : AccountManagerFuture { override fun cancel(mayInterruptIfRunning: Boolean): Boolean = false + override fun isCancelled(): Boolean = false + override fun isDone(): Boolean = true + override fun getResult(): Bundle = bundleOf(KEY_INTENT to Intent()) + override fun getResult(timeout: Long, unit: TimeUnit?): Bundle = bundleOf(KEY_INTENT to Intent()) } @@ -298,7 +303,7 @@ class AccountAuthenticatorTest : RobolectricTest() { mockk { every { code() } returns 0 every { message() } returns "" - } + }, ) val authTokenBundle: Bundle = @@ -346,14 +351,14 @@ class AccountAuthenticatorTest : RobolectricTest() { val authTokenLabel = "auth_token_label" Assert.assertEquals( authTokenLabel.uppercase(), - accountAuthenticator.getAuthTokenLabel(authTokenLabel) + accountAuthenticator.getAuthTokenLabel(authTokenLabel), ) } @Test fun testUpdateCredentialsShouldReturnEmptyBundle() { Assert.assertTrue( - accountAuthenticator.updateCredentials(mockk(), mockk(), authTokenType, bundleOf()).isEmpty + accountAuthenticator.updateCredentials(mockk(), mockk(), authTokenType, bundleOf()).isEmpty, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/auth/TokenAuthenticatorTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/auth/TokenAuthenticatorTest.kt index 416f3e9b6e..adeb9c4bf0 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/auth/TokenAuthenticatorTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/auth/TokenAuthenticatorTest.kt @@ -63,8 +63,11 @@ import retrofit2.Response class TokenAuthenticatorTest : RobolectricTest() { @get:Rule val hiltRule = HiltAndroidRule(this) + @ExperimentalCoroutinesApi @get:Rule val coroutineRule = CoroutineTestRule() + @Inject lateinit var secureSharedPreference: SecureSharedPreference + @Inject lateinit var configService: ConfigService private val oAuthService: OAuthService = mockk() private lateinit var tokenAuthenticator: TokenAuthenticator @@ -84,8 +87,8 @@ class TokenAuthenticatorTest : RobolectricTest() { oAuthService = oAuthService, dispatcherProvider = coroutineRule.testDispatcherProvider, accountManager = accountManager, - context = context - ) + context = context, + ), ) } @@ -109,7 +112,7 @@ class TokenAuthenticatorTest : RobolectricTest() { fun getAccountTypeEqualValueFromConfigService() { Assert.assertEquals( configService.provideAuthConfiguration().accountType, - tokenAuthenticator.getAccountType() + tokenAuthenticator.getAccountType(), ) } @@ -146,7 +149,7 @@ class TokenAuthenticatorTest : RobolectricTest() { any(), true, any(), - any() + any(), ) } returns mockk() @@ -160,7 +163,7 @@ class TokenAuthenticatorTest : RobolectricTest() { any(), true, any(), - any() + any(), ) } } @@ -187,7 +190,7 @@ class TokenAuthenticatorTest : RobolectricTest() { any(), true, any(), - any() + any(), ) } throws OperationCanceledException() Assert.assertEquals(accessToken, tokenAuthenticator.getAccessToken()) @@ -198,7 +201,7 @@ class TokenAuthenticatorTest : RobolectricTest() { any(), true, any(), - any() + any(), ) } throws IOException() Assert.assertEquals(accessToken, tokenAuthenticator.getAccessToken()) @@ -209,7 +212,7 @@ class TokenAuthenticatorTest : RobolectricTest() { any(), true, any(), - any() + any(), ) } throws AuthenticatorException() Assert.assertEquals(accessToken, tokenAuthenticator.getAccessToken()) @@ -233,8 +236,8 @@ class TokenAuthenticatorTest : RobolectricTest() { oAuthService = oAuthService, dispatcherProvider = coroutineRule.testDispatcherProvider, accountManager = accountManager, - context = context - ) + context = context, + ), ) val oAuthResponse = @@ -243,7 +246,7 @@ class TokenAuthenticatorTest : RobolectricTest() { refreshToken = refreshToken, tokenType = "", expiresIn = 3600, - scope = SCOPE + scope = SCOPE, ) coEvery { oAuthService.fetchToken(any()) } returns oAuthResponse @@ -270,7 +273,7 @@ class TokenAuthenticatorTest : RobolectricTest() { Assert.assertEquals( charArrayOf('P', '4', '5', '5', 'W', '4', '0').toPasswordHash(passwordSalt), - credentials?.passwordHash + credentials?.passwordHash, ) } @@ -288,7 +291,7 @@ class TokenAuthenticatorTest : RobolectricTest() { refreshToken = refreshToken, tokenType = "", expiresIn = 3600, - scope = SCOPE + scope = SCOPE, ) coEvery { oAuthService.fetchToken(any()) } returns oAuthResponse every { accountManager.accounts } returns arrayOf(account) @@ -297,7 +300,7 @@ class TokenAuthenticatorTest : RobolectricTest() { accountManager.setAuthToken( account, TokenAuthenticator.AUTH_TOKEN_TYPE, - oAuthResponse.accessToken + oAuthResponse.accessToken, ) } just runs every { accountManager.getAccountsByType(any()) } returns arrayOf(account) @@ -309,7 +312,7 @@ class TokenAuthenticatorTest : RobolectricTest() { accountManager.setAuthToken( account, TokenAuthenticator.AUTH_TOKEN_TYPE, - oAuthResponse.accessToken + oAuthResponse.accessToken, ) } } @@ -347,6 +350,7 @@ class TokenAuthenticatorTest : RobolectricTest() { Assert.assertEquals(Result.failure(sslHandshakeException), result) } } + @Test fun testLogout() { val account = Account(sampleUsername, PROVIDER) @@ -397,7 +401,7 @@ class TokenAuthenticatorTest : RobolectricTest() { refreshToken = "soRefreshingRefreshToken", tokenType = "", expiresIn = 3600, - scope = SCOPE + scope = SCOPE, ) coEvery { oAuthService.fetchToken(any()) } returns oAuthResponse every { accountManager.setPassword(account, any()) } just runs @@ -426,8 +430,8 @@ class TokenAuthenticatorTest : RobolectricTest() { oAuthService = oAuthService, dispatcherProvider = coroutineRule.testDispatcherProvider, accountManager = accountManager, - context = context - ) + context = context, + ), ) val result = diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistryTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistryTest.kt index 0aa43ef948..11890e9c5b 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistryTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/ConfigurationRegistryTest.kt @@ -55,6 +55,7 @@ class ConfigurationRegistryTest : RobolectricTest() { private lateinit var sharedPreferencesHelper: SharedPreferencesHelper val context = ApplicationProvider.getApplicationContext() + @get:Rule(order = 1) val coroutineRule = CoroutineTestRule() private val testAppId = "default" private lateinit var fhirResourceDataSource: FhirResourceDataSource @@ -88,7 +89,7 @@ class ConfigurationRegistryTest : RobolectricTest() { Assert.assertTrue(configurationRegistry.workflowPointsMap.isNotEmpty()) Assert.assertTrue(configurationRegistry.workflowPointsMap.containsKey("default|application")) Assert.assertFalse( - configurationRegistry.workflowPointsMap.containsKey("default|family-registration") + configurationRegistry.workflowPointsMap.containsKey("default|family-registration"), ) } @@ -96,7 +97,7 @@ class ConfigurationRegistryTest : RobolectricTest() { fun testRetrieveConfigurationShouldReturnLoginViewConfiguration() { val retrievedConfiguration = configurationRegistry.retrieveConfiguration( - AppConfigClassification.LOGIN + AppConfigClassification.LOGIN, ) Assert.assertTrue(configurationRegistry.workflowPointsMap.isNotEmpty()) @@ -205,7 +206,7 @@ class ConfigurationRegistryTest : RobolectricTest() { advanceUntilIdle() coVerify { fhirResourceDataSource.loadData( - withArg { Assert.assertTrue(it.startsWith("Questionnaire", ignoreCase = true)) } + withArg { Assert.assertTrue(it.startsWith("Questionnaire", ignoreCase = true)) }, ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/app/ApplicationConfigurationTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/app/ApplicationConfigurationTest.kt index 5e59255758..7a6700da4d 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/app/ApplicationConfigurationTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/app/ApplicationConfigurationTest.kt @@ -34,7 +34,7 @@ class ApplicationConfigurationTest { appLogoIconResourceFile = "ic_launcher", patientTypeFilterTagViaMetaCodingSystem = "test-filter-tag", count = "100", - taskFilterTagViaMetaCodingSystem = "task-filter-tag" + taskFilterTagViaMetaCodingSystem = "task-filter-tag", ) Assert.assertEquals("ancApp", applicationConfiguration.appId) Assert.assertEquals("classification", applicationConfiguration.classification) @@ -44,12 +44,12 @@ class ApplicationConfigurationTest { Assert.assertEquals("ic_launcher", applicationConfiguration.appLogoIconResourceFile) Assert.assertEquals( "test-filter-tag", - applicationConfiguration.patientTypeFilterTagViaMetaCodingSystem + applicationConfiguration.patientTypeFilterTagViaMetaCodingSystem, ) Assert.assertEquals("100", applicationConfiguration.count) Assert.assertEquals( "task-filter-tag", - applicationConfiguration.taskFilterTagViaMetaCodingSystem + applicationConfiguration.taskFilterTagViaMetaCodingSystem, ) } @@ -66,7 +66,7 @@ class ApplicationConfigurationTest { appLogoIconResourceFile = "ic_launcher", patientTypeFilterTagViaMetaCodingSystem = "test-filter-tag", count = "100", - taskFilterTagViaMetaCodingSystem = "task-filter-tag" + taskFilterTagViaMetaCodingSystem = "task-filter-tag", ) Assert.assertEquals("ancApp", applicationConfiguration.appId) Assert.assertEquals("classification", applicationConfiguration.classification) @@ -76,12 +76,12 @@ class ApplicationConfigurationTest { Assert.assertEquals("ic_launcher", applicationConfiguration.appLogoIconResourceFile) Assert.assertEquals( "test-filter-tag", - applicationConfiguration.patientTypeFilterTagViaMetaCodingSystem + applicationConfiguration.patientTypeFilterTagViaMetaCodingSystem, ) Assert.assertEquals("100", applicationConfiguration.count) Assert.assertEquals( "task-filter-tag", - applicationConfiguration.taskFilterTagViaMetaCodingSystem + applicationConfiguration.taskFilterTagViaMetaCodingSystem, ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/app/AuthConfigurationTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/app/AuthConfigurationTest.kt index 9bef4582f4..0114434886 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/app/AuthConfigurationTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/app/AuthConfigurationTest.kt @@ -29,7 +29,7 @@ class AuthConfigurationTest { fhirServerBaseUrl = "https://fhir.sample.org/", clientId = "fhir client", clientSecret = "client secret", - accountType = "openid" + accountType = "openid", ) Assert.assertEquals("https://keycloak-sampleorg", authConfiguration.oauthServerBaseUrl) Assert.assertEquals("https://fhir.sample.org/", authConfiguration.fhirServerBaseUrl) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/LoginViewConfigurationTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/LoginViewConfigurationTest.kt index 6978a93f03..43ae05232a 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/LoginViewConfigurationTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/LoginViewConfigurationTest.kt @@ -32,7 +32,7 @@ class LoginViewConfigurationTest { applicationVersionCode = 2, darkMode = true, showLogo = true, - enablePin = true + enablePin = true, ) Assert.assertEquals("anc", loginViewConfiguration.appId) Assert.assertEquals("classification", loginViewConfiguration.classification) @@ -54,7 +54,7 @@ class LoginViewConfigurationTest { applicationVersionCode = 2, darkMode = true, showLogo = true, - enablePin = false + enablePin = false, ) Assert.assertEquals("anc", loginViewConfigurationOf.appId) Assert.assertEquals("classification", loginViewConfigurationOf.classification) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/PinViewConfigurationTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/PinViewConfigurationTest.kt index cddea3fe36..6ec7215a99 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/PinViewConfigurationTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/PinViewConfigurationTest.kt @@ -30,7 +30,7 @@ class PinViewConfigurationTest { applicationName = "app", appLogoIconResourceFile = "ic_launcher", showLogo = true, - enablePin = true + enablePin = true, ) Assert.assertEquals("anc", pinViewConfiguration.appId) Assert.assertEquals("classification", pinViewConfiguration.classification) @@ -49,7 +49,7 @@ class PinViewConfigurationTest { applicationName = "app", appLogoIconResourceFile = "ic_launcher", showLogo = true, - enablePin = false + enablePin = false, ) Assert.assertEquals("anc", pinConfiguration.appId) Assert.assertEquals("classification", pinConfiguration.classification) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/RegisterViewConfigurationTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/RegisterViewConfigurationTest.kt index 39b4090c6f..1269577583 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/RegisterViewConfigurationTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/view/RegisterViewConfigurationTest.kt @@ -45,7 +45,7 @@ class RegisterViewConfigurationTest : RobolectricTest() { useLabel = true, showHeader = false, showFooter = false, - primaryFilter = null + primaryFilter = null, ) Assert.assertEquals("anc", registerViewConfiguration.appId) Assert.assertEquals("appTitle", registerViewConfiguration.appTitle) @@ -107,7 +107,7 @@ class RegisterViewConfigurationTest : RobolectricTest() { showBottomMenu = false, useLabel = true, showHeader = false, - showFooter = false + showFooter = false, ) Assert.assertEquals("anc", registerViewConfigurationOf.appId) Assert.assertEquals("clasification", registerViewConfigurationOf.classification) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/cql/CqlLibraryHelperTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/cql/CqlLibraryHelperTest.kt index 4e085f3409..ea1fbbfede 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/cql/CqlLibraryHelperTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/cql/CqlLibraryHelperTest.kt @@ -57,7 +57,6 @@ class CqlLibraryHelperTest : RobolectricTest() { @Test fun testLoadMeasureEvaluateLibraryShouldReturnBaseBundle() { - val bundle = Bundle().apply { addEntry().apply { resource = Patient().apply { addName().apply { addGiven("Robin") } } } @@ -71,7 +70,7 @@ class CqlLibraryHelperTest : RobolectricTest() { Assert.assertEquals(1, result.entry.size) Assert.assertEquals( "Robin", - (result.entryFirstRep.resource as Patient).nameFirstRep.givenFirstRep.value + (result.entryFirstRep.resource as Patient).nameFirstRep.givenFirstRep.value, ) verify(exactly = 1) { FileUtil.readFileFromInternalStorage(any(), any(), any()) } @@ -82,7 +81,7 @@ class CqlLibraryHelperTest : RobolectricTest() { Assert.assertEquals(1, sameResult.entry.size) Assert.assertEquals( "Robin", - (sameResult.entryFirstRep.resource as Patient).nameFirstRep.givenFirstRep.value + (sameResult.entryFirstRep.resource as Patient).nameFirstRep.givenFirstRep.value, ) verify(exactly = 0, inverse = true) { @@ -93,7 +92,6 @@ class CqlLibraryHelperTest : RobolectricTest() { @Test fun testWriteMeasureEvaluateLibraryDataShouldWriteFileInternalStorage() { - every { FileUtil.writeFileOnInternalStorage(any(), any(), any(), any()) } returns Unit cqlLibraryHelper.writeMeasureEvaluateLibraryData("test_data", "test_file", "test_dir") diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/cql/LibraryEvaluatorTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/cql/LibraryEvaluatorTest.kt index e5b5f23ac0..95e44cd216 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/cql/LibraryEvaluatorTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/cql/LibraryEvaluatorTest.kt @@ -94,7 +94,7 @@ class LibraryEvaluatorTest { fhirContext, evaluatorId, context, - contextLabel + contextLabel, ) Assert.assertEquals(result, auxResult) } @@ -138,24 +138,21 @@ class LibraryEvaluatorTest { val cqlLibrary = parser.parseResource( FileUtil.readJsonFile("test/resources/cql/g6pdlibraryevaluator/library.json") - .replace("#library-elm.json", Base64.getEncoder().encodeToString(cqlElm.toByteArray())) - ) as - Library + .replace("#library-elm.json", Base64.getEncoder().encodeToString(cqlElm.toByteArray())), + ) as Library val fhirHelpersLibrary = parser.parseResource( - FileUtil.readJsonFile("test/resources/cql/g6pdlibraryevaluator/helper.json") - ) as - Library + FileUtil.readJsonFile("test/resources/cql/g6pdlibraryevaluator/helper.json"), + ) as Library val dataBundle = parser.parseResource( - FileUtil.readJsonFile("test/resources/cql/g6pdlibraryevaluator/patient.json") - ) as - Bundle + FileUtil.readJsonFile("test/resources/cql/g6pdlibraryevaluator/patient.json"), + ) as Bundle val patient = - dataBundle.entry.first { it.resource.resourceType == ResourceType.Patient }.resource as - Patient + dataBundle.entry.first { it.resource.resourceType == ResourceType.Patient }.resource + as Patient val fhirEngine = mockk() val defaultRepository: DefaultRepository = @@ -164,7 +161,7 @@ class LibraryEvaluatorTest { dispatcherProvider = DefaultDispatcherProvider(), sharedPreferencesHelper = mockk(), configurationRegistry = mockk(), - configService = mockk() + configService = mockk(), ) coEvery { fhirEngine.get(ResourceType.Library, cqlLibrary.logicalId) } returns cqlLibrary @@ -178,7 +175,7 @@ class LibraryEvaluatorTest { patient, dataBundle.apply { entry.removeIf { it.resource.resourceType == ResourceType.Patient } }, defaultRepository, - true + true, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/domain/util/PaginatedDataSourceTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/domain/util/PaginatedDataSourceTest.kt index dc99fdc7cf..4ed49a953d 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/domain/util/PaginatedDataSourceTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/domain/util/PaginatedDataSourceTest.kt @@ -43,8 +43,8 @@ class PaginatedDataSourceTest : RobolectricTest() { fun testLoadDataFromRepository() = runBlocking { coEvery { registerRepository.loadData(any(), any(), any()) } returns listOf("data") val result = - paginatedDataSource.load(PagingSource.LoadParams.Refresh(1, 1, true)) as - PagingSource.LoadResult.Page + paginatedDataSource.load(PagingSource.LoadParams.Refresh(1, 1, true)) + as PagingSource.LoadResult.Page assertEquals(1, result.data.size) assertEquals("data", result.data[0]) @@ -56,7 +56,7 @@ class PaginatedDataSourceTest : RobolectricTest() { fun testGetRefreshKeyShouldReturnAnchorPosition() { assertEquals( 10, - paginatedDataSource.getRefreshKey(mockk { every { anchorPosition } returns 10 }) + paginatedDataSource.getRefreshKey(mockk { every { anchorPosition } returns 10 }), ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt index ad4789473e..f4ecd4ae8f 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt @@ -73,11 +73,14 @@ import org.smartregister.fhircore.engine.util.extension.loadRelatedPersons class DefaultRepositoryTest : RobolectricTest() { private val dispatcherProvider = spyk(DefaultDispatcherProvider()) + @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) + @OptIn(ExperimentalCoroutinesApi::class) @get:Rule(order = 2) var coroutineRule = CoroutineTestRule() private val configurationRegistry = Faker.buildTestConfigurationRegistry() + @BindValue val sharedPreferencesHelper = mockk(relaxed = true) private val configService: ConfigService = mockk() @@ -87,6 +90,7 @@ class DefaultRepositoryTest : RobolectricTest() { hiltRule.inject() every { configService.provideResourceTags(any()) } returns listOf() } + @Test fun `addOrUpdate() should call fhirEngine#update when resource exists`() { val patientId = "15672-9234" @@ -101,14 +105,14 @@ class DefaultRepositoryTest : RobolectricTest() { Address().apply { city = "Lahore" country = "Pakistan" - } + }, ) name = listOf( HumanName().apply { given = mutableListOf(StringType("Salman")) family = "Ali" - } + }, ) telecom = listOf(ContactPoint().apply { value = "12345" }) } @@ -125,7 +129,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) // Call the function under test @@ -166,7 +170,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) runBlocking { defaultRepository.loadRelatedPersons(patientId) } @@ -188,7 +192,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) runBlocking { defaultRepository.loadPatientImmunizations(patientId) } @@ -208,7 +212,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) runBlocking { defaultRepository.loadQuestionnaireResponses("1234", Questionnaire()) } @@ -231,7 +235,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) runBlocking { defaultRepository.save(resource) } @@ -257,7 +261,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) runBlocking { defaultRepository.addOrUpdate(resource = resource) } @@ -279,7 +283,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) val result = defaultRepository.searchCompositionByIdentifier("appId") @@ -300,7 +304,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) val result = defaultRepository.getBinary("111") @@ -325,7 +329,7 @@ class DefaultRepositoryTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) runBlocking { defaultRepository.addOrUpdate(resource = resource) } @@ -337,55 +341,55 @@ class DefaultRepositoryTest : RobolectricTest() { @Test fun `searchQuestionnaireConfig should call FhirEngine#Search and return QuestionnaireConfig with correct fields`() = - runTest { - val fhirEngine = mockk() - val questionnaire1 = - Questionnaire().apply { - id = "1" - name = "questionnaire1" - title = "Questionnaire 1" - } - val questionnaire2 = - Questionnaire().apply { - id = "2" - name = "questionnaire2" - title = "Questionnaire 2" - } + runTest { + val fhirEngine = mockk() + val questionnaire1 = + Questionnaire().apply { + id = "1" + name = "questionnaire1" + title = "Questionnaire 1" + } + val questionnaire2 = + Questionnaire().apply { + id = "2" + name = "questionnaire2" + title = "Questionnaire 2" + } - coEvery { fhirEngine.search(any()) } answers - { - val searchArg = firstArg() - when (searchArg.type) { - ResourceType.Questionnaire -> - listOf(questionnaire1, questionnaire2).map { - SearchResult(it, included = null, revIncluded = null) - } - else -> emptyList() + coEvery { fhirEngine.search(any()) } answers + { + val searchArg = firstArg() + when (searchArg.type) { + ResourceType.Questionnaire -> + listOf(questionnaire1, questionnaire2).map { + SearchResult(it, included = null, revIncluded = null) + } + else -> emptyList() + } } - } - val defaultRepository = - DefaultRepository( - fhirEngine = fhirEngine, - dispatcherProvider = coroutineRule.testDispatcherProvider, - sharedPreferencesHelper = sharedPreferencesHelper, - configurationRegistry = configurationRegistry, - configService = configService - ) - val questionnaireConfigs = defaultRepository.searchQuestionnaireConfig(listOf()) - Assert.assertEquals(2, questionnaireConfigs.size) - val questionnaireConfig1 = questionnaireConfigs[0] - val questionnaireConfig2 = questionnaireConfigs[1] - with(questionnaireConfig1) { - Assert.assertEquals("questionnaire1", form) - Assert.assertEquals("Questionnaire 1", title) - Assert.assertEquals("1", identifier) - } + val defaultRepository = + DefaultRepository( + fhirEngine = fhirEngine, + dispatcherProvider = coroutineRule.testDispatcherProvider, + sharedPreferencesHelper = sharedPreferencesHelper, + configurationRegistry = configurationRegistry, + configService = configService, + ) + val questionnaireConfigs = defaultRepository.searchQuestionnaireConfig(listOf()) + Assert.assertEquals(2, questionnaireConfigs.size) + val questionnaireConfig1 = questionnaireConfigs[0] + val questionnaireConfig2 = questionnaireConfigs[1] + with(questionnaireConfig1) { + Assert.assertEquals("questionnaire1", form) + Assert.assertEquals("Questionnaire 1", title) + Assert.assertEquals("1", identifier) + } - with(questionnaireConfig2) { - Assert.assertEquals("questionnaire2", form) - Assert.assertEquals("Questionnaire 2", title) - Assert.assertEquals("2", identifier) + with(questionnaireConfig2) { + Assert.assertEquals("questionnaire2", form) + Assert.assertEquals("Questionnaire 2", title) + Assert.assertEquals("2", identifier) + } } - } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/AppRegisterRepositoryTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/AppRegisterRepositoryTest.kt index 190a177890..f52ab94886 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/AppRegisterRepositoryTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/AppRegisterRepositoryTest.kt @@ -68,9 +68,12 @@ class AppRegisterRepositoryTest : RobolectricTest() { private val dispatcherProvider: DefaultDispatcherProvider = mockk() private val registerDaoFactory: RegisterDaoFactory = mockk() private val tracer: PerformanceReporter = FakePerformanceReporter() + @BindValue val sharedPreferencesHelper = mockk(relaxed = true) private val configurationRegistry = Faker.buildTestConfigurationRegistry() + @Inject lateinit var configService: ConfigService + @Before fun setUp() { hiltRule.inject() @@ -82,7 +85,7 @@ class AppRegisterRepositoryTest : RobolectricTest() { configurationRegistry, registerDaoFactory, configService, - tracer + tracer, ) mockkConstructor(DefaultRepository::class) mockkStatic("kotlinx.coroutines.DispatchersKt") @@ -210,14 +213,14 @@ class AppRegisterRepositoryTest : RobolectricTest() { false, null, healthModule, - AppointmentRegisterFilter(today, true, null, null) + AppointmentRegisterFilter(today, true, null, null), ) coVerify { appointmentRegisterDao.loadRegisterFiltered( 1, false, null, - AppointmentRegisterFilter(today, true, null, null) + AppointmentRegisterFilter(today, true, null, null), ) } } @@ -238,14 +241,14 @@ class AppRegisterRepositoryTest : RobolectricTest() { false, null, healthModule, - TracingRegisterFilter(true, null, null, null) + TracingRegisterFilter(true, null, null, null), ) coVerify { phoneTracingRegisterDao.loadRegisterFiltered( 1, false, null, - TracingRegisterFilter(true, null, null, null) + TracingRegisterFilter(true, null, null, null), ) } } @@ -265,7 +268,7 @@ class AppRegisterRepositoryTest : RobolectricTest() { repository.loadRegisterFiltered( 0, healthModule = healthModule, - filters = AppointmentRegisterFilter(today, true, null, null) + filters = AppointmentRegisterFilter(today, true, null, null), ) Assert.assertTrue(data.isEmpty()) coVerify(exactly = 0) { @@ -273,7 +276,7 @@ class AppRegisterRepositoryTest : RobolectricTest() { 1, false, null, - AppointmentRegisterFilter(today, true, null, null) + AppointmentRegisterFilter(today, true, null, null), ) } } @@ -291,12 +294,12 @@ class AppRegisterRepositoryTest : RobolectricTest() { repository.countRegisterFiltered( null, healthModule, - TracingRegisterFilter(true, null, null, null) + TracingRegisterFilter(true, null, null, null), ) coVerify { homeTracingRegisterDao.countRegisterFiltered( null, - TracingRegisterFilter(true, null, null, null) + TracingRegisterFilter(true, null, null, null), ) } } @@ -315,12 +318,12 @@ class AppRegisterRepositoryTest : RobolectricTest() { repository.countRegisterFiltered( null, healthModule, - AppointmentRegisterFilter(today, true, null, null) + AppointmentRegisterFilter(today, true, null, null), ) coVerify { appointmentRegisterDao.countRegisterFiltered( null, - AppointmentRegisterFilter(today, true, null, null) + AppointmentRegisterFilter(today, true, null, null), ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/AppointmentRegisterDaoTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/AppointmentRegisterDaoTest.kt index 2db4984b60..f56be99293 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/AppointmentRegisterDaoTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/AppointmentRegisterDaoTest.kt @@ -63,6 +63,7 @@ import org.smartregister.fhircore.engine.util.SharedPreferencesHelper class AppointmentRegisterDaoTest : RobolectricTest() { @BindValue val sharedPreferencesHelper: SharedPreferencesHelper = mockk(relaxed = true) + @get:Rule(order = 2) var coroutineRule = CoroutineTestRule() @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) @@ -76,6 +77,7 @@ class AppointmentRegisterDaoTest : RobolectricTest() { private val fhirEngine: FhirEngine = mockk() lateinit var defaultRepository: DefaultRepository + @Inject lateinit var configService: ConfigService var configurationRegistry: ConfigurationRegistry = Faker.buildTestConfigurationRegistry() @@ -89,7 +91,7 @@ class AppointmentRegisterDaoTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) coEvery { fhirEngine.get(ResourceType.Patient, "1234") } returns buildPatient("1", "doe", "john", 10, patientType = "exposed-infant") @@ -106,7 +108,7 @@ class AppointmentRegisterDaoTest : RobolectricTest() { defaultRepository = defaultRepository, configurationRegistry = configurationRegistry, dispatcherProvider = DefaultDispatcherProvider(), - sharedPreferencesHelper = sharedPreferencesHelper + sharedPreferencesHelper = sharedPreferencesHelper, ) } @@ -135,7 +137,7 @@ class AppointmentRegisterDaoTest : RobolectricTest() { Appointment().apply { status = Appointment.AppointmentStatus.BOOKED start = Date() - } + }, ) coEvery { fhirEngine.search(any()) } answers @@ -143,7 +145,9 @@ class AppointmentRegisterDaoTest : RobolectricTest() { val searchObj = firstArg() if (searchObj.type == ResourceType.Appointment) { appointments.map { SearchResult(it, revIncluded = null, included = null) } - } else emptyList() + } else { + emptyList() + } } val count = appointmentRegisterDao.countRegisterData("1234") @@ -164,7 +168,7 @@ class AppointmentRegisterDaoTest : RobolectricTest() { addReasonCode(CodeableConcept(Coding().apply { code = "Milestone" })) }, included = null, - revIncluded = null + revIncluded = null, ) val appointment2 = SearchResult( @@ -176,7 +180,7 @@ class AppointmentRegisterDaoTest : RobolectricTest() { addReasonCode(CodeableConcept(Coding().apply { code = "ICT" })) }, included = null, - revIncluded = null + revIncluded = null, ) coEvery { fhirEngine.search(any()) } returns listOf(appointment1, appointment2) @@ -185,7 +189,7 @@ class AppointmentRegisterDaoTest : RobolectricTest() { startDate, myPatients = true, patientCategory = null, - reasonCode = "ICT" + reasonCode = "ICT", ) val counts = appointmentRegisterDao.countRegisterFiltered(filters = registerFilter) Assert.assertEquals(1, counts) @@ -227,7 +231,7 @@ class AppointmentRegisterDaoTest : RobolectricTest() { Identifier().apply { use = Identifier.IdentifierUse.OFFICIAL value = "3214" - } + }, ) } coEvery { fhirEngine.get(ResourceType.Patient, "12345-3214") } returns patient1 @@ -278,8 +282,8 @@ class AppointmentRegisterDaoTest : RobolectricTest() { startDate, myPatients = true, patientCategory = listOf(HealthStatus.EXPOSED_INFANT), - reasonCode = null - ) + reasonCode = null, + ), ) Assert.assertEquals(2, data.size) Assert.assertEquals("appointment2", data.elementAt(0).logicalId) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDaoTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDaoTest.kt index e711cf38ca..ce8e6e31d6 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDaoTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDaoTest.kt @@ -80,9 +80,13 @@ import org.smartregister.fhircore.engine.util.extension.referenceValue @OptIn(ExperimentalCoroutinesApi::class) internal class HivRegisterDaoTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) + @get:Rule(order = 1) val instantTaskExecutorRule = InstantTaskExecutorRule() + @get:Rule(order = 2) val coroutineTestRule = CoroutineTestRule() + @get:Rule(order = 2) var coroutineRule = CoroutineTestRule() + @BindValue val sharedPreferencesHelper: SharedPreferencesHelper = mockk(relaxed = true) @Inject lateinit var configService: ConfigService @@ -95,47 +99,47 @@ internal class HivRegisterDaoTest : RobolectricTest() { private val testPatient = buildPatient( - id = "1", - family = "doe", - given = "john", - age = 50, - patientType = "exposed-infant", - practitionerReference = "practitioner/1234" - ) + id = "1", + family = "doe", + given = "john", + age = 50, + patientType = "exposed-infant", + practitionerReference = "practitioner/1234", + ) .apply { active = true } private val testPatientGenderNull = buildPatient( - id = "3", - family = "doe", - given = "jane", - gender = null, - patientType = "exposed-infant", - ) + id = "3", + family = "doe", + given = "jane", + gender = null, + patientType = "exposed-infant", + ) .apply { active = true } private val testPatientDeceasedFalse = buildPatient( - id = "4", - family = "doe", - given = "john", - age = 50, - patientType = "exposed-infant", - practitionerReference = "practitioner/1234", - deceased = false - ) + id = "4", + family = "doe", + given = "john", + age = 50, + patientType = "exposed-infant", + practitionerReference = "practitioner/1234", + deceased = false, + ) .apply { active = true } private val testPatientDeceasedTrue = buildPatient( - id = "5", - family = "doe", - given = "john", - age = 50, - patientType = "exposed-infant", - practitionerReference = "practitioner/1234", - deceased = true - ) + id = "5", + family = "doe", + given = "john", + age = 50, + patientType = "exposed-infant", + practitionerReference = "practitioner/1234", + deceased = true, + ) .apply { active = true } private val testTask1 = @@ -145,7 +149,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://d-tree.org" code = "clinic-visit-task-order-3" - } + }, ) } @@ -156,7 +160,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://d-tree.org" code = "clinic-visit-task-order-1" - } + }, ) } @@ -168,7 +172,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { addActivity( CarePlan.CarePlanActivityComponent().apply { outcomeReference.add(Reference(testTask1.referenceValue())) - } + }, ) } @@ -180,7 +184,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { addActivity( CarePlan.CarePlanActivityComponent().apply { outcomeReference.add(Reference(testTask2.referenceValue())) - } + }, ) } @@ -193,7 +197,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService + configService = configService, ) coEvery { fhirEngine.get(ResourceType.Patient, "1") } returns testPatient @@ -213,17 +217,17 @@ internal class HivRegisterDaoTest : RobolectricTest() { SearchResult(testPatient, included = null, revIncluded = null), SearchResult(testPatientGenderNull, included = null, revIncluded = null), SearchResult(testPatientDeceasedFalse, included = null, revIncluded = null), - SearchResult(testPatientDeceasedTrue, included = null, revIncluded = null) + SearchResult(testPatientDeceasedTrue, included = null, revIncluded = null), ) ResourceType.Task -> listOf( SearchResult(testTask1, included = null, revIncluded = null), - SearchResult(testTask2, included = null, revIncluded = null) + SearchResult(testTask2, included = null, revIncluded = null), ) ResourceType.CarePlan -> listOf( SearchResult(carePlan1, included = null, revIncluded = null), - SearchResult(carePlan2, included = null, revIncluded = null) + SearchResult(carePlan2, included = null, revIncluded = null), ) else -> emptyList() } @@ -238,7 +242,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { every { configurationRegistry.retrieveConfiguration( - AppConfigClassification.APPLICATION + AppConfigClassification.APPLICATION, ) } returns applicationConfigurationOf(patientTypeFilterTagViaMetaCodingSystem = "https://d-tree.org") @@ -247,7 +251,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { HivRegisterDao( fhirEngine = fhirEngine, defaultRepository = defaultRepository, - configurationRegistry = configurationRegistry + configurationRegistry = configurationRegistry, ) } @@ -361,6 +365,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { assertEquals(HealthStatus.EXPOSED_INFANT, hivProfileData.healthStatus) assertEquals(Enumerations.AdministrativeGender.MALE, hivProfileData.gender) } + @Test fun testProfileTaskList() { val data = runBlocking { @@ -413,7 +418,7 @@ internal class HivRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://d-tree.org" code = "client-already-on-art" - } + }, ) birthDate = DateType(Date()).apply { add(Calendar.YEAR, 48) }.dateTimeValue().value } @@ -463,14 +468,14 @@ internal class HivRegisterDaoTest : RobolectricTest() { Identifier().apply { this.use = Identifier.IdentifierUse.OFFICIAL this.value = identifierNumber - } + }, ) identifier.add( Identifier().apply { this.use = Identifier.IdentifierUse.SECONDARY this.value = "149856" - } + }, ) } assertEquals(identifierNumber, hivRegisterDao.hivPatientIdentifier(patient)) @@ -478,21 +483,21 @@ internal class HivRegisterDaoTest : RobolectricTest() { @Test fun `test hiv patient identifier to be empty string when no 'official' identifier found`() = - runTest { - val identifierNumber = "149856" - val patient = - Patient().apply { - identifier.add(Identifier()) - - identifier.add( - Identifier().apply { - this.use = Identifier.IdentifierUse.SECONDARY - this.value = identifierNumber - } - ) - } - assertEquals("", hivRegisterDao.hivPatientIdentifier(patient)) - } + runTest { + val identifierNumber = "149856" + val patient = + Patient().apply { + identifier.add(Identifier()) + + identifier.add( + Identifier().apply { + this.use = Identifier.IdentifierUse.SECONDARY + this.value = identifierNumber + }, + ) + } + assertEquals("", hivRegisterDao.hivPatientIdentifier(patient)) + } @Test fun testGetRegisterDataFilters() { @@ -507,27 +512,27 @@ internal class HivRegisterDaoTest : RobolectricTest() { private val testHivPatient = buildPatient( - id = "logicalId", - family = "doe", - given = "john", - age = 50, - patientType = "exposed-infant", - practitionerReference = "practitioner/1234" - ) + id = "logicalId", + family = "doe", + given = "john", + age = 50, + patientType = "exposed-infant", + practitionerReference = "practitioner/1234", + ) .apply { active = true identifier.add( Identifier().apply { this.use = Identifier.IdentifierUse.SECONDARY this.value = "149856" - } + }, ) meta.addTag( Coding().apply { system = "https://d-tree.org" code = "exposed-infant" display = "Exposed Infant" - } + }, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/RegisterDaoFactoryTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/RegisterDaoFactoryTest.kt index f9bce7729f..590ebeed4a 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/RegisterDaoFactoryTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/RegisterDaoFactoryTest.kt @@ -27,7 +27,7 @@ import org.smartregister.fhircore.engine.appfeature.model.HealthModule import org.smartregister.fhircore.engine.robolectric.RobolectricTest @HiltAndroidTest -class OverflowMenuFactoryTest : RobolectricTest() { +class RegisterDaoFactoryTest : RobolectricTest() { @get:Rule val hiltRule = HiltAndroidRule(this) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/TracingRegisterDaoTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/TracingRegisterDaoTest.kt index c315fd0522..a1f5d71560 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/TracingRegisterDaoTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/register/dao/TracingRegisterDaoTest.kt @@ -37,7 +37,6 @@ import org.hl7.fhir.r4.model.Appointment import org.hl7.fhir.r4.model.CarePlan import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding -import org.hl7.fhir.r4.model.Condition import org.hl7.fhir.r4.model.Encounter import org.hl7.fhir.r4.model.Enumerations import org.hl7.fhir.r4.model.Identifier @@ -77,7 +76,9 @@ import org.smartregister.fhircore.engine.util.extension.referenceValue class TracingRegisterDaoTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) + @get:Rule(order = 1) val instantTaskExecutorRule = InstantTaskExecutorRule() + @get:Rule(order = 2) val coroutineTestRule = CoroutineTestRule() @BindValue val sharedPreferencesHelper = mockk(relaxed = true) @@ -88,9 +89,11 @@ class TracingRegisterDaoTest : RobolectricTest() { private lateinit var defaultRepository: DefaultRepository private val configurationRegistry = Faker.buildTestConfigurationRegistry() private lateinit var tracingRegisterDao: TracingRegisterDao + @get:Rule(order = 2) var coroutineRule = CoroutineTestRule() @Inject lateinit var configService: ConfigService + @Before fun setUp() { hiltRule.inject() @@ -101,8 +104,8 @@ class TracingRegisterDaoTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService - ) + configService = configService, + ), ) coEvery { configurationRegistry.retrieveDataFilterConfiguration(any()) } returns emptyList() @@ -117,7 +120,7 @@ class TracingRegisterDaoTest : RobolectricTest() { defaultRepository = defaultRepository, configurationRegistry = configurationRegistry, dispatcherProvider = dispatcherProvider, - sharedPreferencesHelper = sharedPreferencesHelper + sharedPreferencesHelper = sharedPreferencesHelper, ) } @@ -158,7 +161,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://dtree.org" code = "linkage" - } + }, ) } @@ -192,7 +195,7 @@ class TracingRegisterDaoTest : RobolectricTest() { "jane", 16, gender = Enumerations.AdministrativeGender.FEMALE, - patientType = "community-positive" + patientType = "community-positive", ) val patient2 = Faker.buildPatient("patient2", "doe", "jimmy", 1, patientType = "exposed-infant") val task1 = @@ -207,7 +210,7 @@ class TracingRegisterDaoTest : RobolectricTest() { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -215,7 +218,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://dtree.org" code = "miss-routine" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -231,7 +234,7 @@ class TracingRegisterDaoTest : RobolectricTest() { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -239,7 +242,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://dtree.org" code = "dual-referral" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -255,7 +258,7 @@ class TracingRegisterDaoTest : RobolectricTest() { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -263,7 +266,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://dtree.org" code = "hvl" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -276,13 +279,13 @@ class TracingRegisterDaoTest : RobolectricTest() { listOf( SearchResult(patient0, included = null, revIncluded = null), SearchResult(patient1, included = null, revIncluded = null), - SearchResult(patient2, included = null, revIncluded = null) + SearchResult(patient2, included = null, revIncluded = null), ) ResourceType.Task -> listOf( SearchResult(task1, included = null, revIncluded = null), SearchResult(task2, included = null, revIncluded = null), - SearchResult(task3, included = null, revIncluded = null) + SearchResult(task3, included = null, revIncluded = null), ) else -> emptyList() } @@ -297,9 +300,9 @@ class TracingRegisterDaoTest : RobolectricTest() { isAssignedToMe = false, patientCategory = null, reasonCode = "hvl", - age = TracingAgeFilterEnum.ZERO_TO_2 - ) - ) + age = TracingAgeFilterEnum.ZERO_TO_2, + ), + ), ) Assert.assertEquals( 1, @@ -310,9 +313,9 @@ class TracingRegisterDaoTest : RobolectricTest() { isAssignedToMe = false, patientCategory = null, reasonCode = "dual-referral", - age = TracingAgeFilterEnum.ZERO_TO_18 - ) - ) + age = TracingAgeFilterEnum.ZERO_TO_18, + ), + ), ) Assert.assertEquals( 1, @@ -323,9 +326,9 @@ class TracingRegisterDaoTest : RobolectricTest() { isAssignedToMe = false, patientCategory = null, reasonCode = "miss-routine", - age = TracingAgeFilterEnum.`18_PLUS` - ) - ) + age = TracingAgeFilterEnum.PLUS_18, + ), + ), ) } @@ -340,7 +343,7 @@ class TracingRegisterDaoTest : RobolectricTest() { "jane", 16, gender = Enumerations.AdministrativeGender.FEMALE, - patientType = "community-positive" + patientType = "community-positive", ) val task0 = Task().apply { @@ -355,7 +358,7 @@ class TracingRegisterDaoTest : RobolectricTest() { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -363,7 +366,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://dtree.org" code = "miss-routine" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -380,7 +383,7 @@ class TracingRegisterDaoTest : RobolectricTest() { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -388,7 +391,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://dtree.org" code = "dual-referral" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -407,7 +410,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://d-tree.org" code = "home-tracing-outcome" - } + }, ) subject = patient0.asReference() period = Period().apply { start = Date() } @@ -443,7 +446,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://d-tree.org" code = "1" - } + }, ) .apply { text = "1" } subject = patient0.asReference() @@ -453,7 +456,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://d-tree.org" code = "tracing-task" - } + }, ) .apply { text = task0.referenceValue() } item = task0.asReference() @@ -471,12 +474,12 @@ class TracingRegisterDaoTest : RobolectricTest() { searchObj.type == ResourceType.Patient -> listOf( SearchResult(patient0, included = null, revIncluded = null), - SearchResult(patient1, included = null, revIncluded = null) + SearchResult(patient1, included = null, revIncluded = null), ) searchObj.type == ResourceType.Task -> listOf( SearchResult(task0, included = null, revIncluded = null), - SearchResult(task1, included = null, revIncluded = null) + SearchResult(task1, included = null, revIncluded = null), ) searchObj.type == ResourceType.Condition -> emptyList() searchObj.type == ResourceType.List -> @@ -499,8 +502,8 @@ class TracingRegisterDaoTest : RobolectricTest() { isAssignedToMe = false, patientCategory = null, reasonCode = null, - age = null - ) + age = null, + ), ) Assert.assertEquals(2, data.size) @@ -550,7 +553,7 @@ class TracingRegisterDaoTest : RobolectricTest() { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -558,7 +561,7 @@ class TracingRegisterDaoTest : RobolectricTest() { Coding().apply { system = "https://dtree.org" code = "hvl" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -596,8 +599,8 @@ class TracingRegisterDaoTest : RobolectricTest() { coEvery { fhirEngine.get(ResourceType.Practitioner, practitioner.logicalId) } returns practitioner val profileData = - tracingRegisterDao.loadProfileData(appFeatureName = null, resourceId = patient0.logicalId) as - ProfileData.TracingProfileData + tracingRegisterDao.loadProfileData(appFeatureName = null, resourceId = patient0.logicalId) + as ProfileData.TracingProfileData Assert.assertNotNull(profileData) Assert.assertEquals(patient0.logicalId, profileData.logicalId) Assert.assertEquals("123456432", profileData.identifier) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/tracing/TracingRepositoryTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/tracing/TracingRepositoryTest.kt index faaae9e2bb..9f53d94832 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/tracing/TracingRepositoryTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/tracing/TracingRepositoryTest.kt @@ -75,7 +75,7 @@ class TracingRepositoryTest { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -83,7 +83,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://dtree.org" code = "miss-routine" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -102,7 +102,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "home-tracing-outcome" - } + }, ) subject = patient0.asReference() period = Period().apply { start = Date() } @@ -124,7 +124,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "1" - } + }, ) .apply { text = "1" } mode = ListResource.ListMode.SNAPSHOT @@ -138,7 +138,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "tracing-task" - } + }, ) .apply { text = task0.referenceValue() } } @@ -149,7 +149,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "tracing-enc" - } + }, ) .apply { text = enc0.referenceValue() } } @@ -178,9 +178,9 @@ class TracingRepositoryTest { startDate = list0.date, endDate = null, numberOfAttempts = 1, - isActive = true + isActive = true, ), - tracingHistory + tracingHistory, ) } @@ -201,7 +201,7 @@ class TracingRepositoryTest { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -209,7 +209,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://dtree.org" code = "miss-routine" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -228,7 +228,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "home-tracing-outcome" - } + }, ) subject = patient0.asReference() period = Period().apply { start = Date() } @@ -250,7 +250,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "1" - } + }, ) .apply { text = "1" } mode = ListResource.ListMode.SNAPSHOT @@ -264,7 +264,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "tracing-task" - } + }, ) .apply { text = task0.referenceValue() } } @@ -275,7 +275,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "tracing-enc" - } + }, ) .apply { text = enc0.referenceValue() } } @@ -291,9 +291,9 @@ class TracingRepositoryTest { historyId = list0.logicalId, encounterId = enc0.logicalId, title = "Home Tracing Outcome 1", - date = enc0.period.start + date = enc0.period.start, ), - tracingOutcome + tracingOutcome, ) } @@ -314,7 +314,7 @@ class TracingRepositoryTest { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -323,7 +323,7 @@ class TracingRepositoryTest { system = "https://dtree.org" code = "miss-routine" display = "Missed Routine" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -342,7 +342,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "home-tracing-outcome" - } + }, ) subject = patient0.asReference() period = Period().apply { start = Date() } @@ -378,7 +378,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "home-tracing-outcome-date-of-agreed-appointment" - } + }, ) value = dateOfAppointmentObserved } @@ -391,7 +391,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "1" - } + }, ) .apply { text = "1" } mode = ListResource.ListMode.SNAPSHOT @@ -405,7 +405,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "tracing-task" - } + }, ) .apply { text = task0.referenceValue() } } @@ -416,7 +416,7 @@ class TracingRepositoryTest { Coding().apply { system = "https://d-tree.org" code = "tracing-enc" - } + }, ) .apply { text = enc0.referenceValue() } } @@ -432,7 +432,7 @@ class TracingRepositoryTest { ResourceType.Observation -> listOf( SearchResult(obs0, included = null, revIncluded = null), - SearchResult(obs1, included = null, revIncluded = null) + SearchResult(obs1, included = null, revIncluded = null), ) else -> emptyList() } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceDataSourceTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceDataSourceTest.kt index 70d5aaf49e..28dfc86473 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceDataSourceTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/FhirResourceDataSourceTest.kt @@ -56,7 +56,7 @@ class FhirResourceDataSourceTest { coEvery { resourceService.insertResource(any(), any(), any()) } returns resource Assert.assertEquals( resource, - fhirResourceDataSource.insert(ResourceType.Patient.name, "id", "{}") + fhirResourceDataSource.insert(ResourceType.Patient.name, "id", "{}"), ) } } @@ -68,20 +68,19 @@ class FhirResourceDataSourceTest { coEvery { resourceService.updateResource(any(), any(), any()) } returns operationOutcome Assert.assertEquals( operationOutcome, - fhirResourceDataSource.update(ResourceType.Patient.name, "id", "{}") + fhirResourceDataSource.update(ResourceType.Patient.name, "id", "{}"), ) } } @Test fun testDeleteShouldRemoveResource() { - runTest { val operationOutcome = OperationOutcome() coEvery { resourceService.deleteResource(any(), any()) } returns operationOutcome Assert.assertEquals( operationOutcome, - fhirResourceDataSource.delete(ResourceType.Patient.name, "id") + fhirResourceDataSource.delete(ResourceType.Patient.name, "id"), ) } } @@ -95,8 +94,8 @@ class FhirResourceDataSourceTest { bundle, fhirResourceDataSource.search( ResourceType.Practitioner.name, - mapOf("identifier" to "19292929") - ) + mapOf("identifier" to "19292929"), + ), ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/ReferenceUrlResolverTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/ReferenceUrlResolverTest.kt index e2546e0067..df05fc3d35 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/ReferenceUrlResolverTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/fhir/resource/ReferenceUrlResolverTest.kt @@ -61,8 +61,8 @@ class ReferenceUrlResolverTest : RobolectricTest() { Assert.assertEquals( binary, referenceUrlResolver.resolveBinaryResource( - "https://fhir-server.org/Binary/sample-binary-image" - ) + "https://fhir-server.org/Binary/sample-binary-image", + ), ) } @@ -84,16 +84,17 @@ class ReferenceUrlResolverTest : RobolectricTest() { override fun contentType(): MediaType? = null override fun source(): BufferedSource = mockk() - } + }, ) val mockResponse = Response.success(mockResponseBody) every { mockResponseBody.byteStream() } returns (ByteArrayInputStream( - "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7".toByteArray( - Charset.forName("UTF-8") - ) + "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" + .toByteArray( + Charset.forName("UTF-8"), + ), )) val callResponse = mockk>() every { callResponse.execute() } returns mockResponse diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/shared/FhirResourceConverterTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/shared/FhirResourceConverterTest.kt index e5225cf67e..bc78b339dc 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/shared/FhirResourceConverterTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/remote/shared/FhirResourceConverterTest.kt @@ -38,6 +38,7 @@ class FhirResourceConverterTest { @MockK lateinit var retrofit: Retrofit lateinit var annotations: Array + @Before fun setUp() { MockKAnnotations.init(this, relaxed = true, relaxUnitFun = true) @@ -62,10 +63,8 @@ class FhirResourceConverterTest { val input = parser.encodeResourceToString(buildPatient()).toByteArray().toResponseBody() val result = - FhirConverterFactory(parser) - .responseBodyConverter(type, annotations, retrofit) - .convert(input) as - Patient + FhirConverterFactory(parser).responseBodyConverter(type, annotations, retrofit).convert(input) + as Patient Assert.assertEquals("John", result.nameFirstRep.given[0].value) Assert.assertEquals("Doe", result.nameFirstRep.family) Assert.assertEquals("12345", result.logicalId) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/HealthStatusTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/HealthStatusTest.kt index dfaf04693e..6c5d6cde2e 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/HealthStatusTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/HealthStatusTest.kt @@ -23,7 +23,6 @@ class HealthStatusTest { @Test fun testPatientTypes() { - val expectedContactHealthStatusPriority = 3 Assert.assertNotNull(HealthStatus.valueOf("NEWLY_DIAGNOSED_CLIENT")) Assert.assertNotNull(HealthStatus.valueOf("CLIENT_ALREADY_ON_ART")) @@ -41,14 +40,14 @@ class HealthStatusTest { Assert.assertNotNull(biologicalParentContactHealthStatus) Assert.assertEquals( expectedContactHealthStatusPriority, - biologicalParentContactHealthStatus.priority() + biologicalParentContactHealthStatus.priority(), ) val socialNetworkContactHealthStatus = HealthStatus.valueOf("SOCIAL_NETWORK_CONTACT") Assert.assertNotNull(socialNetworkContactHealthStatus) Assert.assertEquals( expectedContactHealthStatusPriority, - socialNetworkContactHealthStatus.priority() + socialNetworkContactHealthStatus.priority(), ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/ProfileDataTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/ProfileDataTest.kt index c2c41d1437..7fbdce1984 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/ProfileDataTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/ProfileDataTest.kt @@ -124,9 +124,10 @@ class ProfileDataTest : RobolectricTest() { healthStatus = HealthStatus.EXPOSED_INFANT, services = buildCarePlanServices(), conditions = emptyList(), - practitioners = emptyList() + practitioners = emptyList(), ) - HealthModule.HOME_TRACING, HealthModule.PHONE_TRACING -> + HealthModule.HOME_TRACING, + HealthModule.PHONE_TRACING, -> ProfileData.DefaultProfileData( logicalId = "logicalId", name = "testName", @@ -134,7 +135,7 @@ class ProfileDataTest : RobolectricTest() { address = "testAddress", age = "5y", gender = Enumerations.AdministrativeGender.MALE, - birthdate = SimpleDateFormat("yyyy-MM-dd").parse("2021-05-25") + birthdate = SimpleDateFormat("yyyy-MM-dd").parse("2021-05-25"), ) HealthModule.APPOINTMENT -> ProfileData.DefaultProfileData( @@ -144,7 +145,7 @@ class ProfileDataTest : RobolectricTest() { address = "testAddress", age = "5y", gender = Enumerations.AdministrativeGender.MALE, - birthdate = SimpleDateFormat("yyyy-MM-dd").parse("2021-05-25") + birthdate = SimpleDateFormat("yyyy-MM-dd").parse("2021-05-25"), ) HealthModule.ANC -> ProfileData.AncProfileData( @@ -160,7 +161,7 @@ class ProfileDataTest : RobolectricTest() { tasks = emptyList(), conditions = emptyList(), flags = emptyList(), - visits = emptyList() + visits = emptyList(), ) HealthModule.FAMILY -> ProfileData.FamilyProfileData( @@ -171,7 +172,7 @@ class ProfileDataTest : RobolectricTest() { age = "5y", services = emptyList(), tasks = emptyList(), - members = emptyList() + members = emptyList(), ) HealthModule.FAMILY_PLANNING -> ProfileData.FamilyProfileData( @@ -182,7 +183,7 @@ class ProfileDataTest : RobolectricTest() { age = "5y", services = emptyList(), tasks = emptyList(), - members = emptyList() + members = emptyList(), ) HealthModule.RDT -> ProfileData.FamilyProfileData( @@ -193,7 +194,7 @@ class ProfileDataTest : RobolectricTest() { age = "5y", services = emptyList(), tasks = emptyList(), - members = emptyList() + members = emptyList(), ) HealthModule.PNC -> ProfileData.FamilyProfileData( @@ -204,7 +205,7 @@ class ProfileDataTest : RobolectricTest() { age = "5y", services = emptyList(), tasks = emptyList(), - members = emptyList() + members = emptyList(), ) HealthModule.CHILD -> ProfileData.AncProfileData( @@ -220,7 +221,7 @@ class ProfileDataTest : RobolectricTest() { tasks = emptyList(), conditions = emptyList(), flags = emptyList(), - visits = emptyList() + visits = emptyList(), ) HealthModule.DEFAULT -> ProfileData.DefaultProfileData( @@ -235,7 +236,7 @@ class ProfileDataTest : RobolectricTest() { tasks = emptyList(), conditions = emptyList(), flags = emptyList(), - visits = emptyList() + visits = emptyList(), ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/RegisterDataTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/RegisterDataTest.kt index 17dcca05c0..886e012cb6 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/RegisterDataTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/RegisterDataTest.kt @@ -137,13 +137,14 @@ class RegisterDataTest : RobolectricTest() { practitioners = listOf( Reference().setReference("reference/Key1"), - Reference().setReference("reference/Key2") + Reference().setReference("reference/Key2"), ), chwAssigned = "reference/Key", phoneContacts = emptyList(), - healthStatus = HealthStatus.EXPOSED_INFANT + healthStatus = HealthStatus.EXPOSED_INFANT, ) - HealthModule.HOME_TRACING, HealthModule.PHONE_TRACING -> + HealthModule.HOME_TRACING, + HealthModule.PHONE_TRACING, -> RegisterData.TracingRegisterData( logicalId = "logicalId", name = "testName", @@ -152,7 +153,7 @@ class RegisterDataTest : RobolectricTest() { healthStatus = HealthStatus.EXPOSED_INFANT, isBreastfeeding = false, isPregnant = false, - attempts = 0 + attempts = 0, ) HealthModule.APPOINTMENT -> RegisterData.AppointmentRegisterData( @@ -163,7 +164,7 @@ class RegisterDataTest : RobolectricTest() { gender = Enumerations.AdministrativeGender.MALE, healthStatus = HealthStatus.EXPOSED_INFANT, isBreastfeeding = false, - isPregnant = false + isPregnant = false, ) HealthModule.ANC -> RegisterData.AncRegisterData( @@ -173,7 +174,7 @@ class RegisterDataTest : RobolectricTest() { address = "testAddress", age = "5y", gender = Enumerations.AdministrativeGender.MALE, - visitStatus = VisitStatus.DUE + visitStatus = VisitStatus.DUE, ) HealthModule.FAMILY -> RegisterData.FamilyRegisterData( @@ -181,7 +182,7 @@ class RegisterDataTest : RobolectricTest() { name = "testName", identifier = "testIdentifier()", address = "testAddress", - members = emptyList() + members = emptyList(), ) HealthModule.FAMILY_PLANNING -> RegisterData.FamilyRegisterData( @@ -189,7 +190,7 @@ class RegisterDataTest : RobolectricTest() { name = "testName", identifier = "testIdentifier()", address = "testAddress", - members = emptyList() + members = emptyList(), ) HealthModule.RDT -> RegisterData.AncRegisterData( @@ -199,7 +200,7 @@ class RegisterDataTest : RobolectricTest() { address = "testAddress", age = "5y", gender = Enumerations.AdministrativeGender.MALE, - visitStatus = VisitStatus.DUE + visitStatus = VisitStatus.DUE, ) HealthModule.PNC -> RegisterData.AncRegisterData( @@ -209,7 +210,7 @@ class RegisterDataTest : RobolectricTest() { address = "testAddress", age = "5y", gender = Enumerations.AdministrativeGender.MALE, - visitStatus = VisitStatus.DUE + visitStatus = VisitStatus.DUE, ) HealthModule.CHILD -> RegisterData.AncRegisterData( @@ -219,14 +220,14 @@ class RegisterDataTest : RobolectricTest() { address = "testAddress", age = "5y", gender = Enumerations.AdministrativeGender.MALE, - visitStatus = VisitStatus.DUE + visitStatus = VisitStatus.DUE, ) HealthModule.DEFAULT -> RegisterData.DefaultRegisterData( logicalId = "logicalId", name = "testName", age = "5y", - gender = Enumerations.AdministrativeGender.MALE + gender = Enumerations.AdministrativeGender.MALE, ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/navigation/NavigationBottomSheetTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/navigation/NavigationBottomSheetTest.kt index b3879e97ee..efb9d94992 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/navigation/NavigationBottomSheetTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/navigation/NavigationBottomSheetTest.kt @@ -38,7 +38,7 @@ class NavigationBottomSheetTest : RobolectricTest() { private val registerItems = listOf( RegisterItem(uniqueTag = "UniqueTag1", title = "Menu 1", isSelected = true), - RegisterItem(uniqueTag = "UniqueTag2", title = "Menu 2", isSelected = false) + RegisterItem(uniqueTag = "UniqueTag2", title = "Menu 2", isSelected = false), ) @Before diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/navigation/RegisterBottomSheetViewsKtTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/navigation/RegisterBottomSheetViewsKtTest.kt index c54857df4d..28814d7108 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/navigation/RegisterBottomSheetViewsKtTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/navigation/RegisterBottomSheetViewsKtTest.kt @@ -33,7 +33,7 @@ class RegisterBottomSheetViewsKtTest : RobolectricTest() { private val registerItems = listOf( RegisterItem(uniqueTag = "UniqueTag1", title = "Menu 1", isSelected = true), - RegisterItem(uniqueTag = "UniqueTag2", title = "Menu 2", isSelected = false) + RegisterItem(uniqueTag = "UniqueTag2", title = "Menu 2", isSelected = false), ) @Test diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/BaseP2PTransferDaoTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/BaseP2PTransferDaoTest.kt index 6bb2c68d37..10e82ceebc 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/BaseP2PTransferDaoTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/BaseP2PTransferDaoTest.kt @@ -69,24 +69,26 @@ class BaseP2PTransferDaoTest : RobolectricTest() { val actualDataTypes = baseP2PTransferDao.getDataTypes() Assert.assertEquals(6, actualDataTypes.size) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Group.name, DataType.Filetype.JSON, 0)) + actualDataTypes.contains(DataType(ResourceType.Group.name, DataType.Filetype.JSON, 0)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 1)) + actualDataTypes.contains(DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 1)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Questionnaire.name, DataType.Filetype.JSON, 2)) + actualDataTypes.contains( + DataType(ResourceType.Questionnaire.name, DataType.Filetype.JSON, 2), + ), ) Assert.assertTrue( actualDataTypes.contains( - DataType(ResourceType.QuestionnaireResponse.name, DataType.Filetype.JSON, 3) - ) + DataType(ResourceType.QuestionnaireResponse.name, DataType.Filetype.JSON, 3), + ), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Observation.name, DataType.Filetype.JSON, 4)) + actualDataTypes.contains(DataType(ResourceType.Observation.name, DataType.Filetype.JSON, 4)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Encounter.name, DataType.Filetype.JSON, 5)) + actualDataTypes.contains(DataType(ResourceType.Encounter.name, DataType.Filetype.JSON, 5)), ) } @@ -132,12 +134,11 @@ class BaseP2PTransferDaoTest : RobolectricTest() { @Test fun `loadResources() calls fhirEngine#search()`() { - runBlocking { baseP2PTransferDao.loadResources( lastRecordUpdatedAt = 0, batchSize = 25, - classType = Patient::class.java + classType = Patient::class.java, ) } @@ -159,38 +160,38 @@ class BaseP2PTransferDaoTest : RobolectricTest() { Assert.assertEquals( Group::class.java, baseP2PTransferDao.resourceClassType( - DataType(ResourceType.Group.name, DataType.Filetype.JSON, 0) - ) + DataType(ResourceType.Group.name, DataType.Filetype.JSON, 0), + ), ) Assert.assertEquals( Encounter::class.java, baseP2PTransferDao.resourceClassType( - DataType(ResourceType.Encounter.name, DataType.Filetype.JSON, 0) - ) + DataType(ResourceType.Encounter.name, DataType.Filetype.JSON, 0), + ), ) Assert.assertEquals( Observation::class.java, baseP2PTransferDao.resourceClassType( - DataType(ResourceType.Observation.name, DataType.Filetype.JSON, 0) - ) + DataType(ResourceType.Observation.name, DataType.Filetype.JSON, 0), + ), ) Assert.assertEquals( Patient::class.java, baseP2PTransferDao.resourceClassType( - DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 0) - ) + DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 0), + ), ) Assert.assertEquals( Questionnaire::class.java, baseP2PTransferDao.resourceClassType( - DataType(ResourceType.Questionnaire.name, DataType.Filetype.JSON, 0) - ) + DataType(ResourceType.Questionnaire.name, DataType.Filetype.JSON, 0), + ), ) Assert.assertEquals( QuestionnaireResponse::class.java, baseP2PTransferDao.resourceClassType( - DataType(ResourceType.QuestionnaireResponse.name, DataType.Filetype.JSON, 0) - ) + DataType(ResourceType.QuestionnaireResponse.name, DataType.Filetype.JSON, 0), + ), ) } @@ -207,14 +208,14 @@ class BaseP2PTransferDaoTest : RobolectricTest() { Address().apply { city = "Nairobi" country = "Kenya" - } + }, ) name = listOf( HumanName().apply { given = mutableListOf(StringType("Kiptoo")) family = "Maina" - } + }, ) telecom = listOf(ContactPoint().apply { value = "12345" }) meta = Meta().apply { lastUpdated = currentDate } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/P2PReceiverTransferDaoTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/P2PReceiverTransferDaoTest.kt index d161051671..bbd820dec2 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/P2PReceiverTransferDaoTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/P2PReceiverTransferDaoTest.kt @@ -65,24 +65,26 @@ class P2PReceiverTransferDaoTest : RobolectricTest() { val actualDataTypes = p2PReceiverTransferDao.getDataTypes() Assert.assertEquals(6, actualDataTypes.size) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Group.name, DataType.Filetype.JSON, 0)) + actualDataTypes.contains(DataType(ResourceType.Group.name, DataType.Filetype.JSON, 0)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 1)) + actualDataTypes.contains(DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 1)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Questionnaire.name, DataType.Filetype.JSON, 2)) + actualDataTypes.contains( + DataType(ResourceType.Questionnaire.name, DataType.Filetype.JSON, 2), + ), ) Assert.assertTrue( actualDataTypes.contains( - DataType(ResourceType.QuestionnaireResponse.name, DataType.Filetype.JSON, 3) - ) + DataType(ResourceType.QuestionnaireResponse.name, DataType.Filetype.JSON, 3), + ), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Observation.name, DataType.Filetype.JSON, 4)) + actualDataTypes.contains(DataType(ResourceType.Observation.name, DataType.Filetype.JSON, 4)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Encounter.name, DataType.Filetype.JSON, 5)) + actualDataTypes.contains(DataType(ResourceType.Encounter.name, DataType.Filetype.JSON, 5)), ) } @@ -119,14 +121,14 @@ class P2PReceiverTransferDaoTest : RobolectricTest() { Address().apply { city = "Nairobi" country = "Kenya" - } + }, ) name = listOf( HumanName().apply { given = mutableListOf(StringType("Kiptoo")) family = "Maina" - } + }, ) telecom = listOf(ContactPoint().apply { value = "12345" }) meta = Meta().apply { lastUpdated = currentDate } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/P2PSenderTransferDaoTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/P2PSenderTransferDaoTest.kt index 71643bdd58..da596ae700 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/P2PSenderTransferDaoTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/p2p/dao/P2PSenderTransferDaoTest.kt @@ -59,24 +59,26 @@ class P2PSenderTransferDaoTest : RobolectricTest() { val actualDataTypes = p2PSenderTransferDao.getDataTypes() Assert.assertEquals(6, actualDataTypes.size) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Group.name, DataType.Filetype.JSON, 0)) + actualDataTypes.contains(DataType(ResourceType.Group.name, DataType.Filetype.JSON, 0)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 1)) + actualDataTypes.contains(DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 1)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Questionnaire.name, DataType.Filetype.JSON, 2)) + actualDataTypes.contains( + DataType(ResourceType.Questionnaire.name, DataType.Filetype.JSON, 2), + ), ) Assert.assertTrue( actualDataTypes.contains( - DataType(ResourceType.QuestionnaireResponse.name, DataType.Filetype.JSON, 3) - ) + DataType(ResourceType.QuestionnaireResponse.name, DataType.Filetype.JSON, 3), + ), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Observation.name, DataType.Filetype.JSON, 4)) + actualDataTypes.contains(DataType(ResourceType.Observation.name, DataType.Filetype.JSON, 4)), ) Assert.assertTrue( - actualDataTypes.contains(DataType(ResourceType.Encounter.name, DataType.Filetype.JSON, 5)) + actualDataTypes.contains(DataType(ResourceType.Encounter.name, DataType.Filetype.JSON, 5)), ) } @@ -87,7 +89,7 @@ class P2PSenderTransferDaoTest : RobolectricTest() { p2PSenderTransferDao.loadResources( lastRecordUpdatedAt = 0, batchSize = 25, - Patient::class.java + Patient::class.java, ) } returns listOf(expectedPatient) val patientDataType = DataType(ResourceType.Patient.name, DataType.Filetype.JSON, 1) @@ -120,14 +122,14 @@ class P2PSenderTransferDaoTest : RobolectricTest() { Address().apply { city = "Nairobi" country = "Kenya" - } + }, ) name = listOf( HumanName().apply { given = mutableListOf(StringType("Kiptoo")) family = "Maina" - } + }, ) telecom = listOf(ContactPoint().apply { value = "12345" }) meta = Meta().apply { lastUpdated = currentDate } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/rule/CoroutineTestRule.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/rule/CoroutineTestRule.kt index 6b124855e9..bff0fadce0 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/rule/CoroutineTestRule.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/rule/CoroutineTestRule.kt @@ -33,8 +33,11 @@ class CoroutineTestRule(val testDispatcher: TestDispatcher = UnconfinedTestDispa val testDispatcherProvider = object : DispatcherProvider { override fun default() = testDispatcher + override fun io() = testDispatcher + override fun main() = testDispatcher + override fun unconfined() = testDispatcher } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/sync/AppSyncWorkerTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/sync/AppSyncWorkerTest.kt index 97a29bebf8..4257b83790 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/sync/AppSyncWorkerTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/sync/AppSyncWorkerTest.kt @@ -47,8 +47,11 @@ import org.smartregister.fhircore.engine.util.AppDataStore @HiltAndroidTest class AppSyncWorkerTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) + @Inject lateinit var fhirEngine: FhirEngine + @BindValue val dataStore: AppDataStore = mockk() + @BindValue val syncParamsManager: SyncListenerManager = mockk() private lateinit var appSyncWorker: AppSyncWorker @@ -64,10 +67,10 @@ class AppSyncWorkerTest : RobolectricTest() { override fun createWorker( appContext: Context, workerClassName: String, - workerParameters: WorkerParameters + workerParameters: WorkerParameters, ): ListenableWorker = AppSyncWorker(appContext, workerParameters, syncParamsManager, fhirEngine, dataStore) - } + }, ) .build() } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/sync/SyncBroadcasterTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/sync/SyncBroadcasterTest.kt index 60654332cd..502f73ca93 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/sync/SyncBroadcasterTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/sync/SyncBroadcasterTest.kt @@ -111,7 +111,7 @@ class SyncBroadcasterTest : RobolectricTest() { tracer = tracer, tokenAuthenticator = tokenAuthenticator, sharedPreferencesHelper = sharedPreferencesHelper, - appContext = mockk(relaxed = true) + appContext = mockk(relaxed = true), ) } @@ -138,10 +138,10 @@ class SyncBroadcasterTest : RobolectricTest() { listOf(), workDataOf( "StateType" to SyncJobStatus.Started::class.java.name, - "State" to gson.toJson(SyncJobStatus.Started()) + "State" to gson.toJson(SyncJobStatus.Started()), ), 0, - 0 + 0, ) val inProgressInfo = WorkInfo( @@ -151,10 +151,10 @@ class SyncBroadcasterTest : RobolectricTest() { listOf(), workDataOf( "StateType" to SyncJobStatus.Finished::class.java.name, - "State" to gson.toJson(SyncJobStatus.Finished()) + "State" to gson.toJson(SyncJobStatus.Finished()), ), 0, - 0 + 0, ) every { workManager.getWorkInfosForUniqueWorkLiveData(any()) } answers @@ -165,7 +165,7 @@ class SyncBroadcasterTest : RobolectricTest() { uniqueWorkName.startsWith(AppSyncWorker::class.java.name) -> listOf(workInfo, inProgressInfo) else -> emptyList() - } + }, ) } @@ -218,7 +218,7 @@ class SyncBroadcasterTest : RobolectricTest() { appContext = context, tracer = FakePerformanceReporter(), tokenAuthenticator = tokenAuthenticator, - sharedPreferencesHelper = sharedPreferencesHelper + sharedPreferencesHelper = sharedPreferencesHelper, ) val collectedSyncStatusList = mutableListOf() val job = @@ -231,7 +231,7 @@ class SyncBroadcasterTest : RobolectricTest() { syncStatus as SyncJobStatus.Failed Assert.assertEquals( context.getString(R.string.unable_to_sync), - syncStatus.exceptions.first().exception.message + syncStatus.exceptions.first().exception.message, ) job.cancel() } @@ -254,7 +254,7 @@ class SyncBroadcasterTest : RobolectricTest() { appContext = context, tracer = FakePerformanceReporter(), tokenAuthenticator = tokenAuthenticatorAlt, - sharedPreferencesHelper = sharedPreferencesHelper + sharedPreferencesHelper = sharedPreferencesHelper, ) val collectedSyncStatusList = mutableListOf() val job = @@ -267,7 +267,7 @@ class SyncBroadcasterTest : RobolectricTest() { syncStatus as SyncJobStatus.Failed Assert.assertEquals( context.getString(R.string.sync_authentication_error), - syncStatus.exceptions.first().exception.message + syncStatus.exceptions.first().exception.message, ) job.cancel() } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirCarePlanGeneratorTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirCarePlanGeneratorTest.kt index 1074dcc45f..39e9ed95d6 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirCarePlanGeneratorTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirCarePlanGeneratorTest.kt @@ -83,7 +83,7 @@ class FhirCarePlanGeneratorTest : RobolectricTest() { fhirCarePlanGenerator = FhirCarePlanGenerator( fhirEngine = fhirEngine, - transformSupportServices = transformSupportServices + transformSupportServices = transformSupportServices, ) mockkStatic(DateTimeType::class) @@ -116,10 +116,11 @@ class FhirCarePlanGeneratorTest : RobolectricTest() { coEvery { fhirEngine.create(any()) } returns emptyList() coEvery { fhirEngine.get("131373") } returns structureMap - fhirCarePlanGenerator.generateCarePlan( + fhirCarePlanGenerator + .generateCarePlan( plandefinition, patient, - Bundle().addEntry(Bundle.BundleEntryComponent().apply { resource = patient }) + Bundle().addEntry(Bundle.BundleEntryComponent().apply { resource = patient }), )!! .also { println(it.encodeResourceToString()) } .also { @@ -130,24 +131,24 @@ class FhirCarePlanGeneratorTest : RobolectricTest() { Assert.assertEquals("Child Routine visit Plan", carePlan.title) Assert.assertEquals( "This defines the schedule of care for patients under 5 years old", - carePlan.description + carePlan.description, ) Assert.assertEquals(patient.logicalId, carePlan.subject.extractId()) Assert.assertEquals( DateTimeType.now().value.makeItReadable(), - carePlan.created.makeItReadable() + carePlan.created.makeItReadable(), ) Assert.assertEquals( patient.generalPractitionerFirstRep.extractId(), - carePlan.author.extractId() + carePlan.author.extractId(), ) Assert.assertEquals( DateTimeType.now().value.makeItReadable(), - carePlan.period.start.makeItReadable() + carePlan.period.start.makeItReadable(), ) Assert.assertEquals( patient.birthDate.plusYears(5).makeItReadable(), - carePlan.period.end.makeItReadable() + carePlan.period.end.makeItReadable(), ) // 60 - 2 = 58 TODO Fix issue with number of tasks updating relative to today's date Assert.assertTrue(carePlan.activityFirstRep.outcomeReference.isNotEmpty()) @@ -198,15 +199,16 @@ class FhirCarePlanGeneratorTest : RobolectricTest() { coEvery { fhirEngine.create(any()) } returns emptyList() coEvery { fhirEngine.get("hh") } returns structureMap - fhirCarePlanGenerator.generateCarePlan( + fhirCarePlanGenerator + .generateCarePlan( plandefinition, group, Bundle() .addEntry( Bundle.BundleEntryComponent().apply { resource = Encounter().apply { status = Encounter.EncounterStatus.FINISHED } - } - ) + }, + ), )!! .also { println(it.encodeResourceToString()) } .also { @@ -219,7 +221,7 @@ class FhirCarePlanGeneratorTest : RobolectricTest() { Assert.assertEquals(group.logicalId, carePlan.subject.extractId()) Assert.assertEquals( DateTimeType.now().value.makeItReadable(), - carePlan.created.makeItReadable() + carePlan.created.makeItReadable(), ) Assert.assertNotNull(carePlan.period.start) Assert.assertTrue(carePlan.activityFirstRep.outcomeReference.isNotEmpty()) @@ -301,7 +303,7 @@ class FhirCarePlanGeneratorTest : RobolectricTest() { CarePlan.CarePlanActivityComponent().let { activity -> activity.outcomeReference = listOf(Reference("12345")) activity - } + }, ) id = "123456" } @@ -320,7 +322,7 @@ class FhirCarePlanGeneratorTest : RobolectricTest() { Assert.assertNotNull( updatedCarePlan.activity.find { x -> x.outcomeReference.find { y -> y.reference == "12345" } == null - } + }, ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirTaskPlanWorkerTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirTaskPlanWorkerTest.kt index 4c8351e727..9cd88ae660 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirTaskPlanWorkerTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirTaskPlanWorkerTest.kt @@ -83,7 +83,7 @@ class FhirTaskPlanWorkerTest : RobolectricTest() { } }, included = null, - revIncluded = null + revIncluded = null, ), SearchResult( Task().apply { @@ -95,8 +95,8 @@ class FhirTaskPlanWorkerTest : RobolectricTest() { } }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) coEvery { fhirEngine.search(any()) } returns tasks @@ -122,7 +122,7 @@ class FhirTaskPlanWorkerTest : RobolectricTest() { override fun createWorker( appContext: Context, workerClassName: String, - workerParameters: WorkerParameters + workerParameters: WorkerParameters, ): ListenableWorker { return FhirTaskPlanWorker(appContext, workerParameters, fhirEngine) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/WelcomeServiceBackToCarePlanWorkerTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/WelcomeServiceBackToCarePlanWorkerTest.kt index f51817a719..e4fc524b59 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/WelcomeServiceBackToCarePlanWorkerTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/WelcomeServiceBackToCarePlanWorkerTest.kt @@ -79,11 +79,11 @@ class WelcomeServiceBackToCarePlanWorkerTest : RobolectricTest() { override fun createWorker( appContext: Context, workerClassName: String, - workerParameters: WorkerParameters + workerParameters: WorkerParameters, ): ListenableWorker { return WelcomeServiceBackToCarePlanWorker(appContext, workerParameters, fhirEngine) } - } + }, ) .build() } @@ -109,7 +109,7 @@ class WelcomeServiceBackToCarePlanWorkerTest : RobolectricTest() { Coding().apply { system = "https://d-tree.org" code = WelcomeServiceBackToCarePlanWorker.INTERRUPTED_TREAT_CODE - } + }, ) executionPeriod = Period().apply { start = Date() } `for` = patient0.asReference() @@ -142,7 +142,7 @@ class WelcomeServiceBackToCarePlanWorkerTest : RobolectricTest() { 1, carePlanActivity.detail.code.coding.count { it.code == WelcomeServiceBackToCarePlanWorker.WELCOME_SERVICE_QUESTIONNAIRE_ID - } + }, ) coVerify { fhirEngine.create( @@ -150,10 +150,10 @@ class WelcomeServiceBackToCarePlanWorkerTest : RobolectricTest() { it as Task Assert.assertEquals( it.logicalId, - IdType(carePlanActivity.outcomeReference.first().reference).idPart + IdType(carePlanActivity.outcomeReference.first().reference).idPart, ) Assert.assertEquals("Welcome Service", carePlanActivity.outcomeReference.first().display) - } + }, ) } } @@ -169,7 +169,7 @@ class WelcomeServiceBackToCarePlanWorkerTest : RobolectricTest() { Coding().apply { system = "https://d-tree.org" code = WelcomeServiceBackToCarePlanWorker.INTERRUPTED_TREAT_CODE - } + }, ) executionPeriod = Period().apply { start = Date() } `for` = patient0.asReference() @@ -197,8 +197,8 @@ class WelcomeServiceBackToCarePlanWorkerTest : RobolectricTest() { Coding( "https://d-tree.org", WelcomeServiceBackToCarePlanWorker.WELCOME_SERVICE_QUESTIONNAIRE_ID, - taskDescription - ) + taskDescription, + ), ) scheduled = period.copy().apply { start = DateTimeType.now().value } addPerformer(author) @@ -229,7 +229,7 @@ class WelcomeServiceBackToCarePlanWorkerTest : RobolectricTest() { act.detail.code.coding.any { it.code == WelcomeServiceBackToCarePlanWorker.WELCOME_SERVICE_QUESTIONNAIRE_ID } - } + }, ) Assert.assertEquals(ListenableWorker.Result.success(), result) coVerify(exactly = 0) { fhirEngine.create(any()) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/RegisterViewModelTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/RegisterViewModelTest.kt index ca1c480726..b49ba28c8a 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/RegisterViewModelTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/RegisterViewModelTest.kt @@ -75,7 +75,7 @@ class RegisterViewModelTest : RobolectricTest() { configurationRegistry = configurationRegistry, configService = configService, dispatcher = coroutineTestRule.testDispatcherProvider, - sharedPreferencesHelper = sharedPreferencesHelper + sharedPreferencesHelper = sharedPreferencesHelper, ) } @@ -85,7 +85,7 @@ class RegisterViewModelTest : RobolectricTest() { mockk { every { appId } returns "appId" every { appTitle } returns "Covax" - } + }, ) Assert.assertEquals("appId", viewModel.registerViewConfiguration.value?.appId) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingActivityTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingActivityTest.kt index 82d19b9e42..85481f5169 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingActivityTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingActivityTest.kt @@ -47,10 +47,15 @@ class AppSettingActivityTest : RobolectricTest() { val context: Context = ApplicationProvider.getApplicationContext().apply { setTheme(R.style.AppTheme) } + @Inject lateinit var gson: Gson + @Inject lateinit var sharedPreferencesHelper: SharedPreferencesHelper + @BindValue val secureSharedPreference = mockk() + @BindValue val accountAuthenticator = mockk() + @BindValue var configurationRegistry = Faker.buildTestConfigurationRegistry() private lateinit var appSettingActivityActivity: AppSettingActivity @@ -74,11 +79,14 @@ class AppSettingActivityTest : RobolectricTest() { Assert.assertEquals( false, - appSettingActivityActivity.sharedPreferencesHelper.read(IS_LOGGED_IN, false) + appSettingActivityActivity.sharedPreferencesHelper.read(IS_LOGGED_IN, false), ) Assert.assertEquals( null, - appSettingActivityActivity.sharedPreferencesHelper.read(SharedPreferenceKey.APP_ID.name, null) + appSettingActivityActivity.sharedPreferencesHelper.read( + SharedPreferenceKey.APP_ID.name, + null, + ), ) Assert.assertEquals(false, appSettingActivityActivity.accountAuthenticator.hasActiveSession()) } @@ -90,11 +98,14 @@ class AppSettingActivityTest : RobolectricTest() { Assert.assertEquals( false, - appSettingActivityActivity.sharedPreferencesHelper.read(IS_LOGGED_IN, false) + appSettingActivityActivity.sharedPreferencesHelper.read(IS_LOGGED_IN, false), ) Assert.assertEquals( "default", - appSettingActivityActivity.sharedPreferencesHelper.read(SharedPreferenceKey.APP_ID.name, null) + appSettingActivityActivity.sharedPreferencesHelper.read( + SharedPreferenceKey.APP_ID.name, + null, + ), ) Assert.assertEquals(false, appSettingActivityActivity.accountAuthenticator.hasActiveSession()) } @@ -107,11 +118,14 @@ class AppSettingActivityTest : RobolectricTest() { Assert.assertEquals( true, - appSettingActivityActivity.sharedPreferencesHelper.read(IS_LOGGED_IN, false) + appSettingActivityActivity.sharedPreferencesHelper.read(IS_LOGGED_IN, false), ) Assert.assertEquals( "default", - appSettingActivityActivity.sharedPreferencesHelper.read(SharedPreferenceKey.APP_ID.name, null) + appSettingActivityActivity.sharedPreferencesHelper.read( + SharedPreferenceKey.APP_ID.name, + null, + ), ) Assert.assertEquals(true, appSettingActivityActivity.accountAuthenticator.hasActiveSession()) } @@ -124,11 +138,14 @@ class AppSettingActivityTest : RobolectricTest() { Assert.assertEquals( true, - appSettingActivityActivity.sharedPreferencesHelper.read(IS_LOGGED_IN, false) + appSettingActivityActivity.sharedPreferencesHelper.read(IS_LOGGED_IN, false), ) Assert.assertEquals( "default", - appSettingActivityActivity.sharedPreferencesHelper.read(SharedPreferenceKey.APP_ID.name, null) + appSettingActivityActivity.sharedPreferencesHelper.read( + SharedPreferenceKey.APP_ID.name, + null, + ), ) Assert.assertEquals(false, appSettingActivityActivity.accountAuthenticator.hasActiveSession()) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingViewModelTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingViewModelTest.kt index a9fbd90402..d0a5f7cc87 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingViewModelTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/appsetting/AppSettingViewModelTest.kt @@ -63,10 +63,11 @@ class AppSettingViewModelTest : RobolectricTest() { private val sharedPreferencesHelper = SharedPreferencesHelper( ApplicationProvider.getApplicationContext(), - GsonBuilder().setLenient().create() + GsonBuilder().setLenient().create(), ) private val configService = mockk() + @ExperimentalCoroutinesApi private val appSettingViewModel = spyk( @@ -75,8 +76,8 @@ class AppSettingViewModelTest : RobolectricTest() { defaultRepository = defaultRepository, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = Faker.buildTestConfigurationRegistry(), - dispatcherProvider = this.coroutineTestRule.testDispatcherProvider - ) + dispatcherProvider = this.coroutineTestRule.testDispatcherProvider, + ), ) private val context = ApplicationProvider.getApplicationContext() @@ -132,8 +133,8 @@ class AppSettingViewModelTest : RobolectricTest() { HttpException( Response.error( 500, - "Internal Server Error".toResponseBody("application/json".toMediaTypeOrNull()) - ) + "Internal Server Error".toResponseBody("application/json".toMediaTypeOrNull()), + ), ) fhirResourceDataSource.getResource(ArgumentMatchers.anyString()) verify { context.showToast(context.getString(R.string.error_loading_config_http_error)) } @@ -142,7 +143,7 @@ class AppSettingViewModelTest : RobolectricTest() { verify { context.showToast(context.getString(R.string.error_loading_config_http_error)) } Assert.assertEquals( context.getString(R.string.error_loading_config_http_error), - appSettingViewModel.error.value + appSettingViewModel.error.value, ) Assert.assertEquals(false, appSettingViewModel.showProgressBar.value) } @@ -160,7 +161,7 @@ class AppSettingViewModelTest : RobolectricTest() { verify { context.showToast(context.getString(R.string.error_loading_config_no_internet)) } Assert.assertEquals( context.getString(R.string.error_loading_config_no_internet), - appSettingViewModel.error.value + appSettingViewModel.error.value, ) Assert.assertEquals(false, appSettingViewModel.showProgressBar.value) } @@ -177,7 +178,7 @@ class AppSettingViewModelTest : RobolectricTest() { verify { context.showToast(context.getString(R.string.error_loading_config_http_error)) } Assert.assertEquals( context.getString(R.string.error_loading_config_http_error), - appSettingViewModel.error.value + appSettingViewModel.error.value, ) Assert.assertEquals(false, appSettingViewModel.showProgressBar.value) } @@ -196,7 +197,7 @@ class AppSettingViewModelTest : RobolectricTest() { every { context.getString(R.string.error_loading_config_general) } Assert.assertEquals( context.getString(R.string.error_loading_config_no_internet), - appSettingViewModel.error.value + appSettingViewModel.error.value, ) Assert.assertEquals(false, appSettingViewModel.showProgressBar.value) } @@ -213,7 +214,7 @@ class AppSettingViewModelTest : RobolectricTest() { verify { context.showToast(context.getString(R.string.error_loading_config_http_error)) } Assert.assertEquals( context.getString(R.string.error_loading_config_http_error), - appSettingViewModel.error.value + appSettingViewModel.error.value, ) Assert.assertEquals(false, appSettingViewModel.showProgressBar.value) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/base/AlertDialogueTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/base/AlertDialogueTest.kt index ef925bcb15..c58499215e 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/base/AlertDialogueTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/base/AlertDialogueTest.kt @@ -57,7 +57,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { confirmButtonListener = { confirmCalled.add(true) }, neutralButtonText = R.string.questionnaire_alert_ack_button_title, neutralButtonListener = { neutralCalled.add(true) }, - options = arrayOf(AlertDialogListItem("a", "A"), AlertDialogListItem("b", "B")) + options = arrayOf(AlertDialogListItem("a", "A"), AlertDialogListItem("b", "B")), ) val dialog = shadowOf(ShadowAlertDialog.getLatestAlertDialog()) @@ -67,7 +67,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { dialog, getString(R.string.questionnaire_alert_invalid_message), getString(R.string.questionnaire_alert_invalid_title), - getString(R.string.questionnaire_alert_confirm_button_title) + getString(R.string.questionnaire_alert_confirm_button_title), ) Assert.assertEquals(2, alertDialog.listView.count) @@ -80,7 +80,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { val neutralButton = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL) Assert.assertEquals( getString(R.string.questionnaire_alert_ack_button_title), - neutralButton.text + neutralButton.text, ) // TODO: test click @@ -100,7 +100,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { Assert.assertEquals( getString(R.string.form_progress_message), - dialog.view.findViewById(R.id.tv_alert_message)!!.text + dialog.view.findViewById(R.id.tv_alert_message)!!.text, ) Assert.assertEquals(View.VISIBLE, dialog.view.findViewById(R.id.pr_circular)!!.visibility) @@ -119,7 +119,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { message = R.string.form_progress_message, title = R.string.questionnaire_alert_invalid_title, confirmButtonListener = {}, - confirmButtonText = R.string.done + confirmButtonText = R.string.done, ) val dialog = shadowOf(ShadowAlertDialog.getLatestAlertDialog()) @@ -129,7 +129,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { dialog, getString(R.string.form_progress_message), getString(R.string.questionnaire_alert_invalid_title), - getString(R.string.done) + getString(R.string.done), ) // test an additional cancel or neutral button in confirm alert @@ -137,7 +137,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { Assert.assertEquals(View.VISIBLE, neutralButton.visibility) Assert.assertEquals( getString(R.string.questionnaire_alert_neutral_button_title), - neutralButton.text + neutralButton.text, ) } @@ -146,7 +146,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { AlertDialogue.showErrorAlert( context = context, message = R.string.error_saving_form, - title = R.string.default_app_title + title = R.string.default_app_title, ) val dialog = shadowOf(ShadowAlertDialog.getLatestAlertDialog()) @@ -155,7 +155,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { dialog, getString(R.string.error_saving_form), getString(R.string.default_app_title), - getString(R.string.questionnaire_alert_ack_button_title) + getString(R.string.questionnaire_alert_ack_button_title), ) } @@ -165,7 +165,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { context = context, message = "Here is the complete info", title = "Info title", - confirmButtonText = R.string.done + confirmButtonText = R.string.done, ) val dialog = shadowOf(ShadowAlertDialog.getLatestAlertDialog()) @@ -174,7 +174,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { dialog, "Here is the complete info", "Info title", - getString(R.string.done) + getString(R.string.done), ) } @@ -186,7 +186,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { max = Date(), title = "Date title", confirmButtonText = "Date confirm", - confirmButtonListener = {} + confirmButtonListener = {}, ) val dialog = shadowOf(ShadowAlertDialog.getLatestAlertDialog()) @@ -206,7 +206,7 @@ class AlertDialogueTest : ActivityRobolectricTest() { dialog: ShadowAlertDialog, message: String, title: String, - confirmButtonTitle: String + confirmButtonTitle: String, ) { val alertDialog = ReflectionHelpers.getField(dialog, "realAlertDialog") diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/ErrorMessageKtTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/ErrorMessageKtTest.kt index 233a0b09e8..6a8780afbb 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/ErrorMessageKtTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/ErrorMessageKtTest.kt @@ -40,7 +40,7 @@ class ErrorMessageKtTest : RobolectricTest() { fun onRetry() { // Imitate any retry functionality by doing nothing } - } + }, ) @Before diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoaderViewKtTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoaderViewKtTest.kt index 4010256ed6..d8598ec5d9 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoaderViewKtTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoaderViewKtTest.kt @@ -38,7 +38,6 @@ class LoaderViewKtTest : RobolectricTest() { @Test fun testLoaderDialogView() { - composeRule.setContent { LoaderDialog() } composeRule.onNodeWithTag(LOADER_DIALOG_PROGRESS_BAR_TAG).assertExists() composeRule.onNodeWithTag(LOADER_DIALOG_PROGRESS_BAR_TAG).assertIsDisplayed() @@ -48,7 +47,7 @@ class LoaderViewKtTest : RobolectricTest() { composeRule .onNodeWithTag(LOADER_DIALOG_PROGRESS_MSG_TAG) .assertTextEquals( - ApplicationProvider.getApplicationContext().getString(R.string.syncing) + ApplicationProvider.getApplicationContext().getString(R.string.syncing), ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoginScreenTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoginScreenTest.kt index e2ec73fca9..9d3c24b404 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoginScreenTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoginScreenTest.kt @@ -60,28 +60,26 @@ class LoginScreenTest : RobolectricTest() { @Before fun setUp() { - loginViewModel = - mockk { - every { loginViewConfiguration } returns MutableLiveData(loginConfig) - every { username } returns this@LoginScreenTest.username - every { password } returns this@LoginScreenTest.password - every { loadingConfig } returns this@LoginScreenTest.loadingConfig - every { loginErrorState } returns this@LoginScreenTest.loginError - every { showProgressBar } returns this@LoginScreenTest.showProgressBar - every { onUsernameUpdated(any()) } answers - { - this@LoginScreenTest.username.value = firstArg() - } - every { onPasswordUpdated(any()) } answers - { - this@LoginScreenTest.password.value = firstArg() - } - } + loginViewModel = mockk { + every { loginViewConfiguration } returns MutableLiveData(loginConfig) + every { username } returns this@LoginScreenTest.username + every { password } returns this@LoginScreenTest.password + every { loadingConfig } returns this@LoginScreenTest.loadingConfig + every { loginErrorState } returns this@LoginScreenTest.loginError + every { showProgressBar } returns this@LoginScreenTest.showProgressBar + every { onUsernameUpdated(any()) } answers + { + this@LoginScreenTest.username.value = firstArg() + } + every { onPasswordUpdated(any()) } answers + { + this@LoginScreenTest.password.value = firstArg() + } + } } @Test fun testLoginScreenComponents() { - composeRule.setContent { LoginScreen(loginViewModel) } // verifying app name heading properties diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoginScreenWithLogoTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoginScreenWithLogoTest.kt index d4cabeae15..b14af2e277 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoginScreenWithLogoTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/LoginScreenWithLogoTest.kt @@ -47,28 +47,26 @@ class LoginScreenWithLogoTest : RobolectricTest() { @Before fun setUp() { - loginViewModelWithLogo = - mockk { - every { loginViewConfiguration } returns MutableLiveData(loginConfig) - every { username } returns this@LoginScreenWithLogoTest.username - every { password } returns this@LoginScreenWithLogoTest.password - every { loginErrorState } returns this@LoginScreenWithLogoTest.loginErrorState - every { showProgressBar } returns this@LoginScreenWithLogoTest.showProgressBar - every { loadingConfig } returns this@LoginScreenWithLogoTest.loadingConfig - every { onUsernameUpdated(any()) } answers - { - this@LoginScreenWithLogoTest.username.value = firstArg() - } - every { onPasswordUpdated(any()) } answers - { - this@LoginScreenWithLogoTest.password.value = firstArg() - } - } + loginViewModelWithLogo = mockk { + every { loginViewConfiguration } returns MutableLiveData(loginConfig) + every { username } returns this@LoginScreenWithLogoTest.username + every { password } returns this@LoginScreenWithLogoTest.password + every { loginErrorState } returns this@LoginScreenWithLogoTest.loginErrorState + every { showProgressBar } returns this@LoginScreenWithLogoTest.showProgressBar + every { loadingConfig } returns this@LoginScreenWithLogoTest.loadingConfig + every { onUsernameUpdated(any()) } answers + { + this@LoginScreenWithLogoTest.username.value = firstArg() + } + every { onPasswordUpdated(any()) } answers + { + this@LoginScreenWithLogoTest.password.value = firstArg() + } + } } @Test fun testLoginScreenComponentsWithLogo() { - composeRule.setContent { LoginScreen(loginViewModelWithLogo) } // verifying app logo properties diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/PaginatedRegisterViewsKtTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/PaginatedRegisterViewsKtTest.kt index 1a6a4ca0d0..8b2d06c436 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/PaginatedRegisterViewsKtTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/PaginatedRegisterViewsKtTest.kt @@ -53,10 +53,11 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { fun onPreviousButtonClick() { // Imitate previous button click action by doing nothing } + fun onNextButtonClick() { // Imitate next button click action by doing nothing } - } + }, ) @Test @@ -76,7 +77,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { currentPage = 1, pagesCount = 1, previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, - nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() } + nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, ) } composeRule.onNodeWithTag(SEARCH_FOOTER_TAG).assertDoesNotExist() @@ -91,7 +92,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { currentPage = 1, pagesCount = 3, previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, - nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() } + nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, ) } composeRule.onNodeWithTag(SEARCH_FOOTER_TAG).assertExists() @@ -122,7 +123,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { currentPage = 3, pagesCount = 3, previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, - nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() } + nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, ) } composeRule.onNodeWithTag(SEARCH_FOOTER_TAG).assertExists() @@ -153,7 +154,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { currentPage = 1, pagesCount = 1, previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, - nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() } + nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, ) } composeRule.onNodeWithTag(SEARCH_FOOTER_TAG).assertExists() @@ -193,7 +194,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, showHeader = true, - showFooter = true + showFooter = true, ) } @@ -223,7 +224,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, showHeader = true, - showFooter = true + showFooter = true, ) } @@ -257,7 +258,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, showHeader = true, - showFooter = true + showFooter = true, ) } @@ -294,7 +295,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, showHeader = true, - showFooter = false + showFooter = false, ) } @@ -328,7 +329,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, showHeader = true, - showFooter = true + showFooter = true, ) } @@ -362,7 +363,7 @@ class PaginatedRegisterViewsKtTest : RobolectricTest() { previousButtonClickListener = { listenerObjectSpy.onPreviousButtonClick() }, nextButtonClickListener = { listenerObjectSpy.onNextButtonClick() }, showHeader = true, - showFooter = false + showFooter = false, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/PinViewTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/PinViewTest.kt index c77f050c16..8ccaa7567f 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/PinViewTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/components/PinViewTest.kt @@ -48,7 +48,7 @@ class PinViewTest : RobolectricTest() { fullEditValue = "123", isCursorVisible = false, isDotted = false, - showError = true + showError = true, ) } composeRule.onNodeWithTag(PIN_VIEW_CELL).assertExists() diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginActivityTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginActivityTest.kt index 2b4a847c70..b77e0d43e1 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginActivityTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginActivityTest.kt @@ -74,9 +74,11 @@ class LoginActivityTest : ActivityRobolectricTest() { private lateinit var loginActivity: LoginActivity @get:Rule var hiltRule = HiltAndroidRule(this) + @OptIn(ExperimentalCoroutinesApi::class) @get:Rule(order = 2) val coroutineTestRule: CoroutineTestRule = CoroutineTestRule() + @Inject lateinit var sharedPreferencesHelper: SharedPreferencesHelper @BindValue val repository: DefaultRepository = mockk() @@ -94,7 +96,9 @@ class LoginActivityTest : ActivityRobolectricTest() { private lateinit var loginService: LoginService private lateinit var fhirResourceDataSource: FhirResourceDataSource + @Inject lateinit var secureSharedPreference: SecureSharedPreference + @BindValue @JvmField val performanceReporter: PerformanceReporter = FakePerformanceReporter() private val fhirResourceService = mockk() private val keycloakService = mockk() @@ -123,8 +127,8 @@ class LoginActivityTest : ActivityRobolectricTest() { tokenAuthenticator = tokenAuthenticator, secureSharedPreference = secureSharedPreference, dispatcherProvider = coroutineTestRule.testDispatcherProvider, - fhirResourceDataSource = fhirResourceDataSource - ) + fhirResourceDataSource = fhirResourceDataSource, + ), ) loginActivity = @@ -159,7 +163,7 @@ class LoginActivityTest : ActivityRobolectricTest() { putExtra(AccountManager.KEY_ACCOUNT_NAME, accountName) putExtra( AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, - mockk() + mockk(), ) putExtra(AccountManager.KEY_ACCOUNT_TYPE, AccountManager.KEY_ACCOUNT_TYPE) } @@ -176,7 +180,7 @@ class LoginActivityTest : ActivityRobolectricTest() { putExtra(AccountManager.KEY_ACCOUNT_NAME, accountName) putExtra( AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, - mockk() + mockk(), ) putExtra(AccountManager.KEY_ACCOUNT_TYPE, AccountManager.KEY_ACCOUNT_TYPE) } @@ -185,7 +189,7 @@ class LoginActivityTest : ActivityRobolectricTest() { Robolectric.buildActivity(LoginActivity::class.java, updateAuthIntent) .create() .resume() - .get() + .get(), ) loginActivity.configurationRegistry = configurationRegistry loginActivity.configurationRegistry.appId = "default" @@ -210,7 +214,7 @@ class LoginActivityTest : ActivityRobolectricTest() { putExtra(AccountManager.KEY_ACCOUNT_NAME, accountName) putExtra( AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, - mockk() + mockk(), ) putExtra(AccountManager.KEY_ACCOUNT_TYPE, AccountManager.KEY_ACCOUNT_TYPE) } @@ -219,7 +223,7 @@ class LoginActivityTest : ActivityRobolectricTest() { Robolectric.buildActivity(LoginActivity::class.java, updateAuthIntent) .create() .resume() - .get() + .get(), ) loginActivity.configurationRegistry = configurationRegistry loginActivity.configurationRegistry.appId = "default" diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginScreenTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginScreenTest.kt index 885fb621ee..0d87819a36 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginScreenTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginScreenTest.kt @@ -40,10 +40,13 @@ class LoginScreenTest : RobolectricTest() { object { // Imitate click action by doing nothing fun onUsernameUpdated(userName: String) {} + fun onPasswordUpdated() {} + fun forgotPassword() {} + fun attemptRemoteLogin() {} - } + }, ) private lateinit var loginViewModel: LoginViewModel @@ -52,15 +55,14 @@ class LoginScreenTest : RobolectricTest() { @Before fun setUp() { - loginViewModel = - mockk { - every { username } returns MutableLiveData("demo") - every { password } returns MutableLiveData("1234") - every { loginErrorState } returns MutableLiveData(null) - every { loadingConfig } returns MutableLiveData(false) - every { showProgressBar } returns MutableLiveData(false) - every { loginViewConfiguration } returns MutableLiveData(loginConfig) - } + loginViewModel = mockk { + every { username } returns MutableLiveData("demo") + every { password } returns MutableLiveData("1234") + every { loginErrorState } returns MutableLiveData(null) + every { loadingConfig } returns MutableLiveData(false) + every { showProgressBar } returns MutableLiveData(false) + every { loginViewConfiguration } returns MutableLiveData(loginConfig) + } } @Test @@ -85,7 +87,7 @@ class LoginScreenTest : RobolectricTest() { password = "password", onPasswordChanged = { listenerObjectSpy.onPasswordUpdated() }, forgotPassword = { listenerObjectSpy.forgotPassword() }, - onLoginButtonClicked = { listenerObjectSpy.attemptRemoteLogin() } + onLoginButtonClicked = { listenerObjectSpy.attemptRemoteLogin() }, ) } if (loginConfig.showLogo) { diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginViewModelTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginViewModelTest.kt index ce6f49ce34..ded7c0eda9 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginViewModelTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/login/LoginViewModelTest.kt @@ -109,8 +109,8 @@ internal class LoginViewModelTest : RobolectricTest() { tokenAuthenticator = tokenAuthenticator, secureSharedPreference = secureSharedPreference, dispatcherProvider = coroutineTestRule.testDispatcherProvider, - fhirResourceDataSource = fhirResourceDataSource - ) + fhirResourceDataSource = fhirResourceDataSource, + ), ) } @@ -140,6 +140,7 @@ internal class LoginViewModelTest : RobolectricTest() { Assert.assertFalse(loginViewModel.showProgressBar.value!!) Assert.assertTrue(loginViewModel.navigateToHome.value!!) } + @Test fun testUnSuccessfulOfflineLogin() = runTest { val activity = mockedActivity() @@ -167,7 +168,7 @@ internal class LoginViewModelTest : RobolectricTest() { updateCredentials() sharedPreferencesHelper.write( SharedPreferenceKey.PRACTITIONER_ID.name, - value = "9807A290-0572-40E7-9EE0-C60F729E9F09" + value = "9807A290-0572-40E7-9EE0-C60F729E9F09", ) every { tokenAuthenticator.sessionActive() } returns true every { @@ -198,8 +199,8 @@ internal class LoginViewModelTest : RobolectricTest() { tokenType = "you_guess_it", refreshToken = "another_very_refreshing_token", refreshExpiresIn = 540000, - scope = "open_my_guy" - ) + scope = "open_my_guy", + ), ) coEvery { keycloakService.fetchUserInfo() } returns Response.success(UserInfo(keycloakUuid = "awesome_uuid")) @@ -225,7 +226,7 @@ internal class LoginViewModelTest : RobolectricTest() { Assert.assertFalse(loginViewModel.showProgressBar.value!!) Assert.assertEquals( LoginErrorState.MULTI_USER_LOGIN_ATTEMPT, - loginViewModel.loginErrorState.value!! + loginViewModel.loginErrorState.value!!, ) } @@ -235,7 +236,7 @@ internal class LoginViewModelTest : RobolectricTest() { secureSharedPreference.saveCredentials("nativeUser", "n4t1veP5wd".toCharArray()) sharedPreferencesHelper.write( SharedPreferenceKey.PRACTITIONER_ID.name, - value = "9807A290-0572-40E7-9EE0-C60F729E9F09" + value = "9807A290-0572-40E7-9EE0-C60F729E9F09", ) every { tokenAuthenticator.sessionActive() } returns true loginViewModel.login(mockedActivity(isDeviceOnline = true), scope = this) @@ -244,7 +245,7 @@ internal class LoginViewModelTest : RobolectricTest() { Assert.assertFalse(loginViewModel.showProgressBar.value!!) Assert.assertEquals( LoginErrorState.MULTI_USER_LOGIN_ATTEMPT, - loginViewModel.loginErrorState.value!! + loginViewModel.loginErrorState.value!!, ) } @@ -262,8 +263,8 @@ internal class LoginViewModelTest : RobolectricTest() { tokenType = "you_guess_it", refreshToken = "another_very_refreshing_token", refreshExpiresIn = 540000, - scope = "open_my_guy" - ) + scope = "open_my_guy", + ), ) // Mock result for fetch user info via keycloak endpoint @@ -322,8 +323,8 @@ internal class LoginViewModelTest : RobolectricTest() { tokenType = "you_guess_it", refreshToken = "another_very_refreshing_token", refreshExpiresIn = 540000, - scope = "open_my_guy" - ) + scope = "open_my_guy", + ), ) // Mock result for fetch user info via keycloak endpoint @@ -354,8 +355,8 @@ internal class LoginViewModelTest : RobolectricTest() { tokenType = "you_guess_it", refreshToken = "another_very_refreshing_token", refreshExpiresIn = 540000, - scope = "open_my_guy" - ) + scope = "open_my_guy", + ), ) // Mock result for fetch user info via keycloak endpoint @@ -404,7 +405,7 @@ internal class LoginViewModelTest : RobolectricTest() { Organization().apply { name = "the.org" id = "the.org.id" - } + }, ) } } @@ -414,10 +415,10 @@ internal class LoginViewModelTest : RobolectricTest() { fun testSavePractitionerDetails() = runTest { coEvery { defaultRepository.create(true, any()) } returns listOf() loginViewModel.savePractitionerDetails( - Bundle().addEntry(Bundle.BundleEntryComponent().apply { resource = practitionerDetails() }) + Bundle().addEntry(Bundle.BundleEntryComponent().apply { resource = practitionerDetails() }), ) Assert.assertNotNull( - sharedPreferencesHelper.read(SharedPreferenceKey.PRACTITIONER_DETAILS.name) + sharedPreferencesHelper.read(SharedPreferenceKey.PRACTITIONER_DETAILS.name), ) } @@ -440,6 +441,7 @@ internal class LoginViewModelTest : RobolectricTest() { onPasswordUpdated(thisPassword) } } + private fun mockedActivity(isDeviceOnline: Boolean = false): HiltActivityForTest { val activity = mockk(relaxed = true) every { activity.isDeviceOnline() } returns isDeviceOnline diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinLoginActivityTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinLoginActivityTest.kt index 419fdc1dba..2883cbc6eb 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinLoginActivityTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinLoginActivityTest.kt @@ -116,7 +116,7 @@ class PinLoginActivityTest : ActivityRobolectricTest() { pinLoginActivity.pinViewModel.onPinChanged("1234") Assert.assertEquals( pinLoginActivity.pinViewModel.secureSharedPreference.retrieveSessionPin()!!, - testPin.value.toString() + testPin.value.toString(), ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinLoginScreenTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinLoginScreenTest.kt index a4daf38642..c4c670f27d 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinLoginScreenTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinLoginScreenTest.kt @@ -41,7 +41,7 @@ import org.smartregister.fhircore.engine.ui.components.PIN_VIEW import org.smartregister.fhircore.engine.util.FORCE_LOGIN_VIA_USERNAME @ExperimentalCoroutinesApi -class PinLoginScreensTest : RobolectricTest() { +class PinLoginScreenTest : RobolectricTest() { @get:Rule val composeRule = createComposeRule() @@ -50,10 +50,13 @@ class PinLoginScreensTest : RobolectricTest() { object { // Imitate click action by doing nothing fun onPinChanged() {} + fun onMenuLoginClicked(value: String) {} + fun forgotPin() {} + fun onDismissForgotDialog() {} - } + }, ) private val application = ApplicationProvider.getApplicationContext() @@ -62,12 +65,11 @@ class PinLoginScreensTest : RobolectricTest() { @Before fun setUp() { - pinViewModel = - mockk { - every { appName } returns "TestApp" - every { showError } returns MutableLiveData(true) - every { enterUserLoginMessage } returns "Enter PIN for DemoUser" - } + pinViewModel = mockk { + every { appName } returns "TestApp" + every { showError } returns MutableLiveData(true) + every { enterUserLoginMessage } returns "Enter PIN for DemoUser" + } } @Test @@ -87,7 +89,7 @@ class PinLoginScreensTest : RobolectricTest() { onMenuLoginClicked = { listenerObjectSpy.onMenuLoginClicked(FORCE_LOGIN_VIA_USERNAME) }, enterUserPinMessage = "Enter PIN for DemoUser", forgotPin = { listenerObjectSpy.forgotPin() }, - appName = "anc" + appName = "anc", ) } composeRule.onNodeWithTag(PIN_VIEW).assertExists() @@ -117,7 +119,7 @@ class PinLoginScreensTest : RobolectricTest() { onMenuLoginClicked = { listenerObjectSpy.onMenuLoginClicked(FORCE_LOGIN_VIA_USERNAME) }, enterUserPinMessage = "Enter PIN for DemoUser", forgotPin = { listenerObjectSpy.forgotPin() }, - appName = "g6pd" + appName = "g6pd", ) } composeRule.onNodeWithTag(PIN_VIEW).assertExists() @@ -128,7 +130,7 @@ class PinLoginScreensTest : RobolectricTest() { composeRule.setContent { ForgotPinDialog( forgotPin = { listenerObjectSpy.forgotPin() }, - onDismissDialog = { listenerObjectSpy.onDismissForgotDialog() } + onDismissDialog = { listenerObjectSpy.onDismissForgotDialog() }, ) } composeRule.onNodeWithTag(PIN_FORGOT_DIALOG).assertExists() diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinSetupScreenTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinSetupScreenTest.kt index 369266da1f..a8bce24aed 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinSetupScreenTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinSetupScreenTest.kt @@ -50,10 +50,13 @@ class PinSetupScreenTest : RobolectricTest() { object { // Imitate click action by doing nothing fun onPinChanged() {} + fun onPinConfirmed() {} + fun onMenuSettingsClicked() {} + fun onMenuLoginClicked(value: String) {} - } + }, ) private val application = ApplicationProvider.getApplicationContext() @@ -62,12 +65,11 @@ class PinSetupScreenTest : RobolectricTest() { @Before fun setUp() { - pinViewModel = - mockk { - every { appName } returns "anc" - every { pin } returns MutableLiveData("1234") - every { enableSetPin } returns MutableLiveData(false) - } + pinViewModel = mockk { + every { appName } returns "anc" + every { pin } returns MutableLiveData("1234") + every { enableSetPin } returns MutableLiveData(false) + } } @Test @@ -89,7 +91,7 @@ class PinSetupScreenTest : RobolectricTest() { listenerObjectSpy.onMenuLoginClicked(FORCE_LOGIN_VIA_USERNAME_FROM_PIN_SETUP) }, setPinEnabled = false, - inputPin = "" + inputPin = "", ) } @@ -123,7 +125,7 @@ class PinSetupScreenTest : RobolectricTest() { listenerObjectSpy.onMenuLoginClicked(FORCE_LOGIN_VIA_USERNAME_FROM_PIN_SETUP) }, setPinEnabled = false, - inputPin = "" + inputPin = "", ) } @@ -157,7 +159,7 @@ class PinSetupScreenTest : RobolectricTest() { listenerObjectSpy.onMenuLoginClicked(FORCE_LOGIN_VIA_USERNAME_FROM_PIN_SETUP) }, setPinEnabled = true, - inputPin = "0000" + inputPin = "0000", ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinViewModelTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinViewModelTest.kt index 3aaa653a4d..b24981d175 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinViewModelTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/pin/PinViewModelTest.kt @@ -57,6 +57,7 @@ internal class PinViewModelTest : RobolectricTest() { @Inject lateinit var dispatcherProvider: DispatcherProvider @BindValue val sharedPreferencesHelper: SharedPreferencesHelper = mockk() + @BindValue val secureSharedPreference: SecureSharedPreference = mockk() @BindValue var configurationRegistry = Faker.buildTestConfigurationRegistry() @@ -72,7 +73,7 @@ internal class PinViewModelTest : RobolectricTest() { applicationName = "Test App", appLogoIconResourceFile = "ic_launcher", enablePin = true, - showLogo = true + showLogo = true, ) @Before @@ -94,7 +95,7 @@ internal class PinViewModelTest : RobolectricTest() { sharedPreferences = sharedPreferencesHelper, secureSharedPreference = secureSharedPreference, configurationRegistry = configurationRegistry, - app = application + app = application, ) pinViewModel.apply { savedPin = "1234" @@ -114,14 +115,14 @@ internal class PinViewModelTest : RobolectricTest() { applicationName = "Test App", appLogoIconResourceFile = "ic_launcher", enablePin = true, - showLogo = true + showLogo = true, ) Assert.assertEquals(expectedPinConfig.appId, testPinViewConfiguration.appId) Assert.assertEquals(expectedPinConfig.classification, testPinViewConfiguration.classification) Assert.assertEquals(expectedPinConfig.applicationName, testPinViewConfiguration.applicationName) Assert.assertEquals( expectedPinConfig.appLogoIconResourceFile, - testPinViewConfiguration.appLogoIconResourceFile + testPinViewConfiguration.appLogoIconResourceFile, ) Assert.assertEquals(expectedPinConfig.enablePin, testPinViewConfiguration.enablePin) Assert.assertEquals(expectedPinConfig.showLogo, testPinViewConfiguration.showLogo) @@ -144,7 +145,7 @@ internal class PinViewModelTest : RobolectricTest() { pinViewModel.onPinConfirmed() Assert.assertEquals( pinViewModel.secureSharedPreference.retrieveSessionPin()!!, - testPin.value.toString() + testPin.value.toString(), ) Assert.assertEquals(pinViewModel.showError.value, false) } @@ -154,7 +155,7 @@ internal class PinViewModelTest : RobolectricTest() { pinViewModel.onPinConfirmed() Assert.assertEquals( pinViewModel.secureSharedPreference.retrieveSessionPin()!!, - testPin.value.toString() + testPin.value.toString(), ) Assert.assertEquals(pinViewModel.showError.value, false) Assert.assertEquals(pinViewModel.navigateToHome.value, true) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivityTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivityTest.kt index c0594034af..0da7f5e41f 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivityTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireActivityTest.kt @@ -122,8 +122,8 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { dispatcherProvider = dispatcherProvider, sharedPreferencesHelper = mockk(), libraryEvaluatorProvider = { mockk() }, - tracer = FakePerformanceReporter() - ) + tracer = FakePerformanceReporter(), + ), ) @Before @@ -174,7 +174,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { @Test fun testActivityShouldNotNull() { Assert.assertNotNull( - questionnaireActivity.supportFragmentManager.findFragmentByTag(QUESTIONNAIRE_FRAGMENT_TAG) + questionnaireActivity.supportFragmentManager.findFragmentByTag(QUESTIONNAIRE_FRAGMENT_TAG), ) Assert.assertNotNull(questionnaireActivity) } @@ -191,26 +191,26 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { formName = "my-form", questionnaireType = QuestionnaireType.READ_ONLY, questionnaireResponse = questionnaireResponse, - populationResources = populationResources + populationResources = populationResources, ) Assert.assertEquals("my-form", result.getString(QuestionnaireActivity.QUESTIONNAIRE_ARG_FORM)) Assert.assertEquals( "1234", - result.getString(QuestionnaireActivity.QUESTIONNAIRE_ARG_PATIENT_KEY) + result.getString(QuestionnaireActivity.QUESTIONNAIRE_ARG_PATIENT_KEY), ) Assert.assertEquals( QuestionnaireType.READ_ONLY.name, - result.getString(QuestionnaireActivity.QUESTIONNAIRE_ARG_TYPE) + result.getString(QuestionnaireActivity.QUESTIONNAIRE_ARG_TYPE), ) Assert.assertEquals( FhirContext.forCached(FhirVersionEnum.R4) .newJsonParser() .encodeResourceToString(questionnaireResponse), - result.getString(QuestionnaireActivity.QUESTIONNAIRE_RESPONSE) + result.getString(QuestionnaireActivity.QUESTIONNAIRE_RESPONSE), ) Assert.assertEquals( FhirContext.forCached(FhirVersionEnum.R4).newJsonParser().encodeResourceToString(patient), - result.getStringArrayList(QuestionnaireActivity.QUESTIONNAIRE_POPULATION_RESOURCES)?.get(0) + result.getStringArrayList(QuestionnaireActivity.QUESTIONNAIRE_POPULATION_RESOURCES)?.get(0), ) } @@ -229,8 +229,8 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { url = "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl" setValue( CodeableConcept( - Coding("http://hl7.org/fhir/questionnaire-item-control", "page", "Page") - ) + Coding("http://hl7.org/fhir/questionnaire-item-control", "page", "Page"), + ), ) } addItem().apply { @@ -273,15 +273,17 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { Intent().apply { putStringArrayListExtra( QuestionnaireActivity.QUESTIONNAIRE_POPULATION_RESOURCES, - arrayListOf(Patient().encodeResourceToString()) + arrayListOf(Patient().encodeResourceToString()), ) } val questionnaireResponse = questionnaireViewModel2.generateQuestionnaireResponse(questionnaire, populationIntent) questionnaireResponse.questionnaire = "${questionnaire.resourceType}/${questionnaire.logicalId}" assertFailsWith( - message = "Multiple answers for non-repeat questionnaire item phone-value-1" - ) { checkQuestionnaireResponse(questionnaire, questionnaireResponse) } + message = "Multiple answers for non-repeat questionnaire item phone-value-1", + ) { + checkQuestionnaireResponse(questionnaire, questionnaireResponse) + } } @Test(expected = None::class) @@ -299,8 +301,8 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { url = "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl" setValue( CodeableConcept( - Coding("http://hl7.org/fhir/questionnaire-item-control", "page", "Page") - ) + Coding("http://hl7.org/fhir/questionnaire-item-control", "page", "Page"), + ), ) } addItem().apply { @@ -343,7 +345,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { Intent().apply { putStringArrayListExtra( QuestionnaireActivity.QUESTIONNAIRE_POPULATION_RESOURCES, - arrayListOf(Patient().encodeResourceToString()) + arrayListOf(Patient().encodeResourceToString()), ) } val questionnaireResponse = @@ -382,7 +384,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { putExtra(QuestionnaireActivity.QUESTIONNAIRE_ARG_TYPE, QuestionnaireType.READ_ONLY.name) putExtra( QuestionnaireActivity.QUESTIONNAIRE_RESPONSE, - QuestionnaireResponse().encodeResourceToString() + QuestionnaireResponse().encodeResourceToString(), ) } @@ -405,13 +407,13 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { @Test fun `activity finishes when loadQuestionnaireAndConfig fails with loadQuestionnaireAndConfig from viewmodel`() = - runTest { - coEvery { - questionnaireViewModel.getQuestionnaireConfigPair(questionnaireActivity, any(), any()) - } throws QuestionnaireNotFoundException("unknown_form") - questionnaireActivity.loadQuestionnaireAndConfig("unknown_form") - Assert.assertTrue(questionnaireActivity.isFinishing.or(questionnaireActivity.isDestroyed)) - } + runTest { + coEvery { + questionnaireViewModel.getQuestionnaireConfigPair(questionnaireActivity, any(), any()) + } throws QuestionnaireNotFoundException("unknown_form") + questionnaireActivity.loadQuestionnaireAndConfig("unknown_form") + Assert.assertTrue(questionnaireActivity.isFinishing.or(questionnaireActivity.isDestroyed)) + } @Test fun testOnBackPressedShouldShowAlert() { @@ -422,13 +424,14 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { Assert.assertEquals( getString(R.string.questionnaire_alert_back_pressed_message), - alertDialog.findViewById(R.id.tv_alert_message)!!.text + alertDialog.findViewById(R.id.tv_alert_message)!!.text, ) Assert.assertEquals( getString(R.string.questionnaire_alert_back_pressed_button_title), - alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).text + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).text, ) } + @Test fun testOnBackPressedShouldCallFinishWhenInReadOnlyMode() { val qActivity = spyk(questionnaireActivity) @@ -451,7 +454,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { intent.getStringExtra(QuestionnaireActivity.QUESTIONNAIRE_ARG_GROUP_KEY), any(), any(), - any() + any(), ) } } @@ -466,7 +469,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { Assert.assertEquals( getString(R.string.form_progress_message), - alertDialog.findViewById(R.id.tv_alert_message)!!.text + alertDialog.findViewById(R.id.tv_alert_message)!!.text, ) verify(timeout = 2000) { @@ -476,7 +479,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { intent.getStringExtra(QuestionnaireActivity.QUESTIONNAIRE_ARG_GROUP_KEY), any(), any(), - any() + any(), ) } } @@ -500,7 +503,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { Assert.assertEquals( getString(R.string.questionnaire_alert_invalid_message), - alertDialog.findViewById(R.id.tv_alert_message)!!.text + alertDialog.findViewById(R.id.tv_alert_message)!!.text, ) verify(inverse = true) { @@ -510,7 +513,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { intent.getStringExtra(QuestionnaireActivity.QUESTIONNAIRE_ARG_GROUP_KEY), any(), any(), - any() + any(), ) } } @@ -520,7 +523,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { ReflectionHelpers.setField( questionnaireActivity, "questionnaire", - Questionnaire().apply { experimental = false } + Questionnaire().apply { experimental = false }, ) questionnaireActivity.onSubmitRequestResult() @@ -530,7 +533,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { Assert.assertEquals( getString(R.string.questionnaire_alert_submit_message), - alertDialog.findViewById(R.id.tv_alert_message)!!.text + alertDialog.findViewById(R.id.tv_alert_message)!!.text, ) } @@ -539,7 +542,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { ReflectionHelpers.setField( questionnaireActivity, "questionnaire", - Questionnaire().apply { experimental = true } + Questionnaire().apply { experimental = true }, ) questionnaireActivity.onSubmitRequestResult() @@ -549,7 +552,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { Assert.assertEquals( getString(R.string.questionnaire_alert_test_only_message), - alertDialog.findViewById(R.id.tv_alert_message)!!.text + alertDialog.findViewById(R.id.tv_alert_message)!!.text, ) } @@ -652,7 +655,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { val spiedActivity = spyk(questionnaireActivity) spiedActivity.finishActivity( QuestionnaireResponse(), - listOf(Encounter().apply { status = Encounter.EncounterStatus.FINISHED }) + listOf(Encounter().apply { status = Encounter.EncounterStatus.FINISHED }), ) verify { @@ -661,9 +664,9 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { withArg { Assert.assertEquals( Encounter.EncounterStatus.FINISHED.toCode(), - it.extras?.getString(QuestionnaireActivity.QUESTIONNAIRE_RES_ENCOUNTER) + it.extras?.getString(QuestionnaireActivity.QUESTIONNAIRE_RES_ENCOUNTER), ) - } + }, ) } Assert.assertTrue(spiedActivity.isFinishing) @@ -680,7 +683,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { ctx, questionnaireId = "testQuestionnaire", clientIdentifier = null, - populationResources = arrayListOf() + populationResources = arrayListOf(), ) verify { ctx.startActivity(any()) } @@ -696,7 +699,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { ctx, questionnaireId = "testQuestionnaire", clientIdentifier = null, - populationResources = arrayListOf() + populationResources = arrayListOf(), ) verify { ctx.startActivityForResult(any(), withArg { Assert.assertEquals(0, it) }) } } @@ -711,7 +714,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { ctx, questionnaireId = "testQuestionnaire", launchContexts = null, - populationResources = arrayListOf() + populationResources = arrayListOf(), ) verify { ctx.startActivityForResult(any(), withArg { Assert.assertEquals(0, it) }) } } @@ -726,7 +729,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { ctx, questionnaireId = "testQuestionnaire", launchContexts = null, - populationResources = arrayListOf() + populationResources = arrayListOf(), ) verify { ctx.startActivity(any()) } } @@ -754,7 +757,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { intentBundle = intentBundle, questionnaireType = questionnaireType, launchContexts = launchContexts, - populationResources = populationResources + populationResources = populationResources, ) val expectedIntent = @@ -767,8 +770,8 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { formName = questionnaireId, questionnaireType = questionnaireType, launchContexts = launchContexts, - populationResources = populationResources - ) + populationResources = populationResources, + ), ) verify { @@ -776,29 +779,29 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { withArg { Assert.assertEquals( expectedIntent.getStringExtra("clientIdentifier"), - it.getStringExtra("clientIdentifier") + it.getStringExtra("clientIdentifier"), ) Assert.assertEquals( expectedIntent.getStringExtra("groupIdentifier"), - it.getStringExtra("groupIdentifier") + it.getStringExtra("groupIdentifier"), ) Assert.assertEquals( expectedIntent.getStringExtra("formName"), - it.getStringExtra("formName") + it.getStringExtra("formName"), ) Assert.assertEquals( expectedIntent.getStringExtra("questionnaireType"), - it.getStringExtra("questionnaireType") + it.getStringExtra("questionnaireType"), ) Assert.assertEquals( expectedIntent.getStringArrayListExtra("launchContexts"), - it.getStringArrayListExtra("launchContexts") + it.getStringArrayListExtra("launchContexts"), ) Assert.assertEquals( expectedIntent.getStringArrayListExtra("populationResources"), - it.getStringArrayListExtra("populationResources") + it.getStringArrayListExtra("populationResources"), ) - } + }, ) } } @@ -826,7 +829,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { backReference = backReference, intentBundle = intentBundle, launchContexts = launchContexts, - populationResources = populationResources + populationResources = populationResources, ) val expectedIntent = @@ -839,7 +842,7 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { formName = questionnaireId, questionnaireType = questionnaireType, launchContexts = launchContexts, - populationResources = populationResources + populationResources = populationResources, ), ) @@ -848,30 +851,30 @@ class QuestionnaireActivityTest : ActivityRobolectricTest() { withArg { Assert.assertEquals( expectedIntent.getStringExtra("clientIdentifier"), - it.getStringExtra("clientIdentifier") + it.getStringExtra("clientIdentifier"), ) Assert.assertEquals( expectedIntent.getStringExtra("backReference"), - it.getStringExtra("backReference") + it.getStringExtra("backReference"), ) Assert.assertEquals( expectedIntent.getStringExtra("formName"), - it.getStringExtra("formName") + it.getStringExtra("formName"), ) Assert.assertEquals( expectedIntent.getStringExtra("questionnaireType"), - it.getStringExtra("questionnaireType") + it.getStringExtra("questionnaireType"), ) Assert.assertEquals( expectedIntent.getStringArrayListExtra("launchContexts"), - it.getStringArrayListExtra("launchContexts") + it.getStringArrayListExtra("launchContexts"), ) Assert.assertEquals( expectedIntent.getStringArrayListExtra("populationResources"), - it.getStringArrayListExtra("populationResources") + it.getStringArrayListExtra("populationResources"), ) }, - 0 + 0, ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireNotFoundExceptionTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireNotFoundExceptionTest.kt index cf10a517dd..f03a805d74 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireNotFoundExceptionTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireNotFoundExceptionTest.kt @@ -29,7 +29,7 @@ class QuestionnaireNotFoundExceptionTest { QuestionnaireNotFoundException(formName = testFormName, cause = testCause) Assert.assertEquals( "Questionnaire '$testFormName' not found", - questionnaireNotFoundException.message + questionnaireNotFoundException.message, ) Assert.assertEquals(testCause, questionnaireNotFoundException.cause) } @@ -40,7 +40,7 @@ class QuestionnaireNotFoundExceptionTest { val questionnaireNotFoundException = QuestionnaireNotFoundException(formName = testFormName) Assert.assertEquals( "Questionnaire '$testFormName' not found", - questionnaireNotFoundException.message + questionnaireNotFoundException.message, ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireViewModelTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireViewModelTest.kt index 38378aac56..a1656cd1bf 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireViewModelTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/questionnaire/QuestionnaireViewModelTest.kt @@ -138,17 +138,17 @@ class QuestionnaireViewModelTest : RobolectricTest() { sharedPreferencesHelper.write( USER_INFO_SHARED_PREFERENCE_KEY, getUserInfo(), - encodeWithGson = true + encodeWithGson = true, ) sharedPreferencesHelper.write( LOGGED_IN_PRACTITIONER, Practitioner().apply { id = "123" }, - encodeWithGson = true + encodeWithGson = true, ) sharedPreferencesHelper.write( SharedPreferenceKey.PRACTITIONER_ID.name, - practitionerDetails().fhirPractitionerDetails.practitionerId.valueToString() + practitionerDetails().fhirPractitionerDetails.practitionerId.valueToString(), ) defaultRepo = @@ -158,8 +158,8 @@ class QuestionnaireViewModelTest : RobolectricTest() { dispatcherProvider = coroutineRule.testDispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, configurationRegistry = configurationRegistry, - configService = configService - ) + configService = configService, + ), ) val configurationRegistry = mockk() @@ -175,17 +175,16 @@ class QuestionnaireViewModelTest : RobolectricTest() { dispatcherProvider = defaultRepo.dispatcherProvider, sharedPreferencesHelper = sharedPreferencesHelper, libraryEvaluatorProvider = { libraryEvaluator }, - tracer = FakePerformanceReporter() - ) + tracer = FakePerformanceReporter(), + ), ) coEvery { fhirEngine.get(ResourceType.Patient, any()) } returns samplePatient() - questionnaireConfig = - runBlocking { - questionnaireViewModel.getQuestionnaireConfig( - "patient-registration", - ApplicationProvider.getApplicationContext() - ) - } + questionnaireConfig = runBlocking { + questionnaireViewModel.getQuestionnaireConfig( + "patient-registration", + ApplicationProvider.getApplicationContext(), + ) + } coEvery { fhirEngine.create(any()) } answers { listOf() } coEvery { fhirEngine.update(any()) } answers {} @@ -229,7 +228,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Questionnaire.QuestionnaireItemComponent().apply { type = Questionnaire.QuestionnaireItemType.TEXT linkId = "q1-name" - } + }, ) }, Questionnaire.QuestionnaireItemComponent().apply { @@ -239,7 +238,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Questionnaire.QuestionnaireItemComponent().apply { type = Questionnaire.QuestionnaireItemType.DATE linkId = "q3-date" - } + }, ) } coEvery { fhirEngine.get(ResourceType.Questionnaire, "12345") } returns questionnaire @@ -273,7 +272,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Questionnaire.QuestionnaireItemComponent().apply { linkId = "patient-last-name" type = Questionnaire.QuestionnaireItemType.TEXT - } + }, ) }, Questionnaire.QuestionnaireItemComponent().apply { @@ -297,11 +296,11 @@ class QuestionnaireViewModelTest : RobolectricTest() { Questionnaire.QuestionnaireItemComponent().apply { linkId = "rp-name" type = Questionnaire.QuestionnaireItemType.TEXT - } + }, ) - } + }, ) - } + }, ) } @@ -338,7 +337,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Questionnaire.QuestionnaireItemComponent().apply { linkId = "patient-last-name" type = Questionnaire.QuestionnaireItemType.TEXT - } + }, ) }, Questionnaire.QuestionnaireItemComponent().apply { @@ -362,11 +361,11 @@ class QuestionnaireViewModelTest : RobolectricTest() { Questionnaire.QuestionnaireItemComponent().apply { linkId = "rp-name" type = Questionnaire.QuestionnaireItemType.TEXT - } + }, ) - } + }, ) - } + }, ) } @@ -400,16 +399,16 @@ class QuestionnaireViewModelTest : RobolectricTest() { @Test(expected = QuestionnaireNotFoundException::class) fun `getQuestionnaireConfigPair throws 'QuestionnaireNotFoundException' when questionnaire not found`() = - runTest { - val formName = "missing_form" - coEvery { fhirEngine.get(formName) } throws - ResourceNotFoundException(ResourceType.Questionnaire.name, formName) - questionnaireViewModel.getQuestionnaireConfigPair( - context, - formName, - type = QuestionnaireType.DEFAULT - ) - } + runTest { + val formName = "missing_form" + coEvery { fhirEngine.get(formName) } throws + ResourceNotFoundException(ResourceType.Questionnaire.name, formName) + questionnaireViewModel.getQuestionnaireConfigPair( + context, + formName, + type = QuestionnaireType.DEFAULT, + ) + } @Test fun `getQuestionnaireConfigPair returns correct config and questionnaire`() = runTest { @@ -422,7 +421,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { questionnaireViewModel.getQuestionnaireConfigPair( context, formName, - type = QuestionnaireType.DEFAULT + type = QuestionnaireType.DEFAULT, ) Assert.assertEquals(config, result.first) Assert.assertEquals(samplePatientRegisterQuestionnaire, result.second) @@ -447,7 +446,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { } addExtension( "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-targetStructureMap", - CanonicalType("1234") + CanonicalType("1234"), ) } @@ -460,7 +459,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { context = context, resourceId = "12345", questionnaireResponse = questionnaireResponse, - questionnaire = questionnaire + questionnaire = questionnaire, ) coVerify { defaultRepo.addOrUpdate(resource = patient) } @@ -485,8 +484,8 @@ class QuestionnaireViewModelTest : RobolectricTest() { language = "application/x-fhir-query" expression = "Patient" name = "Patient" - } - ) + }, + ), ) } @@ -496,7 +495,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { context = context, resourceId = null, questionnaireResponse = questionnaireResponse, - questionnaire = questionnaire + questionnaire = questionnaire, ) coVerify { defaultRepo.addOrUpdate(resource = any()) } @@ -521,7 +520,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { context = context, resourceId = "12345", questionnaireResponse = QuestionnaireResponse(), - questionnaire = questionnaire + questionnaire = questionnaire, ) coVerify(timeout = 2000) { @@ -530,7 +529,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Assert.assertEquals( "12345", - questionnaireResponseSlot.captured.subject.reference.replace("Patient/", "") + questionnaireResponseSlot.captured.subject.reference.replace("Patient/", ""), ) Assert.assertEquals("1234567", questionnaireResponseSlot.captured.meta.tagFirstRep.code) } @@ -560,7 +559,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { resourceId = "12345", questionnaireResponse = QuestionnaireResponse(), questionnaireType = QuestionnaireType.EDIT, - questionnaire = questionnaire + questionnaire = questionnaire, ) coVerifyOrder { @@ -570,7 +569,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Assert.assertEquals( "12345", - questionnaireResponseSlot.captured.subject.reference.replace("Patient/", "") + questionnaireResponseSlot.captured.subject.reference.replace("Patient/", ""), ) Assert.assertEquals("12345", patientSlot.captured.id) @@ -586,7 +585,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { HumanName().apply { given = listOf(StringType("John")) family = "Doe" - } + }, ) } @@ -597,7 +596,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Assert.assertEquals( patient.name.first().given.first().value, - loadedPatient?.name?.first()?.given?.first()?.value + loadedPatient?.name?.first()?.given?.first()?.value, ) Assert.assertEquals(patient.name.first().family, loadedPatient?.name?.first()?.family) } @@ -612,7 +611,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { HumanName().apply { given = listOf(StringType("John")) family = "Doe" - } + }, ) } @@ -624,7 +623,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { val result = list?.get(0) Assert.assertEquals( relatedPerson.name.first().given.first().value, - result?.name?.first()?.given?.first()?.value + result?.name?.first()?.given?.first()?.value, ) Assert.assertEquals(relatedPerson.name.first().family, result?.name?.first()?.family) } @@ -659,7 +658,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { arrayListOf( "{\"resourceType\":\"Patient\",\"id\":\"1\",\"text\":{\"status\":\"generated\",\"div\":\"\"}}", "{\"resourceType\":\"Bundle\",\"id\":\"34\",\"text\":{\"status\":\"generated\",\"div\":\"\"}}", - ) + ), ) intent.putExtra(QuestionnaireActivity.QUESTIONNAIRE_ARG_PATIENT_KEY, "2") @@ -687,7 +686,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Coding().apply { system = "http://snomed.info/sct" code = "225368008" - } + }, ) } meta = @@ -697,7 +696,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { system = "https://dtree.org" code = "home-tracing" display = "Home Tracing" - } + }, ) } reasonCode = @@ -705,7 +704,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { Coding().apply { system = "https://dtree.org" code = "miss-routine" - } + }, ) reasonReference = Reference().apply { reference = "Questionnaire/art-tracing-outcome" } } @@ -732,7 +731,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { arrayListOf( "{\"resourceType\":\"Patient\",\"id\":\"1\",\"text\":{\"status\":\"generated\",\"div\":\"\"}}", "{\"resourceType\":\"Bundle\",\"id\":\"34\",\"text\":{\"status\":\"generated\",\"div\":\"\"}}", - ) + ), ) intent.putExtra(QuestionnaireActivity.QUESTIONNAIRE_ARG_PATIENT_KEY, "2") @@ -754,7 +753,6 @@ class QuestionnaireViewModelTest : RobolectricTest() { @Test fun testSaveQuestionnaireResponseShouldCallAddOrUpdateWhenResourceIdIsNotBlank() { - val questionnaire = Questionnaire().apply { id = "qId" } val questionnaireResponse = QuestionnaireResponse().apply { subject = Reference("12345") } coEvery { defaultRepo.addOrUpdate(resource = any()) } returns Unit @@ -768,7 +766,6 @@ class QuestionnaireViewModelTest : RobolectricTest() { @Test fun testSaveQuestionnaireResponseWithExperimentalQuestionnaireShouldNotSave() { - val questionnaire = Questionnaire().apply { experimental = true } val questionnaireResponse = QuestionnaireResponse() @@ -798,7 +795,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { context = ApplicationProvider.getApplicationContext(), resourceId = null, questionnaireResponse = questionnaireResponse, - questionnaire = questionnaire + questionnaire = questionnaire, ) } @@ -810,7 +807,6 @@ class QuestionnaireViewModelTest : RobolectricTest() { @Test fun testSaveQuestionnaireResponseShouldAddIdAndAuthoredWhenQuestionnaireResponseDoesNotHaveId() { - val questionnaire = Questionnaire().apply { id = "qId" } val questionnaireResponse = QuestionnaireResponse().apply { subject = Reference("12345") } coEvery { defaultRepo.addOrUpdate(resource = any()) } returns Unit @@ -828,7 +824,6 @@ class QuestionnaireViewModelTest : RobolectricTest() { @Test fun testSaveQuestionnaireResponseShouldRetainIdAndAuthoredWhenQuestionnaireResponseHasId() { - val authoredDate = Date() val questionnaire = Questionnaire().apply { id = "qId" } val questionnaireResponse = @@ -870,9 +865,9 @@ class QuestionnaireViewModelTest : RobolectricTest() { } addExtension( "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-targetStructureMap", - CanonicalType("1234") + CanonicalType("1234"), ) - } + }, ) val oldQuestionnaireResponse = @@ -890,7 +885,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { resourceId = "12345", questionnaireResponse = questionnaireResponse, questionnaireType = QuestionnaireType.EDIT, - questionnaire = questionnaire + questionnaire = questionnaire, ) verify { questionnaireResponse.retainMetadata(oldQuestionnaireResponse) } @@ -928,11 +923,11 @@ class QuestionnaireViewModelTest : RobolectricTest() { listOf( QuestionnaireResponse.QuestionnaireResponseItemAnswerComponent().apply { value = DecimalType(25) - } + }, ) - } + }, ) - } + }, ) } Assert.assertEquals(expectedAge, questionnaireViewModel.getAgeInput(questionnaireResponse)) @@ -952,7 +947,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } bundle.addEntry(bundleEntry) @@ -979,7 +974,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } bundle.addEntry(bundleEntry) @@ -1020,8 +1015,8 @@ class QuestionnaireViewModelTest : RobolectricTest() { Expression().apply { language = "application/x-fhir-query" expression = "Patient" - } - ) + }, + ), ) questionnaire.addSubjectType("Patient") val questionnaireResponse = QuestionnaireResponse() @@ -1036,7 +1031,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { context = context, resourceId = "0993ldsfkaljlsnldm", questionnaireResponse = questionnaireResponse, - questionnaire = questionnaire + questionnaire = questionnaire, ) coVerify(exactly = 1, timeout = 2000) { questionnaireViewModel.saveBundleResources(any()) } @@ -1058,14 +1053,14 @@ class QuestionnaireViewModelTest : RobolectricTest() { Expression().apply { language = "application/x-fhir-query" expression = "Patient" - } - ) + }, + ), ) questionnaire.extension.add( Extension( "http://hl7.org/fhir/uv/sdc/StructureDefinition/cqf-library", - CanonicalType("Library/123") - ) + CanonicalType("Library/123"), + ), ) questionnaire.addSubjectType("Patient") @@ -1083,7 +1078,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { context = context, resourceId = "0993ldsfkaljlsnldm", questionnaireResponse = questionnaireResponse, - questionnaire = questionnaire + questionnaire = questionnaire, ) coVerify(exactly = 1, timeout = 2000) { questionnaireViewModel.saveBundleResources(any()) } @@ -1129,7 +1124,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { questionnaireViewModel.handleQuestionnaireResponseSubject( "123", questionnaire, - questionnaireResponse + questionnaireResponse, ) Assert.assertEquals("Patient/123", questionnaireResponse.subject.reference) @@ -1145,7 +1140,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { questionnaireViewModel.handleQuestionnaireResponseSubject( "123", questionnaire, - questionnaireResponse + questionnaireResponse, ) Assert.assertEquals("Organization/1111", questionnaireResponse.subject.reference) @@ -1223,7 +1218,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { // Sets the managing entity questionnaireViewModel.appendPatientsAndRelatedPersonsToGroups( RelatedPerson().apply { id = "rel1" }, - familyGroup2.id + familyGroup2.id, ) Assert.assertNotNull(familyGroup2.managingEntity) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterActivityTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterActivityTest.kt index dd870a4728..a91169d9b4 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterActivityTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterActivityTest.kt @@ -94,8 +94,11 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { @BindValue var tokenAuthenticator: TokenAuthenticator = mockk() @BindValue val sharedPreferencesHelper: SharedPreferencesHelper = mockk() + @BindValue val secureSharedPreference: SecureSharedPreference = mockk() + @BindValue @JvmField val accountAuthenticator = mockk() + @BindValue @JvmField val performanceReporter: PerformanceReporter = FakePerformanceReporter() @BindValue var configurationRegistry = Faker.buildTestConfigurationRegistry() @@ -134,7 +137,6 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { @Test fun testViewSetup() { - // Main Fragment is displayed Assert.assertTrue(testRegisterActivity.supportFragmentManager.fragments.isNotEmpty()) val findFragmentByTag: Fragment? = @@ -180,12 +182,12 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { showNewClientButton = true, showSideMenu = true, showBottomMenu = false, - registrationForm = "patient-registration" + registrationForm = "patient-registration", ) testRegisterActivity.configureViews(registerViewConfiguration) Assert.assertEquals( registerViewConfiguration.appTitle, - testRegisterActivity.drawerMenuHeaderBinding.tvNavHeader.text.toString() + testRegisterActivity.drawerMenuHeaderBinding.tvNavHeader.text.toString(), ) val registerActivityBinding = testRegisterActivity.registerActivityBinding @@ -196,43 +198,43 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { // DrawerMenu button is visible Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.btnDrawerMenu.visibility + registerActivityBinding.toolbarLayout.btnDrawerMenu.visibility, ) // TopToolbarSection is visible Assert.assertEquals( View.GONE, - registerActivityBinding.toolbarLayout.topToolbarSection.visibility + registerActivityBinding.toolbarLayout.topToolbarSection.visibility, ) // MiddleToolbarSection is gone Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.middleToolbarSection.visibility + registerActivityBinding.toolbarLayout.middleToolbarSection.visibility, ) // New button is visible, text also updated Assert.assertEquals( registerViewConfiguration.newClientButtonText, - registerActivityBinding.btnRegisterNewClient.text + registerActivityBinding.btnRegisterNewClient.text, ) // Search bar is visible Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.editTextSearch.visibility + registerActivityBinding.toolbarLayout.editTextSearch.visibility, ) // Due button is visible Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.btnShowOverdue.visibility + registerActivityBinding.toolbarLayout.btnShowOverdue.visibility, ) // Scan QR Code button is visible Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.btnScanBarcode.visibility + registerActivityBinding.toolbarLayout.btnScanBarcode.visibility, ) // BottomNavigation is gone @@ -256,12 +258,12 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { showNewClientButton = true, showSideMenu = false, showBottomMenu = false, - registrationForm = "patient-registration" + registrationForm = "patient-registration", ) testRegisterActivity.configureViews(registerViewConfiguration) Assert.assertEquals( registerViewConfiguration.appTitle, - testRegisterActivity.drawerMenuHeaderBinding.tvNavHeader.text.toString() + testRegisterActivity.drawerMenuHeaderBinding.tvNavHeader.text.toString(), ) val registerActivityBinding = testRegisterActivity.registerActivityBinding @@ -275,37 +277,37 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { // TopToolbarSection is visible Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.topToolbarSection.visibility + registerActivityBinding.toolbarLayout.topToolbarSection.visibility, ) // MiddleToolbarSection is gone Assert.assertEquals( View.GONE, - registerActivityBinding.toolbarLayout.middleToolbarSection.visibility + registerActivityBinding.toolbarLayout.middleToolbarSection.visibility, ) // New button is visible, text also updated Assert.assertEquals( registerViewConfiguration.newClientButtonText, - registerActivityBinding.btnRegisterNewClient.text + registerActivityBinding.btnRegisterNewClient.text, ) // Search bar is visible Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.editTextSearch.visibility + registerActivityBinding.toolbarLayout.editTextSearch.visibility, ) // Due button is visible Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.btnShowOverdue.visibility + registerActivityBinding.toolbarLayout.btnShowOverdue.visibility, ) // Scan QR Code button is visible Assert.assertEquals( View.VISIBLE, - registerActivityBinding.toolbarLayout.btnScanBarcode.visibility + registerActivityBinding.toolbarLayout.btnScanBarcode.visibility, ) // BottomNavigation is gone @@ -328,7 +330,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { showNewClientButton = true, showSideMenu = true, showBottomMenu = false, - registrationForm = "patient-registration" + registrationForm = "patient-registration", ) val registerActivityBinding = testRegisterActivity.registerActivityBinding @@ -359,7 +361,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { showNewClientButton = true, showSideMenu = true, showBottomMenu = false, - registrationForm = "patient-registration" + registrationForm = "patient-registration", ) val registerActivityBinding = testRegisterActivity.registerActivityBinding @@ -384,7 +386,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { Assert.assertEquals(View.VISIBLE, registerActivityBinding.progressSync.visibility) Assert.assertEquals( testRegisterActivity.getString(R.string.syncing_in_progress), - registerActivityBinding.tvLastSyncTimestamp.text.toString() + registerActivityBinding.tvLastSyncTimestamp.text.toString(), ) Assert.assertNull(registerActivityBinding.containerProgressSync.background) Assert.assertFalse(registerActivityBinding.containerProgressSync.hasOnClickListeners()) @@ -395,7 +397,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { testRegisterActivity.registerActivityBinding.containerProgressSync.performClick() Assert.assertEquals( View.VISIBLE, - testRegisterActivity.registerActivityBinding.progressSync.visibility + testRegisterActivity.registerActivityBinding.progressSync.visibility, ) testRegisterActivity.registerActivityBinding.drawerLayout.isDrawerOpen(GravityCompat.START) } @@ -410,7 +412,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { Assert.assertEquals(View.VISIBLE, registerActivityBinding.progressSync.visibility) Assert.assertEquals( testRegisterActivity.getString(R.string.syncing_in_progress), - registerActivityBinding.tvLastSyncTimestamp.text.toString() + registerActivityBinding.tvLastSyncTimestamp.text.toString(), ) Assert.assertNull(registerActivityBinding.containerProgressSync.background) Assert.assertFalse(registerActivityBinding.containerProgressSync.hasOnClickListeners()) @@ -439,8 +441,8 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { currentDateTime.asString(), testRegisterActivity.registerViewModel.sharedPreferencesHelper.read( SharedPreferenceKey.LAST_SYNC_TIMESTAMP.name, - null - ) + null, + ), ) } @@ -467,8 +469,8 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { lastDateTimestamp.asString(), testRegisterActivity.registerViewModel.sharedPreferencesHelper.read( SharedPreferenceKey.LAST_SYNC_TIMESTAMP.name, - null - ) + null, + ), ) } @@ -477,14 +479,14 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { val registerActivityBinding = testRegisterActivity.registerActivityBinding testRegisterActivity.onSync( SyncJobStatus.Glitch( - listOf(ResourceSyncException(ResourceType.Patient, Exception("I am a bad exception"))) - ) + listOf(ResourceSyncException(ResourceType.Patient, Exception("I am a bad exception"))), + ), ) Assert.assertEquals(View.GONE, registerActivityBinding.progressSync.visibility) val syncStatus = testRegisterActivity.registerViewModel.sharedPreferencesHelper.read( SharedPreferenceKey.LAST_SYNC_TIMESTAMP.name, - testRegisterActivity.getString(R.string.syncing_retry) + testRegisterActivity.getString(R.string.syncing_retry), ) Assert.assertEquals(syncStatus, registerActivityBinding.tvLastSyncTimestamp.text.toString()) Assert.assertNotNull(registerActivityBinding.containerProgressSync.background) @@ -515,7 +517,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { val logoutMenuItem = RoboMenuItem(R.id.menu_item_logout) testRegisterActivity.onNavigationItemSelected(logoutMenuItem) Assert.assertFalse( - testRegisterActivity.registerActivityBinding.drawerLayout.isDrawerOpen(GravityCompat.START) + testRegisterActivity.registerActivityBinding.drawerLayout.isDrawerOpen(GravityCompat.START), ) verify(exactly = 1) { accountAuthenticator.logout(any()) } } @@ -525,7 +527,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { val clientsMenuItem = RoboMenuItem(R.id.menu_item_clients) testRegisterActivity.onNavigationItemSelected(clientsMenuItem) Assert.assertFalse( - testRegisterActivity.registerActivityBinding.drawerLayout.isDrawerOpen(GravityCompat.START) + testRegisterActivity.registerActivityBinding.drawerLayout.isDrawerOpen(GravityCompat.START), ) } @@ -538,7 +540,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { fun testLastSyncTimestamp_isWrongDate_throws_illegalArgumentException() { testRegisterActivity.registerViewModel.lastSyncTimestamp.value = "2021-12-15" Assert.assertTrue( - testRegisterActivity.registerActivityBinding.tvLastSyncTimestamp.text.isEmpty() + testRegisterActivity.registerActivityBinding.tvLastSyncTimestamp.text.isEmpty(), ) } @@ -556,17 +558,17 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { tag = TestFragment.TAG + 2, isRegisterFragment = false, isFilterVisible = false, - toolbarTitle = null + toolbarTitle = null, ) val registerActivityBinding = testRegisterActivity.registerActivityBinding Assert.assertFalse( - registerActivityBinding.toolbarLayout.registerFilterTextview.hasOnClickListeners() + registerActivityBinding.toolbarLayout.registerFilterTextview.hasOnClickListeners(), ) Assert.assertEquals( testRegisterActivity.getString(R.string.clients), - registerActivityBinding.toolbarLayout.registerFilterTextview.text.toString() + registerActivityBinding.toolbarLayout.registerFilterTextview.text.toString(), ) } @@ -577,17 +579,17 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { tag = TestFragment.TAG + 2, isRegisterFragment = false, isFilterVisible = false, - toolbarTitle = toolbarTitle + toolbarTitle = toolbarTitle, ) val registerActivityBinding = testRegisterActivity.registerActivityBinding Assert.assertFalse( - registerActivityBinding.toolbarLayout.registerFilterTextview.hasOnClickListeners() + registerActivityBinding.toolbarLayout.registerFilterTextview.hasOnClickListeners(), ) Assert.assertEquals( toolbarTitle, - registerActivityBinding.toolbarLayout.registerFilterTextview.text.toString() + registerActivityBinding.toolbarLayout.registerFilterTextview.text.toString(), ) } @@ -610,8 +612,8 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { listOf( mockk { every { exception } returns mockk { every { code() } returns 401 } - } - ) + }, + ), ) handleSyncFailed(glitchState) @@ -622,8 +624,8 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { listOf( mockk { every { exception } returns mockk { every { code() } returns 401 } - } - ) + }, + ), ) handleSyncFailed(failedState) @@ -637,17 +639,17 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { mockk { every { message } returns "java.io.InterruptedIOException: timeout" } - } - ) + }, + ), ) handleSyncFailed(glitchStateInterruptedIOException) Assert.assertEquals( View.GONE, - testRegisterActivity.registerActivityBinding.progressSync.visibility + testRegisterActivity.registerActivityBinding.progressSync.visibility, ) Assert.assertNotNull( - testRegisterActivity.registerActivityBinding.containerProgressSync.background + testRegisterActivity.registerActivityBinding.containerProgressSync.background, ) val glitchStateUnknownHostException = @@ -659,32 +661,32 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { every { message } returns "java.net.UnknownHostException: Unable to resolve host fhir.labs.smartregister.org: No address associated with hostname" } - } - ) + }, + ), ) handleSyncFailed(glitchStateUnknownHostException) Assert.assertEquals( View.GONE, - testRegisterActivity.registerActivityBinding.progressSync.visibility + testRegisterActivity.registerActivityBinding.progressSync.visibility, ) Assert.assertNotNull( - testRegisterActivity.registerActivityBinding.containerProgressSync.background + testRegisterActivity.registerActivityBinding.containerProgressSync.background, ) handleSyncFailed(SyncJobStatus.Glitch(listOf())) Assert.assertFalse( - testRegisterActivity.registerActivityBinding.drawerLayout.isDrawerOpen(GravityCompat.START) + testRegisterActivity.registerActivityBinding.drawerLayout.isDrawerOpen(GravityCompat.START), ) Assert.assertEquals( View.GONE, - testRegisterActivity.registerActivityBinding.progressSync.visibility + testRegisterActivity.registerActivityBinding.progressSync.visibility, ) Assert.assertNotNull( - testRegisterActivity.registerActivityBinding.containerProgressSync.background + testRegisterActivity.registerActivityBinding.containerProgressSync.background, ) Assert.assertTrue( - testRegisterActivity.registerActivityBinding.containerProgressSync.hasOnClickListeners() + testRegisterActivity.registerActivityBinding.containerProgressSync.hasOnClickListeners(), ) } @@ -692,7 +694,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { ReflectionHelpers.callInstanceMethod( testRegisterActivity, "handleSyncFailed", - ReflectionHelpers.ClassParameter(SyncJobStatus::class.java, state) + ReflectionHelpers.ClassParameter(SyncJobStatus::class.java, state), ) } @@ -713,14 +715,14 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { titleResource = R.string.clients, iconResource = ContextCompat.getDrawable(this, R.drawable.ic_menu)!!, count = 10, - countMethod = { 10L } - ) + countMethod = { 10L }, + ), ) override fun supportedFragments() = mapOf( Pair(TestFragment.TAG + 1, TestFragment(1)), - Pair(TestFragment.TAG + 2, TestFragment(2)) + Pair(TestFragment.TAG + 2, TestFragment(2)), ) override fun registersList() = @@ -732,7 +734,7 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { val composeView = ComposeView(requireContext()) composeView.setContent { Text(text = "Hello Fragment: $number") } @@ -745,7 +747,8 @@ class BaseRegisterActivityTest : ActivityRobolectricTest() { } enum class TestConfigClassification : ConfigClassification { - PATIENT_REGISTER; + PATIENT_REGISTER, + ; override val classification: String = name.lowercase() } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterFragmentTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterFragmentTest.kt index 02b3177918..7001a8008c 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterFragmentTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/BaseRegisterFragmentTest.kt @@ -54,28 +54,25 @@ class BaseRegisterFragmentTest : RobolectricTest() { @Before fun setUp() { - ApplicationProvider.getApplicationContext().apply { setTheme(R.style.AppTheme) } val allRegisterData: MutableStateFlow>> = MutableStateFlow(emptyFlow()) - registerDataViewModel = - mockk { - every { registerData } returns allRegisterData - every { showResultsCount } returns MutableLiveData(false) - every { showLoader } returns MutableLiveData(false) - every { currentPage() } returns 1 - every { countPages() } returns 1 - every { filterRegisterData(any(), any(), any()) } returns Unit - every { reloadCurrentPageData(refreshTotalRecordsCount = true) } just runs - } + registerDataViewModel = mockk { + every { registerData } returns allRegisterData + every { showResultsCount } returns MutableLiveData(false) + every { showLoader } returns MutableLiveData(false) + every { currentPage() } returns 1 + every { countPages() } returns 1 + every { filterRegisterData(any(), any(), any()) } returns Unit + every { reloadCurrentPageData(refreshTotalRecordsCount = true) } just runs + } registerFragment.registerDataViewModel = registerDataViewModel every { registerFragment.registerViewModel } returns mockk(relaxed = true) } @Test fun testOnViewCreatedConfiguresLiveDataObservationsCorrectly() { - every { registerFragment.registerViewModel.lastSyncTimestamp } returns mockk(relaxed = true) every { registerFragment.registerViewModel.lastSyncTimestamp.observe(any(), any()) } just runs @@ -130,7 +127,7 @@ class BaseRegisterFragmentTest : RobolectricTest() { override fun performFilter( registerFilterType: RegisterFilterType, data: patientB, - value: Any + value: Any, ): Boolean = true } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/ComposeRegisterFragmentTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/ComposeRegisterFragmentTest.kt index 3dd6efa311..3bf7e39991 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/ComposeRegisterFragmentTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/ComposeRegisterFragmentTest.kt @@ -93,22 +93,22 @@ class ComposeRegisterFragmentTest : RobolectricTest() { testComposeRegisterFragment.performFilter( registerFilterType = RegisterFilterType.SEARCH_FILTER, data = "2", - value = 2 - ) + value = 2, + ), ) Assert.assertTrue( testComposeRegisterFragment.performFilter( registerFilterType = RegisterFilterType.OVERDUE_FILTER, data = "50", - value = 51 - ) + value = 51, + ), ) Assert.assertFalse( testComposeRegisterFragment.performFilter( registerFilterType = RegisterFilterType.OVERDUE_FILTER, data = "50", - value = 50 - ) + value = 50, + ), ) } @@ -137,7 +137,7 @@ class ComposeRegisterFragmentTest : RobolectricTest() { override fun performFilter( registerFilterType: RegisterFilterType, data: String, - value: Any + value: Any, ): Boolean = when (registerFilterType) { RegisterFilterType.SEARCH_FILTER -> data == value.toString() @@ -163,7 +163,7 @@ class ComposeRegisterFragmentTest : RobolectricTest() { ErrorMessage( message = loadStateError.error.localizedMessage!!, modifier = Modifier.fillParentMaxSize(), - onClickRetry = { retry() } + onClickRetry = { retry() }, ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/RegisterDataViewModelTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/RegisterDataViewModelTest.kt index a9cf3e36c4..9b59d89c94 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/RegisterDataViewModelTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/register/RegisterDataViewModelTest.kt @@ -55,27 +55,27 @@ class RegisterDataViewModelTest : RobolectricTest() { registerDataViewModel = spyk( objToCopy = - RegisterDataViewModel(application = application, registerRepository = registerRepository) + RegisterDataViewModel(application = application, registerRepository = registerRepository), ) } @Test fun testUpdateViewConfiguration() { registerDataViewModel.updateViewConfigurations( - RegisterViewConfiguration("appId", "classification") + RegisterViewConfiguration("appId", "classification"), ) Assert.assertEquals("appId", registerDataViewModel.registerViewConfiguration.value?.appId) Assert.assertEquals( "classification", - registerDataViewModel.registerViewConfiguration.value?.classification + registerDataViewModel.registerViewConfiguration.value?.classification, ) registerDataViewModel.updateViewConfigurations( - RegisterViewConfiguration("newAppId", "newClassification") + RegisterViewConfiguration("newAppId", "newClassification"), ) Assert.assertEquals("newAppId", registerDataViewModel.registerViewConfiguration.value?.appId) Assert.assertEquals( "newClassification", - registerDataViewModel.registerViewConfiguration.value?.classification + registerDataViewModel.registerViewConfiguration.value?.classification, ) } @@ -150,7 +150,8 @@ class RegisterDataViewModelTest : RobolectricTest() { registerDataViewModel.filterRegisterData(RegisterFilterType.SEARCH_FILTER, "20") { _: RegisterFilterType, content: String, - _: Any -> + _: Any, + -> content.isNotEmpty() } Assert.assertNotNull(registerDataViewModel.registerData.value) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/settings/InfoCardTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/settings/InfoCardTest.kt index d808428216..7b18e2e731 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/settings/InfoCardTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/settings/InfoCardTest.kt @@ -33,6 +33,7 @@ import org.smartregister.fhircore.engine.rule.CoroutineTestRule @OptIn(ExperimentalCoroutinesApi::class) class InfoCardTest : RobolectricTest() { @get:Rule(order = 1) val coroutineRule = CoroutineTestRule() + @get:Rule(order = 2) val composeRule = createComposeRule() private val settingsViewModel = mockk() diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreenKtTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreenKtTest.kt index 0ef9681926..b019dd3c33 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreenKtTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/settings/SettingsScreenKtTest.kt @@ -36,6 +36,7 @@ import org.smartregister.fhircore.engine.rule.CoroutineTestRule class SettingsScreenKtTest : RobolectricTest() { @get:Rule(order = 1) val coroutineRule = CoroutineTestRule() + @get:Rule(order = 2) val composeRule = createComposeRule() private val appContext = ApplicationProvider.getApplicationContext() diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileFragmentTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileFragmentTest.kt index 597187d3b5..1d9096d3d7 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileFragmentTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileFragmentTest.kt @@ -57,7 +57,9 @@ class UserProfileFragmentTest : RobolectricTest() { @get:Rule(order = 2) val instantTaskExecutorRule = InstantTaskExecutorRule() private val context = ApplicationProvider.getApplicationContext() + @BindValue var accountAuthenticator: AccountAuthenticator = mockk() + @BindValue var userProfileViewModel: UserProfileViewModel = UserProfileViewModel(mockk(), accountAuthenticator, mockk(), mockk(), mockk()) @@ -78,7 +80,7 @@ class UserProfileFragmentTest : RobolectricTest() { it.supportFragmentManager.commitNow { add( UserProfileFragment().also { profileFragment -> userProfileFragment = profileFragment }, - UserProfileFragment.TAG + UserProfileFragment.TAG, ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileViewModelTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileViewModelTest.kt index 0b1348a70a..27cccc628c 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileViewModelTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/ui/userprofile/UserProfileViewModelTest.kt @@ -95,7 +95,7 @@ class UserProfileViewModelTest : RobolectricTest() { appContext = context, tracer = mockk(), tokenAuthenticator = tokenAuthenticator, - sharedPreferencesHelper = sharedPreferencesHelper + sharedPreferencesHelper = sharedPreferencesHelper, ) userProfileViewModel = UserProfileViewModel( @@ -103,7 +103,7 @@ class UserProfileViewModelTest : RobolectricTest() { accountAuthenticator, secureSharedPreference, sharedPreferencesHelper, - configurationRegistry + configurationRegistry, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/FileUtilTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/FileUtilTest.kt index 889ecd9078..fdbd21f071 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/FileUtilTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/FileUtilTest.kt @@ -128,7 +128,7 @@ class FileUtilTest { "src" + File.separator + File.separator + - "test/resources/cql/libraryevaluator/" + "test/resources/cql/libraryevaluator/", ) val fileListString = FileUtil.readFileFromInternalStorage(context, "library.json", "") diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecureSharedPreferenceTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecureSharedPreferenceTest.kt index 6a2709b872..6cf7540b80 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecureSharedPreferenceTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecureSharedPreferenceTest.kt @@ -60,7 +60,7 @@ internal class SecureSharedPreferenceTest : RobolectricTest() { Assert.assertEquals("userName", secureSharedPreference.retrieveCredentials()!!.username) Assert.assertEquals( "!@#$".toCharArray().toPasswordHash(byteArrayOf(-100, 0, 100, 101)), - secureSharedPreference.retrieveCredentials()!!.passwordHash + secureSharedPreference.retrieveCredentials()!!.passwordHash, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecurityUtilKtTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecurityUtilKtTest.kt index c7f95bb3d0..efd1766a33 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecurityUtilKtTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecurityUtilKtTest.kt @@ -43,7 +43,6 @@ internal class SecurityUtilKtTest { @Test fun testGetRandomBytesOfSizeGeneratesRandomByteArray() { - val firstBytes = 5.getRandomBytesOfSize() assertNotNull(firstBytes) assertEquals(5, firstBytes.size) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelperTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelperTest.kt index ba21954c81..f96844d3d5 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelperTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SharedPreferencesHelperTest.kt @@ -37,9 +37,11 @@ import org.smartregister.fhircore.engine.util.extension.encodeJson @HiltAndroidTest internal class SharedPreferencesHelperTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) + @get:Rule(order = 1) val instantTaskExecutorRule = InstantTaskExecutorRule() private val application = ApplicationProvider.getApplicationContext() private lateinit var sharedPreferencesHelper: SharedPreferencesHelper + @Inject lateinit var gson: Gson @Before @@ -106,8 +108,9 @@ internal class SharedPreferencesHelperTest : RobolectricTest() { sharedPreferencesHelper.write("object", questionnaireConfig, encodeWithGson = false) Assert.assertEquals( questionnaireConfig.identifier, - sharedPreferencesHelper.read("object", decodeWithGson = false) - ?.identifier + sharedPreferencesHelper + .read("object", decodeWithGson = false) + ?.identifier, ) } @@ -117,7 +120,7 @@ internal class SharedPreferencesHelperTest : RobolectricTest() { sharedPreferencesHelper.write("object", practitioner, encodeWithGson = true) Assert.assertEquals( practitioner.id, - sharedPreferencesHelper.read("object", decodeWithGson = true)?.id + sharedPreferencesHelper.read("object", decodeWithGson = true)?.id, ) } @@ -146,7 +149,7 @@ internal class SharedPreferencesHelperTest : RobolectricTest() { sharedPreferencesHelper.write( USER_INFO_SHARED_PREFERENCE_KEY, - UserInfo(keycloakUuid = "1244").encodeJson() + UserInfo(keycloakUuid = "1244").encodeJson(), ) Assert.assertNotNull(sharedPreferencesHelper.read(USER_INFO_SHARED_PREFERENCE_KEY)) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/AndroidExtensionApi24Test.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/AndroidExtensionApi24Test.kt index 0c76f338ff..cf6e23e7d5 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/AndroidExtensionApi24Test.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/AndroidExtensionApi24Test.kt @@ -26,7 +26,7 @@ import org.robolectric.annotation.Config import org.smartregister.fhircore.engine.robolectric.RobolectricTest @Config(sdk = [Build.VERSION_CODES.O]) -class AndroidExtensionApi2Test : RobolectricTest() { +class AndroidExtensionApi24Test : RobolectricTest() { @Test fun `Context#setLocale() should change the default locale`() { diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ApplicationExtensionTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ApplicationExtensionTest.kt index cd81bac71b..116fdbdcb0 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ApplicationExtensionTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ApplicationExtensionTest.kt @@ -62,7 +62,7 @@ class ApplicationExtensionTest : RobolectricTest() { coEvery { fhirEngine.search(any()) } throws ResourceNotFoundException( "resource not found", - "immunizations for patient $patientId not found" + "immunizations for patient $patientId not found", ) val immunizations: List? @@ -79,7 +79,7 @@ class ApplicationExtensionTest : RobolectricTest() { coEvery { fhirEngine.search(any()) } throws ResourceNotFoundException( "resource not found", - "RelatedPersons for patient $patientId not found" + "RelatedPersons for patient $patientId not found", ) val relatedPersons: List? @@ -268,21 +268,21 @@ class ApplicationExtensionTest : RobolectricTest() { "#RefGoal" to "Goal/ref-goal-id", "#RefCareTeam" to "CareTeam/325", "#RefPractitioner" to "Practitioner/399", - "#RefDateOnset" to dateOnset + "#RefDateOnset" to dateOnset, ) val condition = context.loadResourceTemplate( "pregnancy_condition_template.json", Condition::class.java, - conditionData + conditionData, ) Assert.assertEquals(conditionData["#Id"], condition.logicalId) Assert.assertEquals(conditionData["#RefPatient"], condition.subject.reference) Assert.assertEquals( conditionData["#RefDateOnset"], - condition.onsetDateTimeType.toHumanDisplay() + condition.onsetDateTimeType.toHumanDisplay(), ) } @@ -300,13 +300,12 @@ class ApplicationExtensionTest : RobolectricTest() { val expectedDateTimeFormat = "2010-01-01" Assert.assertEquals( expectedDateTimeFormat, - DateTimeType(dateTimeTypeObject).format().split("T")[0] + DateTimeType(dateTimeTypeObject).format().split("T")[0], ) } @Test fun `FhirEngine#loadCqlLibraryBundle()`() { - val context = ApplicationProvider.getApplicationContext() val fhirEngine = mockk() val fhirOperator: FhirOperator = mockk() @@ -324,7 +323,7 @@ class ApplicationExtensionTest : RobolectricTest() { context = context, fhirOperator = fhirOperator, sharedPreferencesHelper = sharedPreferencesHelper, - resourcesBundlePath = measureResourceBundleUrl + resourcesBundlePath = measureResourceBundleUrl, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/CarePlanExtensionTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/CarePlanExtensionTest.kt index 161602dfe8..9d30b39c50 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/CarePlanExtensionTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/CarePlanExtensionTest.kt @@ -31,24 +31,24 @@ class CarePlanExtensionTest { val noPeriodScheduled = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, - activityStatus = CarePlan.CarePlanActivityStatus.SCHEDULED + activityStatus = CarePlan.CarePlanActivityStatus.SCHEDULED, ) val noPeriodNotStarted = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, - activityStatus = CarePlan.CarePlanActivityStatus.NOTSTARTED + activityStatus = CarePlan.CarePlanActivityStatus.NOTSTARTED, ) val startDatePassedWithScheduled = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, activityStatus = CarePlan.CarePlanActivityStatus.SCHEDULED, - activityPeriod = Period().apply { start = pastDate(1) } + activityPeriod = Period().apply { start = pastDate(1) }, ) val startDatePassedWithNotStarted = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, activityStatus = CarePlan.CarePlanActivityStatus.NOTSTARTED, - activityPeriod = Period().apply { start = pastDate(1) } + activityPeriod = Period().apply { start = pastDate(1) }, ) assertTrue(noPeriodScheduled.activityFirstRep.due()) @@ -63,30 +63,30 @@ class CarePlanExtensionTest { buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, activityStatus = CarePlan.CarePlanActivityStatus.INPROGRESS, - activityPeriod = Period().apply { start = pastDate(1) } + activityPeriod = Period().apply { start = pastDate(1) }, ) val cancelled = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, - activityStatus = CarePlan.CarePlanActivityStatus.CANCELLED + activityStatus = CarePlan.CarePlanActivityStatus.CANCELLED, ) val completed = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, activityStatus = CarePlan.CarePlanActivityStatus.COMPLETED, - activityPeriod = Period().apply { start = pastDate(1) } + activityPeriod = Period().apply { start = pastDate(1) }, ) val onhold = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, activityStatus = CarePlan.CarePlanActivityStatus.ONHOLD, - activityPeriod = Period().apply { start = pastDate(1) } + activityPeriod = Period().apply { start = pastDate(1) }, ) val stopped = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, activityStatus = CarePlan.CarePlanActivityStatus.STOPPED, - activityPeriod = Period().apply { start = pastDate(1) } + activityPeriod = Period().apply { start = pastDate(1) }, ) assertFalse(inprogress.activityFirstRep.due()) @@ -106,7 +106,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(1) end = futureDate(1) - } + }, ) assertTrue(inRange.activityFirstRep.due()) @@ -122,7 +122,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(2) end = pastDate(1) - } + }, ) assertFalse(inRange.activityFirstRep.due()) @@ -138,7 +138,7 @@ class CarePlanExtensionTest { Period().apply { start = futureDate(1) end = futureDate(2) - } + }, ) assertFalse(inRange.activityFirstRep.due()) @@ -154,7 +154,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(1) end = futureDate(1) - } + }, ) assertFalse(completed.activityFirstRep.overdue()) @@ -165,7 +165,7 @@ class CarePlanExtensionTest { val scheduled = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, - activityStatus = CarePlan.CarePlanActivityStatus.SCHEDULED + activityStatus = CarePlan.CarePlanActivityStatus.SCHEDULED, ) assertFalse(scheduled.activityFirstRep.overdue()) @@ -181,7 +181,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(1) end = futureDate(1) - } + }, ) assertFalse(scheduled.activityFirstRep.overdue()) @@ -197,7 +197,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(2) end = pastDate(1) - } + }, ) assertTrue(scheduled.activityFirstRep.overdue()) @@ -213,7 +213,7 @@ class CarePlanExtensionTest { Period().apply { start = futureDate(1) end = futureDate(2) - } + }, ) assertFalse(scheduled.activityFirstRep.overdue()) @@ -238,7 +238,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(1) end = futureDate(1) - } + }, ) assertTrue(carePlan.due()) @@ -250,7 +250,7 @@ class CarePlanExtensionTest { val revoked = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.REVOKED, - careplanPeriod = Period().apply { start = pastDate(1) } + careplanPeriod = Period().apply { start = pastDate(1) }, ) val onhold = buildCarePlan( @@ -259,7 +259,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(1) end = futureDate(1) - } + }, ) assertFalse(completed.due()) @@ -276,7 +276,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(2) end = pastDate(1) - } + }, ) assertFalse(passed.due()) @@ -291,7 +291,7 @@ class CarePlanExtensionTest { Period().apply { start = futureDate(1) end = futureDate(2) - } + }, ) assertFalse(future.due()) @@ -303,7 +303,7 @@ class CarePlanExtensionTest { val revoked = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.REVOKED, - careplanPeriod = Period().apply { pastDate(1) } + careplanPeriod = Period().apply { pastDate(1) }, ) val onhold = buildCarePlan( @@ -312,7 +312,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(2) end = pastDate(1) - } + }, ) assertFalse(completed.overdue()) @@ -326,7 +326,7 @@ class CarePlanExtensionTest { val started = buildCarePlan( careplanStatus = CarePlan.CarePlanStatus.ACTIVE, - careplanPeriod = Period().apply { start = pastDate(1) } + careplanPeriod = Period().apply { start = pastDate(1) }, ) val inRange = buildCarePlan( @@ -335,7 +335,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(1) end = futureDate(1) - } + }, ) assertFalse(noPeriod.overdue()) @@ -352,7 +352,7 @@ class CarePlanExtensionTest { Period().apply { start = pastDate(2) end = pastDate(1) - } + }, ) assertTrue(passed.overdue()) @@ -449,7 +449,7 @@ class CarePlanExtensionTest { careplanStatus: CarePlan.CarePlanStatus, careplanPeriod: Period? = null, activityPeriod: Period? = null, - activityStatus: CarePlan.CarePlanActivityStatus? = null + activityStatus: CarePlan.CarePlanActivityStatus? = null, ): CarePlan { return CarePlan().apply { this.status = careplanStatus diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/PatientExtensionTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/PatientExtensionTest.kt index d8899f8e56..a78a45c0c2 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/PatientExtensionTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/PatientExtensionTest.kt @@ -150,7 +150,7 @@ class PatientExtensionTest : RobolectricTest() { this.clinicalStatus.addCoding().code = "L123" this.clinicalStatus.addCoding().code = "active" this.code.addCoding().display = "preGnant" - } + }, ) Assert.assertTrue(conditions.hasActivePregnancy()) @@ -169,7 +169,7 @@ class PatientExtensionTest : RobolectricTest() { this.clinicalStatus.addCoding().code = "L123" this.clinicalStatus.addCoding().code = "inactive" this.code.addCoding().display = "preGnant" - } + }, ) Assert.assertFalse(conditions.hasActivePregnancy()) @@ -188,7 +188,7 @@ class PatientExtensionTest : RobolectricTest() { this.clinicalStatus.addCoding().code = "L123" this.clinicalStatus.addCoding().code = "active" this.code.addCoding().display = "pregnant" - } + }, ) Assert.assertNotNull(conditions.pregnancyCondition()) @@ -202,7 +202,7 @@ class PatientExtensionTest : RobolectricTest() { this.clinicalStatus.addCoding().code = "L123" this.clinicalStatus.addCoding().code = "active" this.code.addCoding().display = "breastfeeding" - } + }, ) Assert.assertTrue(conditions.activelyBreastfeeding()) @@ -216,7 +216,7 @@ class PatientExtensionTest : RobolectricTest() { this.clinicalStatus.addCoding().code = "L123" this.clinicalStatus.addCoding().code = "active" this.code.addCoding().display = "pregnant" - } + }, ) Assert.assertFalse(conditions.activelyBreastfeeding()) @@ -230,7 +230,7 @@ class PatientExtensionTest : RobolectricTest() { this.clinicalStatus.addCoding().code = "L123" this.clinicalStatus.addCoding().code = "inactive" this.code.addCoding().display = "breastfeeding" - } + }, ) Assert.assertFalse(conditions.activelyBreastfeeding()) @@ -244,7 +244,7 @@ class PatientExtensionTest : RobolectricTest() { this.clinicalStatus.addCoding().code = "L123" this.clinicalStatus.addCoding().code = "active" this.code.addCoding().display = "OCD" - } + }, ) Assert.assertNotNull(conditions.pregnancyCondition()) @@ -365,7 +365,7 @@ class PatientExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } @@ -381,7 +381,7 @@ class PatientExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John"), StringType("Tom")) - } + }, ) } @@ -409,7 +409,7 @@ class PatientExtensionTest : RobolectricTest() { Assert.assertEquals( (ApplicationProvider.getApplicationContext() as Application).getString(R.string.male), - patient.extractGender(ApplicationProvider.getApplicationContext()) + patient.extractGender(ApplicationProvider.getApplicationContext()), ) } @@ -419,7 +419,7 @@ class PatientExtensionTest : RobolectricTest() { Assert.assertEquals( (ApplicationProvider.getApplicationContext() as Application).getString(R.string.female), - patient.extractGender(ApplicationProvider.getApplicationContext()) + patient.extractGender(ApplicationProvider.getApplicationContext()), ) } @@ -431,7 +431,7 @@ class PatientExtensionTest : RobolectricTest() { Assert.assertEquals( applicationContext.getString(R.string.other), - patient.extractGender(applicationContext) + patient.extractGender(applicationContext), ) } @@ -441,7 +441,7 @@ class PatientExtensionTest : RobolectricTest() { Assert.assertEquals( (ApplicationProvider.getApplicationContext() as Application).getString(R.string.unknown), - patient.extractGender(ApplicationProvider.getApplicationContext()) + patient.extractGender(ApplicationProvider.getApplicationContext()), ) } @@ -495,7 +495,7 @@ class PatientExtensionTest : RobolectricTest() { Immunization().apply { occurrence = DateTimeType(calendar1YearAgo.time) protocolAppliedFirstRep.doseNumberPositiveIntType.value = 1 - } + }, ) Assert.assertEquals(DateTimeType(timeNow).toDisplay(), Patient().getLastSeen(immunizations)) @@ -510,14 +510,14 @@ class PatientExtensionTest : RobolectricTest() { system = "https://d-tree.org" code = "exposed-infant" display = "Exposed Infant" - } + }, ) } Assert.assertNotNull(patient.extractHealthStatusFromMeta("https://d-tree.org")) Assert.assertEquals( HealthStatus.EXPOSED_INFANT, - patient.extractHealthStatusFromMeta("https://d-tree.org") + patient.extractHealthStatusFromMeta("https://d-tree.org"), ) } @@ -530,7 +530,7 @@ class PatientExtensionTest : RobolectricTest() { system = "https://d-tree.org" code = "exposed-infant" display = "Exposed Infant" - } + }, ) } @@ -548,7 +548,7 @@ class PatientExtensionTest : RobolectricTest() { Identifier().apply { this.use = Identifier.IdentifierUse.SECONDARY this.value = secondaryValue - } + }, ) } Assert.assertEquals(secondaryValue, patient.extractSecondaryIdentifier()) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/QuestionnaireExtensionTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/QuestionnaireExtensionTest.kt index 2026a1818e..62ba0f3f8c 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/QuestionnaireExtensionTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/QuestionnaireExtensionTest.kt @@ -41,7 +41,7 @@ class QuestionnaireExtensionTest : RobolectricTest() { setValue(CanonicalType("test")) } } - .isExtractionCandidate() + .isExtractionCandidate(), ) Assert.assertTrue( @@ -52,7 +52,7 @@ class QuestionnaireExtensionTest : RobolectricTest() { "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemExtractionContext" } } - .isExtractionCandidate() + .isExtractionCandidate(), ) } @@ -70,7 +70,7 @@ class QuestionnaireExtensionTest : RobolectricTest() { } } .cqfLibraryIds() - .first() + .first(), ) Assert.assertEquals( @@ -83,13 +83,12 @@ class QuestionnaireExtensionTest : RobolectricTest() { } } .cqfLibraryIds() - .first() + .first(), ) } @Test fun testShouldFindMatchingItems() { - val questionnaire = Questionnaire().apply { addItem().apply { @@ -117,7 +116,6 @@ class QuestionnaireExtensionTest : RobolectricTest() { @Test fun testShouldFindMatchingItemsByFieldType() { - val questionnaire = Questionnaire().apply { id = "12345" @@ -135,7 +133,7 @@ class QuestionnaireExtensionTest : RobolectricTest() { Questionnaire.QuestionnaireItemComponent().apply { type = Questionnaire.QuestionnaireItemType.DATE linkId = "q3-date" - } + }, ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ResourceExtensionTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ResourceExtensionTest.kt index 10032a076a..babfd98411 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ResourceExtensionTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ResourceExtensionTest.kt @@ -83,7 +83,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } } @@ -98,7 +98,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Kamau" given = listOf(StringType("Andrew")) - } + }, ) } } @@ -108,7 +108,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertNotNull(patient.birthDate) Assert.assertEquals( BooleanType(true).booleanValue(), - (patient.deceased as BooleanType).booleanValue() + (patient.deceased as BooleanType).booleanValue(), ) Assert.assertEquals("Kamau", patient.name[0].family) Assert.assertEquals("Andrew", patient.name[0].given[0].value) @@ -131,7 +131,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } } @@ -146,7 +146,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Kamau" given = listOf(StringType("Andrew")) - } + }, ) } } @@ -156,7 +156,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertNotNull(patient.birthDate) Assert.assertEquals( BooleanType(true).booleanValue(), - (patient.deceased as BooleanType).booleanValue() + (patient.deceased as BooleanType).booleanValue(), ) Assert.assertEquals("Kamau", patient.name[0].family) Assert.assertEquals("Andrew", patient.name[0].given[0].value) @@ -166,7 +166,6 @@ class ResourceExtensionTest : RobolectricTest() { @Test fun `Resource#updateFrom() should preserve previous patient's extensions`() { - val extensionVal = Extension() val extensionVal2 = Extension() extensionVal.apply { this.urlElement = UriType("hello") } @@ -187,7 +186,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } } @@ -202,7 +201,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Kamau" given = listOf(StringType("Andrew")) - } + }, ) } } @@ -212,7 +211,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertNotNull(patient.birthDate) Assert.assertEquals( BooleanType(true).booleanValue(), - (patient.deceased as BooleanType).booleanValue() + (patient.deceased as BooleanType).booleanValue(), ) Assert.assertEquals("Kamau", patient.name[0].family) Assert.assertEquals("Andrew", patient.name[0].given[0].value) @@ -221,7 +220,6 @@ class ResourceExtensionTest : RobolectricTest() { @Test fun `Resource#updateFrom() should preserve updated patient's extensions`() { - val extensionVal = Extension() val extensionVal2 = Extension() extensionVal.apply { this.urlElement = UriType("hello") } @@ -241,7 +239,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } } @@ -258,7 +256,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Kamau" given = listOf(StringType("Andrew")) - } + }, ) } } @@ -268,7 +266,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertNotNull(patient.birthDate) Assert.assertEquals( BooleanType(true).booleanValue(), - (patient.deceased as BooleanType).booleanValue() + (patient.deceased as BooleanType).booleanValue(), ) Assert.assertEquals("Kamau", patient.name[0].family) Assert.assertEquals("Andrew", patient.name[0].given[0].value) @@ -277,7 +275,6 @@ class ResourceExtensionTest : RobolectricTest() { @Test fun `Resource#updateFrom() should preserve both resource's extensions`() { - val extensionVal = Extension() val extensionVal2 = Extension() extensionVal.apply { this.urlElement = UriType("hello") } @@ -298,7 +295,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } } @@ -314,7 +311,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Kamau" given = listOf(StringType("Andrew")) - } + }, ) } } @@ -324,7 +321,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertNotNull(patient.birthDate) Assert.assertEquals( BooleanType(true).booleanValue(), - (patient.deceased as BooleanType).booleanValue() + (patient.deceased as BooleanType).booleanValue(), ) Assert.assertEquals("Kamau", patient.name[0].family) Assert.assertEquals("Andrew", patient.name[0].given[0].value) @@ -342,7 +339,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } } @@ -363,7 +360,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Kamau" given = listOf(StringType("Andrew")) - } + }, ) } } @@ -373,7 +370,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertNotNull(patient.birthDate) Assert.assertEquals( BooleanType(true).booleanValue(), - (patient.deceased as BooleanType).booleanValue() + (patient.deceased as BooleanType).booleanValue(), ) Assert.assertEquals("Kamau", patient.name[0].family) Assert.assertEquals("Andrew", patient.name[0].given[0].value) @@ -397,7 +394,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) } } @@ -418,7 +415,7 @@ class ResourceExtensionTest : RobolectricTest() { HumanName().apply { family = "Kamau" given = listOf(StringType("Andrew")) - } + }, ) } } @@ -428,7 +425,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertNotNull(patient.birthDate) Assert.assertEquals( BooleanType(true).booleanValue(), - (patient.deceased as BooleanType).booleanValue() + (patient.deceased as BooleanType).booleanValue(), ) Assert.assertEquals("Kamau", patient.name[0].family) Assert.assertEquals("Andrew", patient.name[0].given[0].value) @@ -480,7 +477,6 @@ class ResourceExtensionTest : RobolectricTest() { @Test fun `QuestionnaireResponse#getEncounterId() should return logicalId`() { - val questionnaireResponse = QuestionnaireResponse().apply { contained = listOf(Encounter().apply { id = "1234" }) } @@ -491,7 +487,6 @@ class ResourceExtensionTest : RobolectricTest() { @Test fun `QuestionnaireResponse#getEncounterId() replace# should return logicalId`() { - val questionnaireResponse = QuestionnaireResponse().apply { contained = listOf(Encounter().apply { id = "#1234" }) } @@ -502,7 +497,6 @@ class ResourceExtensionTest : RobolectricTest() { @Test fun `QuestionnaireResponse#getEncounterId() Id null should return empty id`() { - val questionnaireResponse = QuestionnaireResponse().apply { contained = listOf(Encounter()) } val id = questionnaireResponse.getEncounterId() @@ -532,7 +526,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertEquals("d", Coding("s", "c", "d").valueToString()) Assert.assertEquals( "d", - CodeableConcept().apply { addCoding(Coding("s", "c", "d")) }.valueToString() + CodeableConcept().apply { addCoding(Coding("s", "c", "d")) }.valueToString(), ) Assert.assertEquals( "3.4", @@ -541,7 +535,7 @@ class ResourceExtensionTest : RobolectricTest() { this.value = BigDecimal.valueOf(3.4) this.unit = "G" } - .valueToString() + .valueToString(), ) Assert.assertEquals( "8 Week (s)", @@ -550,7 +544,7 @@ class ResourceExtensionTest : RobolectricTest() { repeat.period = BigDecimal(8.0) repeat.periodUnit = Timing.UnitsOfTime.WK } - .valueToString() + .valueToString(), ) } @@ -573,7 +567,7 @@ class ResourceExtensionTest : RobolectricTest() { Questionnaire.QuestionnaireItemComponent().apply { text = "Group" type = Questionnaire.QuestionnaireItemType.GROUP - } + }, ) questionnaire.add( Questionnaire.QuestionnaireItemComponent().apply { @@ -584,9 +578,9 @@ class ResourceExtensionTest : RobolectricTest() { Extension().apply { url = photoCaptureExtensionUrl setValue(StringType().apply { value = photoCaptureExtensionName }) - } + }, ) - } + }, ) questionnaire.add( Questionnaire.QuestionnaireItemComponent().apply { @@ -597,9 +591,9 @@ class ResourceExtensionTest : RobolectricTest() { Extension().apply { url = barcodeExtensionUrl setValue(StringType().apply { value = barcodeExtensionName }) - } + }, ) - } + }, ) questionnaire.prepareQuestionsForReadingOrEditing("path", true) @@ -618,7 +612,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertEquals("d", Coding("s", "c", "d").valueToString()) Assert.assertEquals( "d", - CodeableConcept().apply { addCoding(Coding("s", "c", "d")) }.valueToString() + CodeableConcept().apply { addCoding(Coding("s", "c", "d")) }.valueToString(), ) Assert.assertEquals( "3.4", @@ -627,7 +621,7 @@ class ResourceExtensionTest : RobolectricTest() { this.value = BigDecimal.valueOf(3.4) this.unit = "G" } - .valueToString() + .valueToString(), ) } @@ -684,7 +678,6 @@ class ResourceExtensionTest : RobolectricTest() { @Test fun `CarePlanList#asBaseResources() should return correct Resource List`() { - val carePlan1 = CarePlan() carePlan1.id = "CarePlan/cp1" carePlan1.careTeam = listOf(Reference("Ref11"), Reference("Ref12")) @@ -703,7 +696,7 @@ class ResourceExtensionTest : RobolectricTest() { Assert.assertEquals(carePlan1.id, decodedCarePlans.get(0).id) Assert.assertEquals( carePlan2.careTeam.get(0).reference, - decodedCarePlans.get(1).careTeam.get(0).reference + decodedCarePlans.get(1).careTeam.get(0).reference, ) } @@ -722,7 +715,7 @@ class ResourceExtensionTest : RobolectricTest() { val otherLogicalId = "Group/0acda8c9-3fa3-40ae-abcd-7d1fba7098b4" Assert.assertEquals( "0acda8c9-3fa3-40ae-abcd-7d1fba7098b4", - otherLogicalId.extractLogicalIdUuid() + otherLogicalId.extractLogicalIdUuid(), ) } } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/TaskExtensionTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/TaskExtensionTest.kt index 4e4ca54c1e..b16134f1a4 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/TaskExtensionTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/TaskExtensionTest.kt @@ -31,13 +31,13 @@ class TaskExtensionTest { Coding().apply { system = "https://d-tree.org" code = "clinic-visit-task-order-3" - } + }, ) this.meta.addTag( Coding().apply { system = "https://d-tree.org" code = "guardian-visit" - } + }, ) this.reasonReference = Reference("Questionnaire/testtask1") } @@ -50,7 +50,7 @@ class TaskExtensionTest { Coding().apply { system = "https://d-tree.org" code = "clinic-visit-task-order-1" - } + }, ) this.reasonReference = Reference("Questionnaire/testtask2") } @@ -80,7 +80,7 @@ class TaskExtensionTest { Coding().apply { system = systemTag code = "clinic-visit-task-order-NAN" - } + }, ) } Assert.assertNull(task.clinicVisitOrder(systemTag)) @@ -95,7 +95,7 @@ class TaskExtensionTest { Coding().apply { system = systemTag code = "clinic-visit-task-order-34.2" - } + }, ) } Assert.assertEquals(34.2, task.clinicVisitOrder(systemTag)) @@ -110,7 +110,7 @@ class TaskExtensionTest { Coding().apply { system = systemTag code = "CLINIC_VISIT-TASK-ORDER_48.1" - } + }, ) } Assert.assertEquals(48.1, task.clinicVisitOrder(systemTag)) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ViewExtensionTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ViewExtensionTest.kt index b6d69d0ca6..bd42f5d14d 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ViewExtensionTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/extension/ViewExtensionTest.kt @@ -114,10 +114,10 @@ class ViewExtensionTest : RobolectricTest() { ReflectionHelpers.ClassParameter.from(EditText::class.java, editText), ReflectionHelpers.ClassParameter.from( DrawablePosition::class.java, - DrawablePosition.DRAWABLE_RIGHT + DrawablePosition.DRAWABLE_RIGHT, ), - ReflectionHelpers.ClassParameter.from(MotionEvent::class.java, mouseEvent) - ) + ReflectionHelpers.ClassParameter.from(MotionEvent::class.java, mouseEvent), + ), ) } @@ -136,10 +136,10 @@ class ViewExtensionTest : RobolectricTest() { ReflectionHelpers.ClassParameter.from(EditText::class.java, editText), ReflectionHelpers.ClassParameter.from( DrawablePosition::class.java, - DrawablePosition.DRAWABLE_LEFT + DrawablePosition.DRAWABLE_LEFT, ), - ReflectionHelpers.ClassParameter.from(MotionEvent::class.java, mouseEvent) - ) + ReflectionHelpers.ClassParameter.from(MotionEvent::class.java, mouseEvent), + ), ) } @@ -158,10 +158,10 @@ class ViewExtensionTest : RobolectricTest() { ReflectionHelpers.ClassParameter.from(EditText::class.java, editText), ReflectionHelpers.ClassParameter.from( DrawablePosition::class.java, - DrawablePosition.DRAWABLE_RIGHT + DrawablePosition.DRAWABLE_RIGHT, ), - ReflectionHelpers.ClassParameter.from(MotionEvent::class.java, mouseEvent) - ) + ReflectionHelpers.ClassParameter.from(MotionEvent::class.java, mouseEvent), + ), ) } @@ -180,10 +180,10 @@ class ViewExtensionTest : RobolectricTest() { ReflectionHelpers.ClassParameter.from(EditText::class.java, editText), ReflectionHelpers.ClassParameter.from( DrawablePosition::class.java, - DrawablePosition.DRAWABLE_LEFT + DrawablePosition.DRAWABLE_LEFT, ), - ReflectionHelpers.ClassParameter.from(MotionEvent::class.java, mouseEvent) - ) + ReflectionHelpers.ClassParameter.from(MotionEvent::class.java, mouseEvent), + ), ) } diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/fhirpath/FhirPathDataExtractorTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/fhirpath/FhirPathDataExtractorTest.kt index 22de767215..822ad78c1a 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/fhirpath/FhirPathDataExtractorTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/fhirpath/FhirPathDataExtractorTest.kt @@ -33,7 +33,7 @@ class FhirPathDataExtractorTest : RobolectricTest() { private val expressions = mapOf( Pair(patientDeceased, "Patient.deceased.exists()"), - Pair(familyName, "Patient.name.family & ' Family'") + Pair(familyName, "Patient.name.family & ' Family'"), ) @Test diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/helper/TransformSupportServicesTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/helper/TransformSupportServicesTest.kt index 44de026239..351c2484be 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/helper/TransformSupportServicesTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/helper/TransformSupportServicesTest.kt @@ -45,86 +45,87 @@ class TransformSupportServicesTest : RobolectricTest() { @Test fun `createType() should return RiskAssessmentPrediction when given RiskAssessment_Prediction`() { Assert.assertTrue( - transformSupportServices.createType("", "RiskAssessment_Prediction") is - RiskAssessment.RiskAssessmentPredictionComponent + transformSupportServices.createType("", "RiskAssessment_Prediction") + is RiskAssessment.RiskAssessmentPredictionComponent, ) } @Test fun `createType() should return ImmunizationProtocol when given Immunization_VaccinationProtocol`() { Assert.assertTrue( - transformSupportServices.createType("", "Immunization_VaccinationProtocol") is - Immunization.ImmunizationProtocolAppliedComponent + transformSupportServices.createType("", "Immunization_VaccinationProtocol") + is Immunization.ImmunizationProtocolAppliedComponent, ) } @Test fun `createType() should return ImmunizationReaction when given Immunization_Reaction`() { Assert.assertTrue( - transformSupportServices.createType("", "Immunization_Reaction") is - Immunization.ImmunizationReactionComponent + transformSupportServices.createType("", "Immunization_Reaction") + is Immunization.ImmunizationReactionComponent, ) } @Test fun `createType() should return Diagnosis when given EpisodeOfCare_Diagnosis`() { Assert.assertTrue( - transformSupportServices.createType("", "EpisodeOfCare_Diagnosis") is - EpisodeOfCare.DiagnosisComponent + transformSupportServices.createType("", "EpisodeOfCare_Diagnosis") + is EpisodeOfCare.DiagnosisComponent, ) } @Test fun `createType() should return Diagnosis when given Encounter_Diagnosis`() { Assert.assertTrue( - transformSupportServices.createType("", "Encounter_Diagnosis") is Encounter.DiagnosisComponent + transformSupportServices.createType("", "Encounter_Diagnosis") + is Encounter.DiagnosisComponent, ) } @Test fun `createType() should return EncounterParticipant when given Encounter_Participant`() { Assert.assertTrue( - transformSupportServices.createType("", "Encounter_Participant") is - Encounter.EncounterParticipantComponent + transformSupportServices.createType("", "Encounter_Participant") + is Encounter.EncounterParticipantComponent, ) } @Test fun `createType() should return CarePlanActivity when given CarePlan_Activity`() { Assert.assertTrue( - transformSupportServices.createType("", "CarePlan_Activity") is - CarePlan.CarePlanActivityComponent + transformSupportServices.createType("", "CarePlan_Activity") + is CarePlan.CarePlanActivityComponent, ) } @Test fun `createType() should return CarePlanActivityDetail when given CarePlan_ActivityDetail`() { Assert.assertTrue( - transformSupportServices.createType("", "CarePlan_ActivityDetail") is - CarePlan.CarePlanActivityDetailComponent + transformSupportServices.createType("", "CarePlan_ActivityDetail") + is CarePlan.CarePlanActivityDetailComponent, ) } @Test fun `createType() should return PatientLink when given Patient_Link`() { Assert.assertTrue( - transformSupportServices.createType("", "Patient_Link") is Patient.PatientLinkComponent + transformSupportServices.createType("", "Patient_Link") is Patient.PatientLinkComponent, ) } @Test fun `createType() should return GroupCharacteristicComponent when given Group_Characteristic`() { Assert.assertTrue( - transformSupportServices.createType("", "Group_Characteristic") is - Group.GroupCharacteristicComponent + transformSupportServices.createType("", "Group_Characteristic") + is Group.GroupCharacteristicComponent, ) } @Test fun `createType() should return AppointmentParticipantComponent when given Appointment_Participant`() { Assert.assertTrue( - transformSupportServices.createType("", "Appointment_Participant") is - Appointment.AppointmentParticipantComponent + transformSupportServices.createType("", "Appointment_Participant") + is Appointment.AppointmentParticipantComponent, ) } diff --git a/android/quest/build.gradle.kts b/android/quest/build.gradle.kts index f728792340..532508db7b 100644 --- a/android/quest/build.gradle.kts +++ b/android/quest/build.gradle.kts @@ -1,229 +1,235 @@ plugins { - `fhir-properties` - `fhir-jacoco-report` - id("com.android.application") - id("kotlin-android") - id("kotlin-kapt") - id("de.mannodermaus.android-junit5") version "1.9.3.0" - id("org.jetbrains.dokka") - id("org.jetbrains.kotlin.plugin.serialization") - id("dagger.hilt.android.plugin") - id("org.jetbrains.kotlin.android") - id("com.google.firebase.firebase-perf") - id("com.google.gms.google-services") - id("com.google.firebase.crashlytics") + `fhir-properties` + `fhir-jacoco-report` + id("com.android.application") + id("kotlin-android") + id("kotlin-kapt") + id("de.mannodermaus.android-junit5") version "1.9.3.0" + id("org.jetbrains.dokka") + id("org.jetbrains.kotlin.plugin.serialization") + id("dagger.hilt.android.plugin") + id("org.jetbrains.kotlin.android") + id("com.google.firebase.firebase-perf") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") } -kotlin { - jvmToolchain(17) -} +kotlin { jvmToolchain(17) } android { - namespace = "org.smartregister.fhircore.quest" - compileSdk = Deps.sdk_versions.compile_sdk - - dataBinding { - enable = true + namespace = "org.smartregister.fhircore.quest" + compileSdk = Deps.sdk_versions.compile_sdk + + dataBinding { enable = true } + + defaultConfig { + applicationId = "org.smartregister.fhircore" + minSdk = Deps.sdk_versions.min_sdk + versionCode = 4 + versionName = "0.0.4" + multiDexEnabled = true + + buildConfigField("boolean", "SKIP_AUTH_CHECK", "false") + buildConfigField("String", "FHIR_BASE_URL", """"${project.extra["FHIR_BASE_URL"]}"""") + buildConfigField("String", "OAUTH_BASE_URL", """"${project.extra["OAUTH_BASE_URL"]}"""") + buildConfigField("String", "OAUTH_CIENT_ID", """"${project.extra["OAUTH_CIENT_ID"]}"""") + buildConfigField( + "String", + "OAUTH_CLIENT_SECRET", + """"${project.extra["OAUTH_CLIENT_SECRET"]}"""", + ) + buildConfigField("String", "OAUTH_SCOPE", """"${project.extra["OAUTH_SCOPE"]}"""") + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + create("release") { + enableV1Signing = false + enableV2Signing = true + + keyAlias = System.getenv("KEYSTORE_ALIAS") ?: """${project.extra["KEYSTORE_ALIAS"]}""" + keyPassword = System.getenv("KEY_PASSWORD") ?: """${project.extra["KEY_PASSWORD"]}""" + storePassword = + System.getenv("KEYSTORE_PASSWORD") ?: """${project.extra["KEYSTORE_PASSWORD"]}""" + storeFile = file(System.getProperty("user.home") + "/fhircore.keystore.jks") } - - defaultConfig { - applicationId = "org.smartregister.fhircore" - minSdk = Deps.sdk_versions.min_sdk - versionCode = 4 - versionName = "0.0.4" - multiDexEnabled = true - - buildConfigField("boolean", "SKIP_AUTH_CHECK", "false") - buildConfigField("String", "FHIR_BASE_URL", """"${project.extra["FHIR_BASE_URL"]}"""") - buildConfigField("String", "OAUTH_BASE_URL", """"${project.extra["OAUTH_BASE_URL"]}"""") - buildConfigField("String", "OAUTH_CIENT_ID", """"${project.extra["OAUTH_CIENT_ID"]}"""") - buildConfigField("String", "OAUTH_CLIENT_SECRET", """"${project.extra["OAUTH_CLIENT_SECRET"]}"""") - buildConfigField("String", "OAUTH_SCOPE", """"${project.extra["OAUTH_SCOPE"]}"""") - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + debug { enableUnitTestCoverage = true } + release { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + signingConfig = signingConfigs.getByName("release") + // firebaseCrashlytics { + // isNativeSymbolUploadEnabled = false + // } } - - signingConfigs { - create("release") { - enableV1Signing = false - enableV2Signing = true - - keyAlias = System.getenv("KEYSTORE_ALIAS") ?: """${project.extra["KEYSTORE_ALIAS"]}""" - keyPassword = System.getenv("KEY_PASSWORD") ?: """${project.extra["KEY_PASSWORD"]}""" - storePassword = - System.getenv("KEYSTORE_PASSWORD") ?: """${project.extra["KEYSTORE_PASSWORD"]}""" - storeFile = file(System.getProperty("user.home") + "/fhircore.keystore.jks") - } + } + packaging { + resources { + excludes += + listOf( + "META-INF/ASL-2.0.txt", + "META-INF/LGPL-3.0.txt", + "license.html", + "readme.html", + "META-INF/DEPENDENCIES", + "META-INF/LICENSE", + "META-INF/LICENSE.txt", + "META-INF/license.txt", + "META-INF/license.html", + "META-INF/LICENSE.md", + "META-INF/NOTICE", + "META-INF/NOTICE.txt", + "META-INF/NOTICE.md", + "META-INF/notice.txt", + "META-INF/ASL2.0", + "META-INF/ASL-2.0.txt", + "META-INF/LGPL-3.0.txt", + "META-INF/sun-jaxb.episode", + "META-INF/*.kotlin_module", + "META-INF/AL2.0", + "META-INF/LGPL2.1", + ) } + } - buildTypes { - debug { - enableUnitTestCoverage = true - } - release { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - signingConfig = signingConfigs.getByName("release") -// firebaseCrashlytics { -// isNativeSymbolUploadEnabled = false -// } - } - } - packaging { - resources { - excludes += listOf("META-INF/ASL-2.0.txt", "META-INF/LGPL-3.0.txt", "license.html", "readme.html", "META-INF/DEPENDENCIES", "META-INF/LICENSE", "META-INF/LICENSE.txt", "META-INF/license.txt", "META-INF/license.html", "META-INF/LICENSE.md", "META-INF/NOTICE", "META-INF/NOTICE.txt", "META-INF/NOTICE.md", "META-INF/notice.txt", "META-INF/ASL2.0", "META-INF/ASL-2.0.txt", "META-INF/LGPL-3.0.txt", "META-INF/sun-jaxb.episode", "META-INF/*.kotlin_module", "META-INF/AL2.0", "META-INF/LGPL2.1") - } - } + compileOptions { isCoreLibraryDesugaringEnabled = true } + kotlinOptions { + freeCompilerArgs = listOf("-Xjvm-default=all-compatibility", "-opt-in=kotlin.RequiresOptIn") + } - compileOptions { - isCoreLibraryDesugaringEnabled = true - } + buildFeatures { + compose = true + viewBinding = true + buildConfig = true + } - kotlinOptions { - freeCompilerArgs = listOf("-Xjvm-default=all-compatibility", "-opt-in=kotlin.RequiresOptIn") - } + composeOptions { kotlinCompilerExtensionVersion = "1.4.8" } - buildFeatures { - compose = true - viewBinding = true - buildConfig = true - } + testOptions { + execution = "ANDROIDX_TEST_ORCHESTRATOR" + animationsDisabled = true - composeOptions { - kotlinCompilerExtensionVersion = "1.4.8" + unitTests { + isIncludeAndroidResources = true + isReturnDefaultValues = true } + } - testOptions { - execution = "ANDROIDX_TEST_ORCHESTRATOR" - animationsDisabled = true + flavorDimensions += "apps" - unitTests { - isIncludeAndroidResources = true - isReturnDefaultValues = true - } + productFlavors { + create("quest") { + dimension = "apps" + applicationIdSuffix = ".quest" + versionNameSuffix = "-quest" + isDefault = true } - - - flavorDimensions += "apps" - - productFlavors { - create("quest") { - dimension = "apps" - applicationIdSuffix = ".quest" - versionNameSuffix = "-quest" - isDefault = true - } - create("ecbis") { - dimension = "apps" - applicationIdSuffix = ".ecbis" - versionNameSuffix = "-ecbis" - versionCode = 3 - versionName = "0.0.6" - } - create("g6pd") { - dimension = "apps" - applicationIdSuffix = ".g6pd" - versionNameSuffix = "-g6pd" - } - create("mwcore") { - dimension = "apps" - applicationIdSuffix = ".mwcore" - versionNameSuffix = "-mwcore" - versionCode = 32 - versionName = "0.1.22" - } - create("mwcoreDev") { - dimension = "apps" - applicationIdSuffix = ".mwcoreDev" - versionNameSuffix = "-mwcoreDev" - versionCode = 32 - versionName = "0.1.22" - } - create("mwcoreProd") { - dimension = "apps" - applicationIdSuffix = ".mwcoreProd" - versionNameSuffix = "-mwcoreProd" - versionCode = 10 - versionName = "0.1.0" - } - create("afyayangu") { - dimension = "apps" - applicationIdSuffix = ".afyayangu" - versionNameSuffix = "-afyayangu" - versionCode = 1 - versionName = "0.0.1" - } + create("ecbis") { + dimension = "apps" + applicationIdSuffix = ".ecbis" + versionNameSuffix = "-ecbis" + versionCode = 3 + versionName = "0.0.6" } - - lint { - abortOnError = false + create("g6pd") { + dimension = "apps" + applicationIdSuffix = ".g6pd" + versionNameSuffix = "-g6pd" } - - configurations.configureEach { - resolutionStrategy { - force("ca.uhn.hapi.fhir:org.hl7.fhir.utilities:5.5.7") - } + create("mwcore") { + dimension = "apps" + applicationIdSuffix = ".mwcore" + versionNameSuffix = "-mwcore" + versionCode = 32 + versionName = "0.1.22" + } + create("mwcoreDev") { + dimension = "apps" + applicationIdSuffix = ".mwcoreDev" + versionNameSuffix = "-mwcoreDev" + versionCode = 32 + versionName = "0.1.22" + } + create("mwcoreProd") { + dimension = "apps" + applicationIdSuffix = ".mwcoreProd" + versionNameSuffix = "-mwcoreProd" + versionCode = 10 + versionName = "0.1.0" } + create("afyayangu") { + dimension = "apps" + applicationIdSuffix = ".afyayangu" + versionNameSuffix = "-afyayangu" + versionCode = 1 + versionName = "0.0.1" + } + } + + lint { abortOnError = false } - testCoverage { jacocoVersion = Deps.versions.jacoco_tool } + configurations.configureEach { + resolutionStrategy { force("ca.uhn.hapi.fhir:org.hl7.fhir.utilities:5.5.7") } + } + testCoverage { jacocoVersion = Deps.versions.jacoco_tool } } dependencies { - coreLibraryDesugaring(Deps.desugar) - implementation(project(":engine")) - implementation("androidx.ui:ui-foundation:0.1.0-dev14") - implementation("org.smartregister:p2p-lib:0.3.0-SNAPSHOT") - implementation("org.smartregister:fhir-common-utils:0.0.6-SNAPSHOT") - implementation(Deps.accompanist.swiperefresh) - - implementation("com.github.anrwatchdog:anrwatchdog:1.4.0") - - //Hilt - Dependency Injection - implementation("com.google.dagger:hilt-android:${Deps.versions.hiltVersion}") - kapt("com.google.dagger:hilt-compiler:${Deps.versions.hiltVersion}") - - testImplementation(Deps.junit5_api) - testRuntimeOnly(Deps.junit5_engine) - testRuntimeOnly(Deps.junit5_engine_vintage) - testImplementation(Deps.robolectric) - testImplementation(Deps.atsl.core) - testImplementation(Deps.atsl.ext_junit) - testImplementation(Deps.atsl.ext_junit_ktx) - testImplementation(Deps.coroutines.test) - testImplementation(Deps.androidx.core_test) - debugImplementation(Deps.fragment_testing) - releaseImplementation(Deps.fragment_testing) - testImplementation(Deps.mockk) - testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3") - - // analytics - implementation(platform("com.google.firebase:firebase-bom:31.2.0")) - - implementation("com.google.firebase:firebase-perf-ktx") - implementation("com.google.firebase:firebase-crashlytics-ktx") - implementation("com.google.firebase:firebase-analytics-ktx") - - // Hilt test dependencies - testImplementation("com.google.dagger:hilt-android-testing:${Deps.versions.hiltVersion}") - kaptTest("com.google.dagger:hilt-android-compiler:${Deps.versions.hiltVersion}") - - androidTestImplementation(Deps.atsl.ext_junit) - androidTestImplementation(Deps.atsl.espresso) - val composeVersion = Deps.versions.compose - debugImplementation("androidx.compose.ui:ui-test-manifest:$composeVersion") - testImplementation("androidx.compose.ui:ui-test-junit4:$composeVersion") -// debugImplementation because LeakCanary should only run in debug builds. -// debugImplementation "com.squareup.leakcanary:leakcanary-android:2.7" - - testImplementation("info.cqframework:cql-to-elm:1.5.6") + coreLibraryDesugaring(Deps.desugar) + implementation(project(":engine")) + implementation("androidx.ui:ui-foundation:0.1.0-dev14") + implementation("org.smartregister:p2p-lib:0.3.0-SNAPSHOT") + implementation("org.smartregister:fhir-common-utils:0.0.6-SNAPSHOT") + implementation(Deps.accompanist.swiperefresh) + + implementation("com.github.anrwatchdog:anrwatchdog:1.4.0") + + // Hilt - Dependency Injection + implementation("com.google.dagger:hilt-android:${Deps.versions.hiltVersion}") + kapt("com.google.dagger:hilt-compiler:${Deps.versions.hiltVersion}") + + testImplementation(Deps.junit5_api) + testRuntimeOnly(Deps.junit5_engine) + testRuntimeOnly(Deps.junit5_engine_vintage) + testImplementation(Deps.robolectric) + testImplementation(Deps.atsl.core) + testImplementation(Deps.atsl.ext_junit) + testImplementation(Deps.atsl.ext_junit_ktx) + testImplementation(Deps.coroutines.test) + testImplementation(Deps.androidx.core_test) + debugImplementation(Deps.fragment_testing) + releaseImplementation(Deps.fragment_testing) + testImplementation(Deps.mockk) + testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3") + + // analytics + implementation(platform("com.google.firebase:firebase-bom:31.2.0")) + + implementation("com.google.firebase:firebase-perf-ktx") + implementation("com.google.firebase:firebase-crashlytics-ktx") + implementation("com.google.firebase:firebase-analytics-ktx") + + // Hilt test dependencies + testImplementation("com.google.dagger:hilt-android-testing:${Deps.versions.hiltVersion}") + kaptTest("com.google.dagger:hilt-android-compiler:${Deps.versions.hiltVersion}") + + androidTestImplementation(Deps.atsl.ext_junit) + androidTestImplementation(Deps.atsl.espresso) + val composeVersion = Deps.versions.compose + debugImplementation("androidx.compose.ui:ui-test-manifest:$composeVersion") + testImplementation("androidx.compose.ui:ui-test-junit4:$composeVersion") + // debugImplementation because LeakCanary should only run in debug builds. + // debugImplementation "com.squareup.leakcanary:leakcanary-android:2.7" + + testImplementation("info.cqframework:cql-to-elm:1.5.6") } -kapt { - correctErrorTypes = true -} +kapt { correctErrorTypes = true } -hilt { - enableAggregatingTask = true -} +hilt { enableAggregatingTask = true } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/QuestApplication.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/QuestApplication.kt index 606a8a18a8..177cffc618 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/QuestApplication.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/QuestApplication.kt @@ -68,7 +68,7 @@ class QuestApplication : listOfNotNull( LoginActivity::class.java.name, AppSettingActivity::class.java.name, - launcherActivityName + launcherActivityName, ) } @@ -117,7 +117,7 @@ class QuestApplication : override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} override fun onActivityDestroyed(activity: Activity) {} - } + }, ) ProcessLifecycleOwner.get().lifecycle.addObserver(this@QuestApplication) } @@ -129,7 +129,7 @@ class QuestApplication : urlResolver = referenceUrlResolver, xFhirQueryResolver = xFhirQueryResolver, questionnaireItemViewHolderFactoryMatchersProviderFactory = - QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl + QuestionnaireItemViewHolderFactoryMatchersProviderFactoryImpl, ) return configuration as DataCaptureConfig } @@ -150,10 +150,11 @@ class QuestApplication : mForegroundActivityContext?.getActivity()?.run { this.startActivity( Intent(this, LoginActivity::class.java).apply { - accountAuthenticator.retrieveLastLoggedInUsername()?.takeIf { it.isNotBlank() }?.let { - putExtra(AccountManager.KEY_ACCOUNT_NAME, it) - } - } + accountAuthenticator + .retrieveLastLoggedInUsername() + ?.takeIf { it.isNotBlank() } + ?.let { putExtra(AccountManager.KEY_ACCOUNT_NAME, it) } + }, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/QuestConfigService.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/QuestConfigService.kt index 0cc5b1d091..cf5d603ffb 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/QuestConfigService.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/QuestConfigService.kt @@ -37,7 +37,7 @@ class QuestConfigService @Inject constructor(@ApplicationContext val context: Co oauthServerBaseUrl = BuildConfig.OAUTH_BASE_URL, clientId = BuildConfig.OAUTH_CIENT_ID, clientSecret = BuildConfig.OAUTH_CLIENT_SECRET, - accountType = context.getString(R.string.authenticator_account_type) + accountType = context.getString(R.string.authenticator_account_type), ) override fun defineResourceTags() = @@ -48,7 +48,7 @@ class QuestConfigService @Inject constructor(@ApplicationContext val context: Co Coding().apply { system = context.getString(R.string.sync_strategy_careteam_system) display = context.getString(R.string.sync_strategy_careteam_display) - } + }, ), ResourceTag( type = ResourceType.Location.name, @@ -56,7 +56,7 @@ class QuestConfigService @Inject constructor(@ApplicationContext val context: Co Coding().apply { system = context.getString(R.string.sync_strategy_location_system) display = context.getString(R.string.sync_strategy_location_display) - } + }, ), ResourceTag( type = ResourceType.Organization.name, @@ -64,7 +64,7 @@ class QuestConfigService @Inject constructor(@ApplicationContext val context: Co Coding().apply { system = context.getString(R.string.sync_strategy_organization_system) display = context.getString(R.string.sync_strategy_organization_display) - } + }, ), ResourceTag( type = SharedPreferenceKey.PRACTITIONER_ID.name, @@ -73,7 +73,7 @@ class QuestConfigService @Inject constructor(@ApplicationContext val context: Co system = context.getString(R.string.sync_strategy_practitioner_system) display = context.getString(R.string.sync_strategy_practitioner_display) }, - isResource = false + isResource = false, ), ResourceTag( type = SharedPreferenceKey.APP_ID.name, @@ -82,7 +82,7 @@ class QuestConfigService @Inject constructor(@ApplicationContext val context: Co system = context.getString(R.string.sync_strategy_appid_system) display = context.getString(R.string.application_id) }, - isResource = false - ) + isResource = false, + ), ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/DataDetailsListViewConfiguration.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/DataDetailsListViewConfiguration.kt index a3663158ff..4b22cf0e3e 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/DataDetailsListViewConfiguration.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/DataDetailsListViewConfiguration.kt @@ -31,7 +31,7 @@ data class DataDetailsListViewConfiguration( val dataRowClickable: Boolean = true, val dynamicRows: List> = listOf(), val questionnaireFilter: SearchFilter? = null, - val questionnaireFieldsFilter: List = listOf() + val questionnaireFieldsFilter: List = listOf(), ) : Configuration @Stable @@ -43,7 +43,7 @@ fun dataDetailsListViewConfigurationOf( dataRowClickable: Boolean = true, dynamicRows: List> = mutableListOf(), questionnaireFilter: SearchFilter? = null, - questionnaireFieldsFilter: List = listOf() + questionnaireFieldsFilter: List = listOf(), ) = DataDetailsListViewConfiguration( appId = appId, @@ -53,5 +53,5 @@ fun dataDetailsListViewConfigurationOf( dataRowClickable = dataRowClickable, dynamicRows = dynamicRows, questionnaireFilter = questionnaireFilter, - questionnaireFieldsFilter = questionnaireFieldsFilter + questionnaireFieldsFilter = questionnaireFieldsFilter, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/DetailViewConfiguration.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/DetailViewConfiguration.kt index 220f306401..4d9ed2009f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/DetailViewConfiguration.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/DetailViewConfiguration.kt @@ -26,7 +26,7 @@ class DetailViewConfiguration( override val appId: String = "", override val classification: String = "", val label: String = "", - val rows: List = listOf() + val rows: List = listOf(), ) : Configuration @Stable @Serializable class DetailViewRowConfiguration(val filters: List) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/PatientRegisterRowViewConfiguration.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/PatientRegisterRowViewConfiguration.kt index 7bf16ab1a0..f336a28a2c 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/PatientRegisterRowViewConfiguration.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/PatientRegisterRowViewConfiguration.kt @@ -29,7 +29,7 @@ import org.smartregister.fhircore.engine.configuration.Configuration class PatientRegisterRowViewConfiguration( override val appId: String = "", override val classification: String = "", - val filters: List? = null + val filters: List? = null, ) : Configuration @Stable @@ -45,7 +45,7 @@ data class Filter( val valueCoding: Code? = null, val valueString: String? = null, val dynamicColors: List? = null, - val properties: Properties? = null + val properties: Properties? = null, ) @Stable @@ -55,7 +55,7 @@ data class QuestionnaireItemFilter( val label: String? = null, val index: Int? = null, val dynamicColors: List? = null, - val properties: Properties? = null + val properties: Properties? = null, ) @Stable @@ -73,7 +73,7 @@ data class Properties( val label: Property? = null, val value: Property? = null, val valueFormatter: Map? = null, - val labelDirection: Direction = Direction.LEFT + val labelDirection: Direction = Direction.LEFT, ) @Stable @@ -81,7 +81,7 @@ data class Properties( data class Property( val color: String? = null, val textSize: Int? = null, - val fontWeight: FontWeight? = FontWeight.NORMAL + val fontWeight: FontWeight? = FontWeight.NORMAL, ) @Stable @Serializable data class DynamicColor(val valueEqual: String, val useColor: String) @@ -89,5 +89,5 @@ data class Property( enum class FontWeight(val weight: Int) { LIGHT(300), NORMAL(400), - BOLD(700) + BOLD(700), } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/QuestBottomNavigationActions.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/QuestBottomNavigationActions.kt index a0040270f0..2f46270fec 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/QuestBottomNavigationActions.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/QuestBottomNavigationActions.kt @@ -35,7 +35,7 @@ data class ActionSwitchFragment( val tag: String, val isRegisterFragment: Boolean, val isFilterVisible: Boolean, - val toolbarTitle: String? + val toolbarTitle: String?, ) : NavigationAction @Serializable diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/ResultDetailsNavigationConfiguration.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/ResultDetailsNavigationConfiguration.kt index f6d2d74e34..d9d3d9383b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/ResultDetailsNavigationConfiguration.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/configuration/view/ResultDetailsNavigationConfiguration.kt @@ -32,5 +32,5 @@ data class TestDetailsNavigationAction(val form: String, val readOnly: Boolean) data class ResultDetailsNavigationConfiguration( override val appId: String = "", override val classification: String = "", - val navigationOptions: List = listOf() + val navigationOptions: List = listOf(), ) : Configuration diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/generic/BasePagingSource.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/generic/BasePagingSource.kt index fd61b1beab..534afb2996 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/generic/BasePagingSource.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/generic/BasePagingSource.kt @@ -47,9 +47,9 @@ class BasePagingSource(private val block: suspend (Int) -> List) : fun createPager( pageSize: Int, enablePlaceholders: Boolean = false, - block: suspend (Int) -> List + block: suspend (Int) -> List, ): Pager = Pager( config = PagingConfig(enablePlaceholders = enablePlaceholders, pageSize = pageSize), - pagingSourceFactory = { BasePagingSource(block) } + pagingSourceFactory = { BasePagingSource(block) }, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/HivPatientGuardianRepository.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/HivPatientGuardianRepository.kt index 1155c91c16..515024f378 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/HivPatientGuardianRepository.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/HivPatientGuardianRepository.kt @@ -27,7 +27,7 @@ class HivPatientGuardianRepository @Inject constructor( @HivPatient private val patientDao: PatientDao, - private val dispatcherProvider: DispatcherProvider + private val dispatcherProvider: DispatcherProvider, ) { suspend fun loadPatient(patientId: String) = diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/PatientRepository.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/PatientRepository.kt index 08d3137721..cd217db963 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/PatientRepository.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/PatientRepository.kt @@ -77,13 +77,13 @@ constructor( override val fhirEngine: FhirEngine, override val dataMapper: PatientItemMapper, private val dispatcherProvider: DispatcherProvider, - val configurationRegistry: ConfigurationRegistry + val configurationRegistry: ConfigurationRegistry, ) : RegisterRepository { override suspend fun loadData( query: String, pageNumber: Int, - loadAll: Boolean + loadAll: Boolean, ): List { return withContext(dispatcherProvider.io()) { val patients = @@ -95,7 +95,7 @@ constructor( { modifier = StringFilterModifier.CONTAINS value = query.trim() - } + }, ) } sort(Patient.NAME, Order.ASCENDING) @@ -103,12 +103,14 @@ constructor( from = pageNumber * PaginationConstant.DEFAULT_PAGE_SIZE } - patients.map { it.resource }.map { - val patientItem = dataMapper.transformInputToOutputModel(it) - patientItem.additionalData = - loadAdditionalData(patientItem.id, configurationRegistry, fhirEngine) - patientItem - } + patients + .map { it.resource } + .map { + val patientItem = dataMapper.transformInputToOutputModel(it) + patientItem.additionalData = + loadAdditionalData(patientItem.id, configurationRegistry, fhirEngine) + patientItem + } } } @@ -122,7 +124,7 @@ constructor( subjectId: String, subjectType: ResourceType, forms: List, - config: DataDetailsListViewConfiguration + config: DataDetailsListViewConfiguration, ): List { return withContext(dispatcherProvider.io()) { val testResults = mutableListOf() @@ -142,7 +144,7 @@ constructor( suspend fun getResultItem( questionnaire: Questionnaire, questionnaireResponse: QuestionnaireResponse, - patientDetailsViewConfiguration: DataDetailsListViewConfiguration + patientDetailsViewConfiguration: DataDetailsListViewConfiguration, ): QuestResultItem { val data: MutableList> = mutableListOf() @@ -151,12 +153,11 @@ constructor( data.add( listOf( AdditionalData(value = fetchResultItemLabel(questionnaire)), - AdditionalData(value = " (${questionnaireResponse.authored?.asDdMmmYyyy() ?: ""})") - ) + AdditionalData(value = " (${questionnaireResponse.authored?.asDdMmmYyyy() ?: ""})"), + ), ) } else -> { - val reference = questionnaireResponse.getEncounterId()?.let { loadEncounter(it) } ?: questionnaireResponse @@ -183,8 +184,8 @@ constructor( value = value.valueToString(), valuePrefix = filter.valuePrefix, valuePostfix = filter.valuePostfix, - properties = filter.properties - ) + properties = filter.properties, + ), ) } data.add(additionalDataList) @@ -192,33 +193,34 @@ constructor( } } - patientDetailsViewConfiguration.questionnaireFieldsFilter.groupBy { it.index }.forEach { - it - .value - .mapNotNull { f -> - questionnaireResponse.find(f.key)?.let { - AdditionalData( - label = f.label ?: it.asLabel(), - value = it.answerFirstRep.value.valueToString() - ) + patientDetailsViewConfiguration.questionnaireFieldsFilter + .groupBy { it.index } + .forEach { + it.value + .mapNotNull { f -> + questionnaireResponse.find(f.key)?.let { + AdditionalData( + label = f.label ?: it.asLabel(), + value = it.answerFirstRep.value.valueToString(), + ) + } } - } - .takeIf { it.isNotEmpty() } - ?.run { data.add(it.key ?: data.size, this) } - } + .takeIf { it.isNotEmpty() } + ?.run { data.add(it.key ?: data.size, this) } + } val questSourceQRItem = QuestionnaireResponseItem( logicalId = questionnaireResponse.logicalId, authored = questionnaireResponse.authored, encounterId = questionnaireResponse.getEncounterId(), - questionnaireResponseString = questionnaireResponse.encodeResourceToString() + questionnaireResponseString = questionnaireResponse.encodeResourceToString(), ) val questSourceQuestionnaireItem = QuestionnaireItem( logicalId = questionnaire.logicalId, name = questionnaire.name, - title = questionnaire.title + title = questionnaire.title, ) return QuestResultItem(Pair(questSourceQRItem, questSourceQuestionnaireItem), data) @@ -226,11 +228,11 @@ constructor( suspend fun getCondition(reference: Resource, filter: Filter?) = getSearchResults( - reference.referenceValue(), - reference.referenceParamForCondition(), - filter, - fhirEngine - ) + reference.referenceValue(), + reference.referenceParamForCondition(), + filter, + fhirEngine, + ) .sortedByDescending { if (it.hasOnsetDateTimeType()) it.onsetDateTimeType.value else it.recordedDate } @@ -238,11 +240,11 @@ constructor( suspend fun getObservation(reference: Resource, filter: Filter?) = getSearchResults( - reference.referenceValue(), - reference.referenceParamForObservation(), - filter, - fhirEngine - ) + reference.referenceValue(), + reference.referenceParamForObservation(), + filter, + fhirEngine, + ) .sortedByDescending { if (it.hasEffectiveDateTimeType()) it.effectiveDateTimeType.value else it.meta.lastUpdated } @@ -250,17 +252,18 @@ constructor( suspend fun getMedicationRequest(reference: Resource, filter: Filter?) = getSearchResults( - reference.referenceValue(), - MedicationRequest.ENCOUNTER, - filter, - fhirEngine - ) + reference.referenceValue(), + MedicationRequest.ENCOUNTER, + filter, + fhirEngine, + ) .sortedByDescending { it.authoredOn } .sortedByDescending { it.logicalId } fun fetchResultItemLabel(questionnaire: Questionnaire): String { return questionnaire.titleElement.getLocalizedText() - ?: questionnaire.nameElement.getLocalizedText() ?: questionnaire.logicalId + ?: questionnaire.nameElement.getLocalizedText() + ?: questionnaire.logicalId } suspend fun getQuestionnaire(questionnaireResponse: QuestionnaireResponse): Questionnaire { @@ -268,8 +271,8 @@ constructor( questionnaireResponse.questionnaire.isNullOrBlank() -> { Timber.e( Exception( - "Cannot open QuestionnaireResponse because QuestionnaireResponse.questionnaire is null" - ) + "Cannot open QuestionnaireResponse because QuestionnaireResponse.questionnaire is null", + ), ) Questionnaire() } @@ -282,8 +285,8 @@ constructor( else -> { Timber.e( Exception( - "Cannot open QuestionnaireResponse because QuestionnaireResponse.questionnaire is null" - ) + "Cannot open QuestionnaireResponse because QuestionnaireResponse.questionnaire is null", + ), ) Questionnaire() } @@ -301,7 +304,7 @@ constructor( private suspend fun searchQuestionnaireResponses( subjectId: String, subjectType: ResourceType, - forms: List + forms: List, ): List = mutableListOf().also { result -> forms.forEach { @@ -311,10 +314,10 @@ constructor( filter(QuestionnaireResponse.SUBJECT, { value = "${subjectType.name}/$subjectId" }) filter( QuestionnaireResponse.QUESTIONNAIRE, - { value = "Questionnaire/${it.identifier}" } + { value = "Questionnaire/${it.identifier}" }, ) } - .map { it.resource } + .map { it.resource }, ) } } @@ -325,18 +328,22 @@ constructor( fhirEngine.search { filter( Questionnaire.CONTEXT, - { value = of(CodeableConcept().apply { addCoding(filter.valueCoding!!.asCoding()) }) } + { value = of(CodeableConcept().apply { addCoding(filter.valueCoding!!.asCoding()) }) }, ) } - result.map { it.resource }.map { - QuestionnaireConfig( - form = it.nameElement.getLocalizedText() ?: it.logicalId, - title = it.titleElement.getLocalizedText() - ?: it.nameElement.getLocalizedText() ?: it.logicalId, - identifier = it.logicalId - ) - } + result + .map { it.resource } + .map { + QuestionnaireConfig( + form = it.nameElement.getLocalizedText() ?: it.logicalId, + title = + it.titleElement.getLocalizedText() + ?: it.nameElement.getLocalizedText() + ?: it.logicalId, + identifier = it.logicalId, + ) + } } suspend fun fetchDemographicsWithAdditionalData(patientId: String): PatientItem { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/DetailsModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/DetailsModel.kt index ec54f0a05d..505ba445c1 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/DetailsModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/DetailsModel.kt @@ -23,7 +23,7 @@ import org.smartregister.fhircore.quest.configuration.view.Filter @Stable data class DetailsViewItem( var label: String = "", - val rows: MutableList = mutableListOf() + val rows: MutableList = mutableListOf(), ) @Stable diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/PatientModels.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/PatientModels.kt index 517fb687e1..5ddc941f90 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/PatientModels.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/PatientModels.kt @@ -32,7 +32,7 @@ data class PatientItem( val telecom: List? = null, val address: AddressData? = null, val generalPractitionerReference: String = "", - val managingOrganizationReference: String = "" + val managingOrganizationReference: String = "", ) @Stable @@ -42,7 +42,7 @@ data class AdditionalData( var valuePrefix: String? = null, var valuePostfix: String? = null, var lastDateAdded: String? = null, - val properties: Properties? = null + val properties: Properties? = null, ) @Stable @@ -50,7 +50,7 @@ data class AddressData( val district: String = "", val state: String = "", val text: String = "", - val fullAddress: String = "" + val fullAddress: String = "", ) fun PatientItem.genderFull(): String { @@ -64,18 +64,18 @@ fun PatientItem.genderFull(): String { @Stable data class QuestResultItem( val source: Pair, - val data: List> + val data: List>, ) data class QuestionnaireResponseItem( val logicalId: String, val authored: Date? = null, val encounterId: String?, - val questionnaireResponseString: String + val questionnaireResponseString: String, ) data class QuestionnaireItem( val logicalId: String? = null, val name: String? = null, - val title: String? = null + val title: String? = null, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/PatientPagingSourceState.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/PatientPagingSourceState.kt index ba53507da9..26b201f2cc 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/PatientPagingSourceState.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/patient/model/PatientPagingSourceState.kt @@ -25,7 +25,7 @@ data class PatientPagingSourceState( val currentPage: Int = 0, val loadAll: Boolean = false, val searchFilter: String? = null, - val filters: RegisterFilter? = null + val filters: RegisterFilter? = null, ) { val requiresFilter = filters != null } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/register/RegisterPagingSource.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/register/RegisterPagingSource.kt index 86b56d9e62..c15e63ff99 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/register/RegisterPagingSource.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/register/RegisterPagingSource.kt @@ -25,11 +25,11 @@ import org.smartregister.fhircore.quest.util.mappers.RegisterViewDataMapper /** * @property _patientPagingSourceState as state containing the properties used in the - * [RegisterRepository] function for loading data to the paging source. + * [RegisterRepository] function for loading data to the paging source. */ class RegisterPagingSource( private val registerRepository: RegisterRepository, - private val registerViewDataMapper: RegisterViewDataMapper + private val registerViewDataMapper: RegisterViewDataMapper, ) : PagingSource() { private var _patientPagingSourceState = PatientPagingSourceState() @@ -55,21 +55,21 @@ class RegisterPagingSource( currentPage = currentPage, appFeatureName = _patientPagingSourceState.appFeatureName, healthModule = _patientPagingSourceState.healthModule, - nameQuery = _patientPagingSourceState.searchFilter!! + nameQuery = _patientPagingSourceState.searchFilter!!, ) } else if (_patientPagingSourceState.requiresFilter) { registerRepository.loadRegisterFiltered( currentPage = currentPage, appFeatureName = _patientPagingSourceState.appFeatureName, healthModule = _patientPagingSourceState.healthModule, - filters = _patientPagingSourceState.filters!! + filters = _patientPagingSourceState.filters!!, ) } else { registerRepository.loadRegisterData( currentPage = currentPage, appFeatureName = _patientPagingSourceState.appFeatureName, healthModule = _patientPagingSourceState.healthModule, - loadAll = _patientPagingSourceState.loadAll + loadAll = _patientPagingSourceState.loadAll, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/MeasureReportPatientsPagingSource.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/MeasureReportPatientsPagingSource.kt index 3012df1798..eafe7bf966 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/MeasureReportPatientsPagingSource.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/MeasureReportPatientsPagingSource.kt @@ -25,18 +25,18 @@ import org.smartregister.fhircore.quest.util.mappers.MeasureReportPatientViewDat /** Retrieve ANC patients data for measure reporting */ class MeasureReportPatientsPagingSource( private val measureReportRepository: MeasureReportRepository, - val measureReportPatientViewDataMapper: MeasureReportPatientViewDataMapper + val measureReportPatientViewDataMapper: MeasureReportPatientViewDataMapper, ) : PagingSource() { override suspend fun load( - params: LoadParams + params: LoadParams, ): LoadResult { return try { val currentPage = params.key ?: 0 val data = measureReportRepository.retrievePatients(currentPage).map { registerData -> measureReportPatientViewDataMapper.transformInputToOutputModel( - registerData as RegisterData.AncRegisterData + registerData as RegisterData.AncRegisterData, ) } val prevKey = if (currentPage == 0) null else currentPage - 1 diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/MeasureReportRepository.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/MeasureReportRepository.kt index 9b7ecc5a39..86a06097c4 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/MeasureReportRepository.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/MeasureReportRepository.kt @@ -36,7 +36,7 @@ constructor( val fhirEngine: FhirEngine, @ApplicationContext val context: Context, val dispatcherProvider: DefaultDispatcherProvider, - val ancPatientRegisterDao: AncPatientRegisterDao + val ancPatientRegisterDao: AncPatientRegisterDao, ) : PagingSource() { override fun getRefreshKey(state: PagingState): Int? { @@ -59,7 +59,7 @@ constructor( return ancPatientRegisterDao.loadRegisterData( currentPage = currentPage, loadAll = true, - AppFeature.PatientManagement.name + AppFeature.PatientManagement.name, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/models/MeasureReportRowData.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/models/MeasureReportRowData.kt index 9a0bc196bc..913a133248 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/models/MeasureReportRowData.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/report/measure/models/MeasureReportRowData.kt @@ -26,5 +26,5 @@ data class MeasureReportRowData( val title: String = "", val description: String = "", val reportType: String = "", - val name: String = "" + val name: String = "", ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/task/PatientTaskRepository.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/task/PatientTaskRepository.kt index d0dc10a647..37ffed038f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/task/PatientTaskRepository.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/task/PatientTaskRepository.kt @@ -40,17 +40,17 @@ constructor( @ApplicationContext val context: Context, override val fhirEngine: FhirEngine, override val dataMapper: PatientTaskItemMapper, - private val dispatcherProvider: DispatcherProvider + private val dispatcherProvider: DispatcherProvider, ) : RegisterRepository { /* TODO: Use the logged in user's practitionerId in line 55 and 67 https://github.com/opensrp/fhircore/issues/1075 - */ + */ override suspend fun loadData( query: String, pageNumber: Int, - loadAll: Boolean + loadAll: Boolean, ): List { return withContext(dispatcherProvider.io()) { val tasks = @@ -58,12 +58,14 @@ constructor( filterByResourceTypeId(Task.OWNER, ResourceType.Practitioner, "6744") } - tasks.map { it.resource }.map { task -> - val patientId = task.`for`.reference.replace("Patient/", "") - val patient = fhirEngine.get(patientId) + tasks + .map { it.resource } + .map { task -> + val patientId = task.`for`.reference.replace("Patient/", "") + val patient = fhirEngine.get(patientId) - dataMapper.transformInputToOutputModel(PatientTask(patient, task)) - } + dataMapper.transformInputToOutputModel(PatientTask(patient, task)) + } } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/task/model/PatientTaskItem.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/task/model/PatientTaskItem.kt index db02686fd2..e846c83c70 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/data/task/model/PatientTaskItem.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/data/task/model/PatientTaskItem.kt @@ -28,7 +28,7 @@ data class PatientTaskItem( val birthdate: Date? = null, val address: String = "", val description: String = "", - val overdue: Boolean = false + val overdue: Boolean = false, ) { fun demographics(): String { return "$name, $gender, ${birthdate.toAgeDisplay()}" diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/MainNavigationScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/MainNavigationScreen.kt index c78a11d373..e611e6fd1a 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/MainNavigationScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/MainNavigationScreen.kt @@ -22,25 +22,38 @@ sealed class MainNavigationScreen( val titleResource: Int? = null, val iconResource: Int? = null, val route: String, - val showInBottomNav: Boolean = false + val showInBottomNav: Boolean = false, ) { object Home : MainNavigationScreen(R.string.clients, R.drawable.ic_home, "homeRoute", true) + object Tasks : MainNavigationScreen(R.string.tasks, R.drawable.ic_tasks, "tasksRoute", true) + object Reports : MainNavigationScreen(R.string.reports, R.drawable.ic_reports, "reportsRoute", true) + object Settings : MainNavigationScreen(R.string.settings, R.drawable.ic_settings, "settingsRoute", true) + object PatientProfile : MainNavigationScreen(titleResource = R.string.profile, route = "patientProfileRoute") + object TracingProfile : MainNavigationScreen(titleResource = R.string.profile, route = "tracingProfileRoute") + object PatientGuardians : MainNavigationScreen(route = "patientProfileGuardians") + object FamilyProfile : MainNavigationScreen(route = "familyProfileRoute") + object ViewChildContacts : MainNavigationScreen(route = "viewChildContacts") + object GuardianProfile : MainNavigationScreen(route = "guardianProfile") + object TracingHistory : MainNavigationScreen(route = "tracingHistory") + object TracingOutcomes : MainNavigationScreen(route = "tracingOutcome") + object TracingHistoryDetails : MainNavigationScreen(route = "tracingHistoryDetails ") + companion object { val appScreens = listOf( @@ -56,7 +69,7 @@ sealed class MainNavigationScreen( TracingProfile, TracingHistory, TracingOutcomes, - TracingHistoryDetails + TracingHistoryDetails, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/MeasureReportNavigationScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/MeasureReportNavigationScreen.kt index 0d35338af2..21af45099e 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/MeasureReportNavigationScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/MeasureReportNavigationScreen.kt @@ -20,7 +20,10 @@ sealed class MeasureReportNavigationScreen( val route: String, ) { object MeasureReportList : MeasureReportNavigationScreen("reportMeasuresList") + object ReportTypeSelector : MeasureReportNavigationScreen("reportTypeSelector") + object PatientsList : MeasureReportNavigationScreen("patientsList") + object MeasureReportResult : MeasureReportNavigationScreen("measureReportResult") } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/NavigationArg.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/NavigationArg.kt index 88bb6c1832..ffc4b068fb 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/NavigationArg.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/NavigationArg.kt @@ -42,14 +42,15 @@ object NavigationArg { type = NavType.EnumType(HealthModule::class.java) nullable = false defaultValue = healthModule - } + }, ) /** Create route paths */ fun routePathsOf(includeCommonArgs: Boolean = false, vararg navArg: String): String = "?" + - if (includeCommonArgs) listOf(FEATURE, HEALTH_MODULE).plus(navArg).joinByAmpersand() - else navArg.toList().joinByAmpersand() + if (includeCommonArgs) { + listOf(FEATURE, HEALTH_MODULE).plus(navArg).joinByAmpersand() + } else navArg.toList().joinByAmpersand() private fun List.joinByAmpersand() = this.joinToString("&") { "$it={$it}" } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/OverflowMenuFactory.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/OverflowMenuFactory.kt index 4ae8d0bff2..1361bca57f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/OverflowMenuFactory.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/OverflowMenuFactory.kt @@ -28,7 +28,7 @@ class OverflowMenuFactory @Inject constructor() { /** Retrieve [overflowMenuHost]. Remove any menu ids that satisfy the [conditions] */ fun retrieveOverflowMenuItems( overflowMenuHost: OverflowMenuHost, - conditions: List> = emptyList() + conditions: List> = emptyList(), ): MutableList { val overflowMenuItems = overflowMenuMap.getValue(overflowMenuHost) conditions.forEach { conditionPair: Pair -> @@ -48,7 +48,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.view_past_encounters, R.string.view_past_encounters), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), PATIENT_PROFILE( listOf( @@ -57,7 +57,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.record_as_anc, R.string.record_as_anc), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), NEWLY_DIAGNOSED_PROFILE( listOf( @@ -70,7 +70,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.clinic_history, R.string.clinic_history), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), ART_CLIENT_PROFILE( listOf( @@ -82,7 +82,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.clinic_history, R.string.clinic_history), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), EXPOSED_INFANT_PROFILE( listOf( @@ -92,7 +92,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.clinic_history, R.string.clinic_history), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), CHILD_CONTACT_PROFILE( listOf( @@ -101,7 +101,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.edit_profile, R.string.edit_profile), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), SEXUAL_CONTACT_PROFILE( listOf( @@ -110,7 +110,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.clinic_history, R.string.clinic_history), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), COMMUNITY_POSITIVE_PROFILE( listOf( @@ -119,20 +119,20 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.clinic_history, R.string.clinic_history), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), NOT_ON_ART( listOf( OverflowMenuItem(R.id.edit_profile, R.string.edit_profile), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), TRACING_PROFILE( listOf( OverflowMenuItem(R.id.tracing_history, R.string.tracing_history), - OverflowMenuItem(R.id.edit_profile, R.string.edit_profile) - ) + OverflowMenuItem(R.id.edit_profile, R.string.edit_profile), + ), ), SIBLING_CONTACT_PROFILE( listOf( @@ -141,7 +141,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.clinic_history, R.string.clinic_history), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), SOCIAL_NETWORK_CONTACT_PROFILE( listOf( @@ -150,7 +150,7 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.clinic_history, R.string.clinic_history), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), BIOLOGICAL_PARENT_CONTACT_PROFILE( listOf( @@ -159,6 +159,6 @@ enum class OverflowMenuHost(val overflowMenuItems: List) { OverflowMenuItem(R.id.clinic_history, R.string.clinic_history), OverflowMenuItem(R.id.patient_transfer_out, R.string.transfer_out), OverflowMenuItem(R.id.patient_change_status, R.string.change_status), - ) + ), ), } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/SideMenuOptionFactory.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/SideMenuOptionFactory.kt index 0f46823c16..de31b6dc61 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/SideMenuOptionFactory.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/navigation/SideMenuOptionFactory.kt @@ -30,7 +30,7 @@ class SideMenuOptionFactory @Inject constructor( val appFeatureManager: AppFeatureManager, - val registerRepository: AppRegisterRepository + val registerRepository: AppRegisterRepository, ) { val defaultSideMenu = SideMenuOption( @@ -43,9 +43,9 @@ constructor( suspend { registerRepository.countRegisterData( appFeatureName = AppFeature.PatientManagement.name, - healthModule = HealthModule.DEFAULT + healthModule = HealthModule.DEFAULT, ) - } + }, ) fun retrieveSideMenuOptions(): List { @@ -83,9 +83,9 @@ constructor( suspend { registerRepository.countRegisterData( appFeatureName = it.feature, - healthModule = it.healthModule!! + healthModule = it.healthModule!!, ) - } + }, ) } return sideMenuOptions.ifEmpty { listOf(defaultSideMenu) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/Components.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/Components.kt index 2de1707c93..35396624f8 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/Components.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/Components.kt @@ -42,7 +42,7 @@ fun LocalDatePickerDialog( datePickerTag: String, selectedDate: Date, onDatePicked: (Date) -> Unit, - onDateCancel: () -> Unit + onDateCancel: () -> Unit, ) { val datePicker = MaterialDatePicker.Builder.datePicker().setSelection(selectedDate.time).build() @@ -61,7 +61,7 @@ typealias Text = String fun LocalExposedDropdownMenuBox( selectedItem: T, options: Iterable, - onItemSelected: (T) -> Unit + onItemSelected: (T) -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } var isExpanded by remember { mutableStateOf(false) } @@ -69,7 +69,7 @@ fun LocalExposedDropdownMenuBox( ExposedDropdownMenuBox( expanded = isExpanded, onExpandedChange = { isExpanded = !isExpanded }, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { OutlinedTextField( value = selectedItem.text(), @@ -82,7 +82,7 @@ fun LocalExposedDropdownMenuBox( maxLines = 1, singleLine = true, modifier = Modifier.fillMaxWidth(), - interactionSource = interactionSource + interactionSource = interactionSource, ) ExposedDropdownMenu(expanded = isExpanded, onDismissRequest = { isExpanded = false }) { @@ -91,8 +91,10 @@ fun LocalExposedDropdownMenuBox( onClick = { onItemSelected(it) isExpanded = false - } - ) { Text(text = it.text()) } + }, + ) { + Text(text = it.text()) + } } } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/StandardRegisterScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/StandardRegisterScreen.kt index 759d520726..5e712431e1 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/StandardRegisterScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/StandardRegisterScreen.kt @@ -67,9 +67,8 @@ fun PageRegisterScreen( screenTitle: String, navController: NavHostController, registerViewModel: StandardRegisterViewModel, - filterNavClickAction: () -> Unit + filterNavClickAction: () -> Unit, ) { - val context = LocalContext.current val searchTextState = registerViewModel.searchText.collectAsState() val searchText by remember { searchTextState } @@ -88,7 +87,7 @@ fun PageRegisterScreen( registerViewModel.onEvent(StandardRegisterEvent.SearchRegister(searchText = searchText)) }, onNavIconClick = { navController.popBackStack() }, - onFilterIconClick = filterNavClickAction + onFilterIconClick = filterNavClickAction, ) }, bottomBar = { @@ -105,11 +104,11 @@ fun PageRegisterScreen( }, nextButtonClickListener = { registerViewModel.onEvent(StandardRegisterEvent.MoveToNextPage) - } + }, ) } } - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { // Only show counter during search @@ -124,14 +123,14 @@ fun PageRegisterScreen( state = rememberSwipeRefreshState(isRefreshing), onRefresh = { registerViewModel.refresh() }, // indicator = { _, _ -> } - ) { + ) { RegisterList( modifier = iModifier, pagingItems = pagingItems, onRowClick = { patientId: String -> registerViewModel.onEvent(StandardRegisterEvent.OpenProfile(patientId, navController)) }, - progressMessage = registerViewModel.progressMessage() + progressMessage = registerViewModel.progressMessage(), ) } } @@ -145,12 +144,12 @@ fun TopSection( searchText: String, onSearchTextChanged: (String) -> Unit, onNavIconClick: () -> Unit, - onFilterIconClick: () -> Unit = {} + onFilterIconClick: () -> Unit = {}, ) { Column(modifier = modifier.fillMaxWidth().background(MaterialTheme.colors.primary)) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = modifier.padding(vertical = 8.dp) + modifier = modifier.padding(vertical = 8.dp), ) { IconButton(onClick = onNavIconClick) { Icon(Icons.Filled.ArrowBack, contentDescription = "Back", tint = Color.White) @@ -181,11 +180,12 @@ fun TopSection( .background(Color.White), leadingIcon = { Icon(imageVector = Icons.Filled.Search, contentDescription = "Search") }, trailingIcon = { - if (searchText.isNotEmpty()) + if (searchText.isNotEmpty()) { IconButton(onClick = { onSearchTextChanged("") }) { Icon(imageVector = Icons.Filled.Clear, contentDescription = "Clear", tint = Color.Gray) } - } + } + }, ) } } @@ -198,6 +198,6 @@ fun PreviewTopSection() { searchText = "Search \u2026", onSearchTextChanged = {}, onNavIconClick = {}, - onFilterIconClick = {} + onFilterIconClick = {}, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/StandardRegisterViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/StandardRegisterViewModel.kt index 6aefb861c3..075352dde7 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/StandardRegisterViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/StandardRegisterViewModel.kt @@ -26,8 +26,11 @@ import org.smartregister.fhircore.quest.ui.shared.models.RegisterViewData interface StandardRegisterViewModel { fun onEvent(event: StandardRegisterEvent) + fun countPages(): LiveData + fun refresh() + fun progressMessage(): String val isRefreshing: StateFlow diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentFilterOptions.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentFilterOptions.kt index d27c0d917e..75b5bb5318 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentFilterOptions.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentFilterOptions.kt @@ -26,7 +26,8 @@ interface AppointmentFilterOption : FilterOption enum class PatientAssignment : AppointmentFilterOption { ALL_PATIENTS, - MY_PATIENTS; + MY_PATIENTS, + ; override fun text(): String = super.toString().lowercase().split("_").joinToString(" ") { it.capitalizeFirstLetter() } @@ -38,7 +39,8 @@ enum class PatientCategory : AppointmentFilterOption { EXPOSED_INFANT, CHILD_CONTACT, PERSON_WHO_IS_REACTIVE_AT_THE_COMMUNITY, - SEXUAL_CONTACT; + SEXUAL_CONTACT, + ; override fun text(): String = super.toString().lowercase().split("_").joinToString(" ") { it.capitalizeFirstLetter() } @@ -52,8 +54,8 @@ enum class Reason(val patientCategory: Array) : AppointmentFilt arrayOf( PatientCategory.CHILD_CONTACT, PatientCategory.SEXUAL_CONTACT, - PatientCategory.PERSON_WHO_IS_REACTIVE_AT_THE_COMMUNITY - ) + PatientCategory.PERSON_WHO_IS_REACTIVE_AT_THE_COMMUNITY, + ), ), INDEX_CASE_TESTING(arrayOf(PatientCategory.ART_CLIENT)), MILESTONE_HIV_TEST(arrayOf(PatientCategory.EXPOSED_INFANT)), @@ -62,7 +64,8 @@ enum class Reason(val patientCategory: Array) : AppointmentFilt ROUTINE_VISIT(arrayOf(PatientCategory.EXPOSED_INFANT)), VIRAL_LOAD_COLLECTION(arrayOf(PatientCategory.ART_CLIENT)), WELCOME_SERVICE(arrayOf(PatientCategory.ART_CLIENT)), - WELCOME_SERVICE_FOLLOW_UP(arrayOf(PatientCategory.ART_CLIENT)); + WELCOME_SERVICE_FOLLOW_UP(arrayOf(PatientCategory.ART_CLIENT)), + ; override fun text(): String = super.toString().lowercase().split("_").joinToString(" ") { it.capitalizeFirstLetter() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentRegisterScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentRegisterScreen.kt index 3a37c55ad9..377ef4f08a 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentRegisterScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentRegisterScreen.kt @@ -72,7 +72,7 @@ fun AppointmentRegisterScreen( modifier: Modifier = Modifier, screenTitle: String, navController: NavHostController, - registerViewModel: AppointmentRegisterViewModel = hiltViewModel() + registerViewModel: AppointmentRegisterViewModel = hiltViewModel(), ) { var showFiltersDialog by remember { mutableStateOf(false) } val currentFilterState by registerViewModel.filtersStateFlow.collectAsStateWithLifecycle() @@ -82,7 +82,7 @@ fun AppointmentRegisterScreen( screenTitle = screenTitle, navController = navController, registerViewModel = registerViewModel, - filterNavClickAction = { showFiltersDialog = true } + filterNavClickAction = { showFiltersDialog = true }, ) if (showFiltersDialog) { @@ -94,7 +94,7 @@ fun AppointmentRegisterScreen( onFiltersApply = { registerViewModel.onEvent(StandardRegisterEvent.ApplyFilter(it)) showFiltersDialog = false - } + }, ) } } @@ -104,13 +104,13 @@ fun FilterAppointmentsModal( currentFilterState: AppointmentFilterState, fragmentManager: FragmentManager, onDismissAction: () -> Unit, - onFiltersApply: (AppointmentFilterState) -> Unit + onFiltersApply: (AppointmentFilterState) -> Unit, ) { var filtersState by remember { mutableStateOf(currentFilterState) } Dialog( onDismissRequest = onDismissAction, - properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false) + properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false), ) { Card(modifier = Modifier.fillMaxWidth().wrapContentHeight()) { Column(modifier = Modifier.padding(8.dp)) { @@ -118,14 +118,14 @@ fun FilterAppointmentsModal( text = stringResource(id = R.string.filters).uppercase(), textAlign = TextAlign.Start, style = MaterialTheme.typography.h5, - color = MaterialTheme.colors.primary + color = MaterialTheme.colors.primary, ) Spacer(modifier = Modifier.height(8.dp)) Column( horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(8.dp) + verticalArrangement = Arrangement.spacedBy(8.dp), ) { AppointmentDateField( fragmentManager, @@ -133,7 +133,7 @@ fun FilterAppointmentsModal( onNewDateSelected = { filtersState = AppointmentFilterState.default().copy(date = it) // reset other filters to default - } + }, ) AppointmentExposedDropdown( @@ -145,11 +145,11 @@ fun FilterAppointmentsModal( patientCategory = AppointmentFilter( PatientCategory.ALL_PATIENT_CATEGORIES, - PatientCategory.values().asList() + PatientCategory.values().asList(), ), - reason = AppointmentFilter(Reason.ALL_REASONS, Reason.values().asList()) + reason = AppointmentFilter(Reason.ALL_REASONS, Reason.values().asList()), ) - } + }, ) AppointmentExposedDropdown( @@ -163,14 +163,14 @@ fun FilterAppointmentsModal( filtersState = filtersState.copy( patientCategory = it, - reason = AppointmentFilter(Reason.ALL_REASONS, categoryReasons) + reason = AppointmentFilter(Reason.ALL_REASONS, categoryReasons), ) - } + }, ) AppointmentExposedDropdown( filter = filtersState.reason, - onItemSelected = { filtersState = filtersState.copy(reason = it) } + onItemSelected = { filtersState = filtersState.copy(reason = it) }, ) } @@ -180,14 +180,18 @@ fun FilterAppointmentsModal( modifier = Modifier.wrapContentWidth(), colors = ButtonDefaults.textButtonColors( - contentColor = Color.DarkGray.copy(alpha = ContentAlpha.medium) - ) - ) { Text(text = stringResource(id = R.string.cancel).uppercase()) } + contentColor = Color.DarkGray.copy(alpha = ContentAlpha.medium), + ), + ) { + Text(text = stringResource(id = R.string.cancel).uppercase()) + } TextButton( onClick = { onFiltersApply(filtersState) }, - modifier = Modifier.wrapContentWidth() - ) { Text(text = stringResource(id = R.string.apply).uppercase()) } + modifier = Modifier.wrapContentWidth(), + ) { + Text(text = stringResource(id = R.string.apply).uppercase()) + } } } } @@ -199,14 +203,14 @@ fun AppointmentDatePicker( fragmentManager: FragmentManager, selectedDate: AppointmentDate, onDatePicked: (AppointmentDate) -> Unit, - onDateCancel: () -> Unit + onDateCancel: () -> Unit, ) { LocalDatePickerDialog( fragmentManager = fragmentManager, datePickerTag = "APPOINTMENT_DATE_PICKER", selectedDate = selectedDate.value, onDatePicked = { onDatePicked.invoke(AppointmentDate(it)) }, - onDateCancel = { onDateCancel.invoke() } + onDateCancel = { onDateCancel.invoke() }, ) } @@ -214,7 +218,7 @@ fun AppointmentDatePicker( fun AppointmentDateField( fragmentManager: FragmentManager, date: AppointmentDate, - onNewDateSelected: (AppointmentDate) -> Unit + onNewDateSelected: (AppointmentDate) -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() @@ -239,7 +243,7 @@ fun AppointmentDateField( Icon(imageVector = Icons.Filled.CalendarToday, contentDescription = "date of appointment") } }, - interactionSource = interactionSource + interactionSource = interactionSource, ) if (showCalendarDialog) { @@ -250,7 +254,7 @@ fun AppointmentDateField( onNewDateSelected(it) showCalendarDialog = false }, - onDateCancel = { showCalendarDialog = false } + onDateCancel = { showCalendarDialog = false }, ) } } @@ -259,12 +263,12 @@ fun AppointmentDateField( @Composable fun AppointmentExposedDropdown( filter: AppointmentFilter, - onItemSelected: (AppointmentFilter) -> Unit + onItemSelected: (AppointmentFilter) -> Unit, ) { LocalExposedDropdownMenuBox( selectedItem = filter.selected, options = filter.options, - onItemSelected = { onItemSelected.invoke(filter.copy(selected = it)) } + onItemSelected = { onItemSelected.invoke(filter.copy(selected = it)) }, ) } @@ -285,6 +289,6 @@ fun PreviewFilterAppointmentsModal() { currentFilterState = AppointmentFilterState.default(), fragmentManager = activity.supportFragmentManager, onDismissAction = {}, - onFiltersApply = {} + onFiltersApply = {}, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentRegisterViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentRegisterViewModel.kt index add8db01f9..d10558b000 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentRegisterViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/appointment/register/AppointmentRegisterViewModel.kt @@ -76,7 +76,7 @@ constructor( syncBroadcaster: SyncBroadcaster, val registerRepository: AppRegisterRepository, val configurationRegistry: ConfigurationRegistry, - private val registerViewDataMapper: RegisterViewDataMapper + private val registerViewDataMapper: RegisterViewDataMapper, ) : ViewModel(), StandardRegisterViewModel { private val appFeatureName = savedStateHandle.get(NavigationArg.FEATURE) private val healthModule = @@ -126,7 +126,7 @@ constructor( dateOfAppointment = it.date.value, myPatients = it.patients.selected == PatientAssignment.MY_PATIENTS, patientCategory = categories, - reasonCode = reason + reasonCode = reason, ) } .onEach { resetPage() } @@ -134,8 +134,8 @@ constructor( viewModelScope.launch { combine(searchFlow, pageFlow, registerFilterFlow, refreshCounterFlow) { s, p, f, _ -> - Triple(s, p, f) - } + Triple(s, p, f) + } .mapLatest { val pagingFlow = if (it.first.isNotBlank()) { @@ -151,8 +151,8 @@ constructor( viewModelScope.launch { combine(searchFlow, pageFlow, registerFilterFlow, refreshCounterFlow) { s, p, f, _ -> - Triple(s, p, f) - } + Triple(s, p, f) + } .filter { it.first.isBlank() } .mapLatest { registerRepository.countRegisterFiltered(appFeatureName, healthModule, filters = it.third) @@ -203,14 +203,14 @@ constructor( appFeatureName: String?, loadAll: Boolean = false, page: Int = 0, - registerFilters: AppointmentRegisterFilter + registerFilters: AppointmentRegisterFilter, ): Pager = Pager( config = PagingConfig( pageSize = RegisterPagingSource.DEFAULT_PAGE_SIZE, initialLoadSize = RegisterPagingSource.DEFAULT_INITIAL_LOAD_SIZE, - enablePlaceholders = false + enablePlaceholders = false, ), pagingSourceFactory = { RegisterPagingSource(registerRepository, registerViewDataMapper).apply { @@ -220,17 +220,17 @@ constructor( healthModule = healthModule, loadAll = loadAll, currentPage = if (loadAll) 0 else page, - filters = registerFilters - ) + filters = registerFilters, + ), ) } - } + }, ) override fun countPages() = - _totalRecordsCount.map { it.toDouble().div(RegisterPagingSource.DEFAULT_PAGE_SIZE) }.map { - ceil(it).toInt() - } + _totalRecordsCount + .map { it.toDouble().div(RegisterPagingSource.DEFAULT_PAGE_SIZE) } + .map { ceil(it).toInt() } override fun onEvent(event: StandardRegisterEvent) { when (event) { @@ -266,7 +266,7 @@ data class AppointmentFilterState( val date: AppointmentDate, val patients: AppointmentFilter, val patientCategory: AppointmentFilter, - val reason: AppointmentFilter + val reason: AppointmentFilter, ) { companion object { fun default() = @@ -277,9 +277,9 @@ data class AppointmentFilterState( patientCategory = AppointmentFilter( PatientCategory.ALL_PATIENT_CATEGORIES, - PatientCategory.values().asList() + PatientCategory.values().asList(), ), - reason = AppointmentFilter(Reason.ALL_REASONS, Reason.values().asList()) + reason = AppointmentFilter(Reason.ALL_REASONS, Reason.values().asList()), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileEvent.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileEvent.kt index 7ef9ae2e64..06537bcea5 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileEvent.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileEvent.kt @@ -29,13 +29,13 @@ sealed class FamilyProfileEvent { val context: Context, val taskFormId: String, val taskId: String, - val patientId: String + val patientId: String, ) : FamilyProfileEvent() data class OpenMemberProfile( val patientId: String, val familyId: String? = null, - val navController: NavHostController + val navController: NavHostController, ) : FamilyProfileEvent() data class OverflowMenuClick(val context: Context, val menuId: Int, val familyId: String?) : diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileScreen.kt index 527e051515..8b843a53d8 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileScreen.kt @@ -83,9 +83,8 @@ import org.smartregister.fhircore.quest.ui.family.profile.model.FamilyBottomShee fun FamilyProfileScreen( navController: NavHostController, modifier: Modifier = Modifier, - familyProfileViewModel: FamilyProfileViewModel = hiltViewModel() + familyProfileViewModel: FamilyProfileViewModel = hiltViewModel(), ) { - val viewState = familyProfileViewModel.familyProfileUiState.value val profileViewData = familyProfileViewModel.familyMemberProfileData.value var showOverflowMenu by remember { mutableStateOf(false) } @@ -118,10 +117,11 @@ fun FamilyProfileScreen( changeFamilyHead(familyMember.patientId, familyId!!) fetchFamilyProfileData() } - if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) + if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) { bottomSheetScaffoldState.bottomSheetState.collapse() + } } - } + }, ) } FamilyBottomSheetAction.FAMILY_MEMBER_DETAILS -> { @@ -136,30 +136,31 @@ fun FamilyProfileScreen( context = context, taskFormId = taskFormId, taskId = taskId!!, - patientId = currentMemberPatientId - ) + patientId = currentMemberPatientId, + ), ) }, onViewProfile = { coroutineScope.launch { - if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) + if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) { bottomSheetScaffoldState.bottomSheetState.collapse() + } } familyProfileViewModel.onEvent( FamilyProfileEvent.OpenMemberProfile( patientId = currentMemberPatientId, familyId = familyProfileViewModel.familyId, - navController = navController - ) + navController = navController, + ), ) - } + }, ) } } }, scaffoldState = bottomSheetScaffoldState, sheetPeekHeight = 0.dp, - sheetGesturesEnabled = true + sheetGesturesEnabled = true, ) { Scaffold( topBar = { @@ -177,13 +178,13 @@ fun FamilyProfileScreen( Icon( imageVector = Icons.Outlined.MoreVert, contentDescription = null, - tint = Color.White + tint = Color.White, ) } DropdownMenu( expanded = showOverflowMenu, onDismissRequest = { showOverflowMenu = false }, - modifier = modifier.padding(0.dp) + modifier = modifier.padding(0.dp), ) { viewState.overflowMenuItems.forEach { DropdownMenuItem( @@ -196,15 +197,15 @@ fun FamilyProfileScreen( if (familyList.list.isNotEmpty()) { familyBottomSheetAction = FamilyBottomSheetAction.CHANGE_FAMILY_HEAD coroutineScope.launch { - if (bottomSheetScaffoldState.bottomSheetState.isCollapsed) + if (bottomSheetScaffoldState.bottomSheetState.isCollapsed) { bottomSheetScaffoldState.bottomSheetState.expand() - else bottomSheetScaffoldState.bottomSheetState.collapse() + } else bottomSheetScaffoldState.bottomSheetState.collapse() } } else { Toast.makeText( context, "No eligible family members found for family head", - Toast.LENGTH_SHORT + Toast.LENGTH_SHORT, ) .show() } @@ -213,8 +214,8 @@ fun FamilyProfileScreen( FamilyProfileEvent.OverflowMenuClick( context, it.id, - familyProfileViewModel.familyId - ) + familyProfileViewModel.familyId, + ), ) }, contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp), @@ -223,13 +224,16 @@ fun FamilyProfileScreen( .fillMaxWidth() .background( color = - if (it.confirmAction) it.titleColor.copy(alpha = 0.1f) - else Color.Transparent - ) - ) { Text(text = stringResource(it.titleResource), color = it.titleColor) } + if (it.confirmAction) { + it.titleColor.copy(alpha = 0.1f) + } else Color.Transparent, + ), + ) { + Text(text = stringResource(it.titleResource), color = it.titleColor) + } } } - } + }, ) }, floatingActionButton = { @@ -238,14 +242,14 @@ fun FamilyProfileScreen( text = { Text(text = stringResource(R.string.add_memeber).uppercase()) }, onClick = { familyProfileViewModel.onEvent( - FamilyProfileEvent.AddMember(context, familyProfileViewModel.familyId) + FamilyProfileEvent.AddMember(context, familyProfileViewModel.familyId), ) }, backgroundColor = MaterialTheme.colors.primary, icon = { Icon(imageVector = Icons.Filled.Add, contentDescription = null) }, - interactionSource = mutableInteractionSource + interactionSource = mutableInteractionSource, ) - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { Column(modifier = modifier.verticalScroll(verticalScrollState)) { @@ -256,7 +260,7 @@ fun FamilyProfileScreen( Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, - modifier = modifier.fillMaxWidth().padding(vertical = 20.dp, horizontal = 16.dp) + modifier = modifier.fillMaxWidth().padding(vertical = 20.dp, horizontal = 16.dp), ) { Text(text = stringResource(R.string.household), fontSize = 18.sp) OutlinedButton( @@ -265,7 +269,7 @@ fun FamilyProfileScreen( ButtonDefaults.buttonColors( backgroundColor = InfoColor.copy(alpha = 0.1f), contentColor = InfoColor, - ) + ), ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon(imageVector = Icons.Filled.Add, contentDescription = null) @@ -281,7 +285,6 @@ fun FamilyProfileScreen( FamilyProfileRow( familyMemberViewState = memberViewState, onFamilyMemberClick = { - // Update bottom sheet action familyBottomSheetAction = FamilyBottomSheetAction.FAMILY_MEMBER_DETAILS @@ -293,7 +296,7 @@ fun FamilyProfileScreen( listOf( memberViewState.name, memberViewState.gender.capitalizeFirstLetter().first().toString(), - memberViewState.age + memberViewState.age, ) .joinToString(", ") @@ -304,14 +307,14 @@ fun FamilyProfileScreen( questionnaire = it.task, questionnaireId = it.taskFormId, backReference = it.taskId.asReference(ResourceType.Task), - color = it.colorCode + color = it.colorCode, ) } coroutineScope.launch { - if (bottomSheetScaffoldState.bottomSheetState.isCollapsed) + if (bottomSheetScaffoldState.bottomSheetState.isCollapsed) { bottomSheetScaffoldState.bottomSheetState.expand() - else bottomSheetScaffoldState.bottomSheetState.collapse() + } else bottomSheetScaffoldState.bottomSheetState.collapse() } }, onTaskClick = { taskFormId, taskId -> @@ -320,10 +323,10 @@ fun FamilyProfileScreen( context = context, taskFormId = taskFormId, taskId = taskId, - patientId = memberViewState.patientId - ) + patientId = memberViewState.patientId, + ), ) - } + }, ) Divider() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileViewModel.kt index c9c6097554..f682c1f834 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/FamilyProfileViewModel.kt @@ -58,7 +58,7 @@ constructor( val overflowMenuFactory: OverflowMenuFactory, val registerRepository: AppRegisterRepository, val profileViewDataMapper: ProfileViewDataMapper, - val dispatcherProvider: DefaultDispatcherProvider + val dispatcherProvider: DefaultDispatcherProvider, ) : ViewModel() { val familyId = savedStateHandle.get(NavigationArg.PATIENT_ID) @@ -67,8 +67,8 @@ constructor( mutableStateOf( FamilyProfileUiState( overflowMenuItems = - overflowMenuFactory.retrieveOverflowMenuItems(OverflowMenuHost.FAMILY_PROFILE) - ) + overflowMenuFactory.retrieveOverflowMenuItems(OverflowMenuHost.FAMILY_PROFILE), + ), ) val familyMemberProfileData: MutableState = @@ -79,14 +79,15 @@ constructor( object : OnSyncListener { override fun onSync(state: SyncJobStatus) { when (state) { - is SyncJobStatus.Finished, is SyncJobStatus.Failed -> { + is SyncJobStatus.Finished, + is SyncJobStatus.Failed, -> { fetchFamilyProfileData() } else -> {} } } }, - viewModelScope + viewModelScope, ) fetchFamilyProfileData() @@ -98,7 +99,7 @@ constructor( QuestionnaireActivity.launchQuestionnaire( event.context, questionnaireId = FAMILY_MEMBER_REGISTER_FORM, - groupIdentifier = event.familyId + groupIdentifier = event.familyId, ) is FamilyProfileEvent.OpenMemberProfile -> { val urlParams = @@ -107,7 +108,7 @@ constructor( // TODO depending on client type, use relevant health module to load the correct content Pair(NavigationArg.HEALTH_MODULE, HealthModule.DEFAULT), Pair(NavigationArg.PATIENT_ID, event.patientId), - Pair(NavigationArg.FAMILY_ID, event.familyId) + Pair(NavigationArg.FAMILY_ID, event.familyId), ) event.navController.navigate(route = MainNavigationScreen.PatientProfile.route + urlParams) } @@ -116,7 +117,7 @@ constructor( event.context as Activity, questionnaireId = event.taskFormId, clientIdentifier = event.patientId, - backReference = event.taskId.asReference(ResourceType.Task).reference + backReference = event.taskId.asReference(ResourceType.Task).reference, ) is FamilyProfileEvent.OverflowMenuClick -> { when (event.menuId) { @@ -125,21 +126,21 @@ constructor( event.context, questionnaireId = FAMILY_REGISTRATION_FORM, clientIdentifier = event.familyId, - questionnaireType = QuestionnaireType.EDIT + questionnaireType = QuestionnaireType.EDIT, ) R.id.remove_family -> RemoveFamilyQuestionnaireActivity.launchQuestionnaire( event.context, questionnaireId = REMOVE_FAMILY_FORM, - clientIdentifier = event.familyId + clientIdentifier = event.familyId, ) } } is FamilyProfileEvent.FetchMemberTasks -> { - /*TODO fetch tasks for this member*/ + // TODO fetch tasks for this member } FamilyProfileEvent.RoutineVisit -> { - /*TODO Implement family routine visit*/ + // TODO Implement family routine visit } } } @@ -147,22 +148,23 @@ constructor( fun fetchFamilyProfileData() { viewModelScope.launch(dispatcherProvider.io()) { if (!familyId.isNullOrEmpty()) { - registerRepository.loadPatientProfileData( + registerRepository + .loadPatientProfileData( AppFeature.HouseholdManagement.name, HealthModule.FAMILY, - familyId + familyId, ) ?.let { familyMemberProfileData.value = - profileViewDataMapper.transformInputToOutputModel(it) as - ProfileViewData.FamilyProfileViewData + profileViewDataMapper.transformInputToOutputModel(it) + as ProfileViewData.FamilyProfileViewData } } } } fun filterEligibleFamilyHeadMembers( - profileViewData: ProfileViewData.FamilyProfileViewData + profileViewData: ProfileViewData.FamilyProfileViewData, ): EligibleFamilyHeadMember { val listOfFamilies = profileViewData.familyMemberViewStates.filter { it.birthDate!!.yearsPassed() > 15 } @@ -173,7 +175,7 @@ constructor( withContext(dispatcherProvider.io()) { registerRepository.registerDaoFactory.familyRegisterDao.changeFamilyHead( newFamilyHead = newFamilyHead, - oldFamilyHead = oldFamilyHead + oldFamilyHead = oldFamilyHead, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/ChangeFamilyHeadBottomSheet.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/ChangeFamilyHeadBottomSheet.kt index 051903618c..554e2eadc2 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/ChangeFamilyHeadBottomSheet.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/ChangeFamilyHeadBottomSheet.kt @@ -75,9 +75,8 @@ fun ChangeFamilyHeadBottomSheet( bottomSheetScaffoldState: BottomSheetScaffoldState, familyMembers: EligibleFamilyHeadMember?, onSaveClick: (FamilyMemberViewState) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { - var source by remember { mutableStateOf(familyMembers) } var isEnabled by remember { mutableStateOf(false) } Surface(shape = RoundedCornerShape(topStart = 8.dp, topEnd = 8.dp)) { @@ -89,7 +88,7 @@ fun ChangeFamilyHeadBottomSheet( modifier .fillMaxWidth() .height(IntrinsicSize.Min) - .padding(horizontal = 16.dp, vertical = 16.dp) + .padding(horizontal = 16.dp, vertical = 16.dp), ) { Text( text = stringResource(id = R.string.label_assign_new_family_head), @@ -104,10 +103,11 @@ fun ChangeFamilyHeadBottomSheet( modifier = modifier.clickable { coroutineScope.launch { - if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) + if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) { bottomSheetScaffoldState.bottomSheetState.collapse() + } } - } + }, ) } Divider() @@ -120,20 +120,20 @@ fun ChangeFamilyHeadBottomSheet( .padding(horizontal = 12.dp, vertical = 18.dp) .background( color = colorResource(id = R.color.background_warning), - shape = RoundedCornerShape(8.dp) - ) + shape = RoundedCornerShape(8.dp), + ), ) { Image( painter = painterResource(id = R.drawable.ic_alert_triangle), contentDescription = null, - modifier = modifier.padding(horizontal = 12.dp) + modifier = modifier.padding(horizontal = 12.dp), ) Text( text = stringResource(id = R.string.alert_message_abort_operation), textAlign = TextAlign.Start, fontWeight = FontWeight.Medium, fontSize = 16.sp, - modifier = modifier.padding(vertical = 12.dp) + modifier = modifier.padding(vertical = 12.dp), ) } Text( @@ -145,7 +145,7 @@ fun ChangeFamilyHeadBottomSheet( ) LazyColumn( contentPadding = PaddingValues(vertical = 8.dp), - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { itemsIndexed( items = source!!.list, @@ -157,7 +157,7 @@ fun ChangeFamilyHeadBottomSheet( source = source!!.copy(reselect = source!!.reselect.not()) } Divider(color = DividerColor, thickness = 1.dp) - } + }, ) } Row( @@ -167,16 +167,17 @@ fun ChangeFamilyHeadBottomSheet( modifier .fillMaxWidth() .height(IntrinsicSize.Min) - .padding(horizontal = 16.dp, vertical = 16.dp) + .padding(horizontal = 16.dp, vertical = 16.dp), ) { TextButton( onClick = { coroutineScope.launch { - if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) + if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) { bottomSheetScaffoldState.bottomSheetState.collapse() + } } }, - modifier = modifier.fillMaxWidth().weight(1F).testTag(TEST_TAG_CANCEL) + modifier = modifier.fillMaxWidth().weight(1F).testTag(TEST_TAG_CANCEL), ) { Text( fontSize = 14.sp, @@ -191,8 +192,8 @@ fun ChangeFamilyHeadBottomSheet( colors = ButtonDefaults.textButtonColors( backgroundColor = - colorResource(id = if (isEnabled) R.color.colorPrimary else R.color.white) - ) + colorResource(id = if (isEnabled) R.color.colorPrimary else R.color.white), + ), ) { Text( fontSize = 14.sp, @@ -209,18 +210,18 @@ fun ChangeFamilyHeadBottomSheet( fun BottomListItem( model: EligibleFamilyHeadMemberViewState, modifier: Modifier = Modifier, - onClick: (FamilyMemberViewState) -> Unit + onClick: (FamilyMemberViewState) -> Unit, ) { Row(modifier = modifier.fillMaxWidth().padding(14.dp).clickable { onClick(model.familyMember) }) { RadioButton( selected = model.selected, modifier = modifier.testTag(model.familyMember.patientId), - onClick = { onClick(model.familyMember) } + onClick = { onClick(model.familyMember) }, ) Text( text = listOf(model.familyMember.name, model.familyMember.age, model.familyMember.gender) - .joinToString(", ") + .joinToString(", "), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyMemberBottomSheet.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyMemberBottomSheet.kt index 93e7d0e47f..4653d300a3 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyMemberBottomSheet.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyMemberBottomSheet.kt @@ -64,22 +64,21 @@ fun FamilyMemberBottomSheet( formButtonData: List, onFormClick: (String, String?) -> Unit, onViewProfile: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier.verticalScroll(rememberScrollState())) { - // Top section displays the name, gender and age for member Spacer(modifier = modifier.height(16.dp)) Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, - modifier = modifier.fillMaxWidth().padding(horizontal = 16.dp) + modifier = modifier.fillMaxWidth().padding(horizontal = 16.dp), ) { Column(modifier = modifier.wrapContentWidth(Alignment.Start)) { Text( text = stringResource(id = R.string.what_to_do), fontWeight = FontWeight.SemiBold, - modifier = modifier.padding(bottom = 4.dp) + modifier = modifier.padding(bottom = 4.dp), ) Text(text = title, color = DefaultColor.copy(0.8f)) } @@ -90,10 +89,11 @@ fun FamilyMemberBottomSheet( modifier = modifier.clickable { coroutineScope.launch { - if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) + if (!bottomSheetScaffoldState.bottomSheetState.isCollapsed) { bottomSheetScaffoldState.bottomSheetState.collapse() + } } - } + }, ) } Spacer(modifier = modifier.height(8.dp)) @@ -107,7 +107,7 @@ fun FamilyMemberBottomSheet( formButtonData = it, onFormClick = { questionnaireId, taskId -> if (it.questionnaireId != null) onFormClick(questionnaireId, taskId) - } + }, ) } Spacer(modifier = modifier.height(8.dp)) @@ -122,7 +122,7 @@ fun FamilyMemberBottomSheet( modifier .fillMaxWidth() .clickable { onViewProfile() } - .padding(horizontal = 16.dp, vertical = 16.dp) + .padding(horizontal = 16.dp, vertical = 16.dp), ) Spacer(modifier = modifier.height(16.dp)) } @@ -136,8 +136,12 @@ private fun FamilyMemberBottomSheetWithoutFormDataPreview() { bottomSheetScaffoldState = rememberBottomSheetScaffoldState(), title = "John Doe, M, 35y", formButtonData = emptyList(), - onFormClick = { _, _ -> /*Do nothing*/ }, - onViewProfile = { /*Do nothing*/} + onFormClick = { _, _ -> + // Do nothing + }, + onViewProfile = { + // Do nothing + }, ) } @@ -152,9 +156,13 @@ private fun FamilyMemberBottomSheetWithFormDataPreview() { listOf( FormButtonData("Issue bednet", "12344", null, OverdueColor), FormButtonData("Sick child", "12345", null, OverdueColor), - FormButtonData("Pregnancy visit", "12008") + FormButtonData("Pregnancy visit", "12008"), ), - onFormClick = { _, _ -> /*Do nothing*/ }, - onViewProfile = { /*Do nothing*/} + onFormClick = { _, _ -> + // Do nothing + }, + onViewProfile = { + // Do nothing + }, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyProfileRow.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyProfileRow.kt index c2fda32b3f..9747dcd3ad 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyProfileRow.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyProfileRow.kt @@ -58,7 +58,7 @@ fun FamilyProfileRow( familyMemberViewState: FamilyMemberViewState, onFamilyMemberClick: (String) -> Unit, onTaskClick: (String, String) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( horizontalArrangement = Arrangement.SpaceBetween, @@ -68,18 +68,18 @@ fun FamilyProfileRow( .clickable { onFamilyMemberClick(familyMemberViewState.patientId) } .wrapContentHeight() .fillMaxWidth() - .padding(16.dp) + .padding(16.dp), ) { // Only display title and no tasks if tasks is empty if (familyMemberViewState.memberTasks.isEmpty()) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, - modifier = modifier.fillMaxWidth() + modifier = modifier.fillMaxWidth(), ) { FamilyProfileTitleText( familyMemberViewState = familyMemberViewState, - modifier = modifier.weight(0.6f) + modifier = modifier.weight(0.6f), ) Text( text = stringResource(R.string.no_tasks), @@ -87,7 +87,7 @@ fun FamilyProfileRow( fontStyle = FontStyle.Italic, fontSize = 18.sp, textAlign = TextAlign.Center, - modifier = modifier.weight(0.4f) + modifier = modifier.weight(0.4f), ) } } else { @@ -99,7 +99,7 @@ fun FamilyProfileRow( color = Color.DarkGray.copy(alpha = 0.7f), maxLines = 2, overflow = TextOverflow.Ellipsis, - modifier = modifier.padding(bottom = 4.dp) + modifier = modifier.padding(bottom = 4.dp), ) if (familyMemberViewState.showAtRisk) { Text( @@ -115,14 +115,13 @@ fun FamilyProfileRow( modifier = modifier.size(20.dp).padding(2.4.dp), painter = painterResource(id = familyMemberViewState.memberIcon), contentDescription = null, - tint = Color.Unspecified + tint = Color.Unspecified, ) } // Display family members tasks Column(modifier = modifier.weight(0.4f)) { - familyMemberViewState - .memberTasks + familyMemberViewState.memberTasks .filter { it.taskStatus == Task.TaskStatus.READY } .take(3) .forEach { @@ -133,19 +132,20 @@ fun FamilyProfileRow( backgroundColor = it.colorCode.copy(alpha = 0.1f), contentColor = it.colorCode.copy(alpha = 0.8f), ), - modifier = modifier.padding(vertical = 2.2.dp).fillMaxWidth() + modifier = modifier.padding(vertical = 2.2.dp).fillMaxWidth(), ) { Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Start + horizontalArrangement = Arrangement.Start, ) { Icon( imageVector = - if (it.taskStatus == Task.TaskStatus.COMPLETED) Icons.Filled.Check - else Icons.Filled.Add, + if (it.taskStatus == Task.TaskStatus.COMPLETED) { + Icons.Filled.Check + } else Icons.Filled.Add, contentDescription = null, tint = - if (it.taskStatus == Task.TaskStatus.COMPLETED) SuccessColor else it.colorCode + if (it.taskStatus == Task.TaskStatus.COMPLETED) SuccessColor else it.colorCode, ) Text(text = it.task, color = it.colorCode.copy(alpha = 0.9f)) } @@ -159,19 +159,19 @@ fun FamilyProfileRow( @Composable private fun FamilyProfileTitleText( familyMemberViewState: FamilyMemberViewState, - modifier: Modifier + modifier: Modifier, ) { Text( text = listOf( familyMemberViewState.name, familyMemberViewState.gender.uppercase().first().toString(), - familyMemberViewState.age + familyMemberViewState.age, ) .joinToString(", "), fontSize = 18.sp, color = Color.Black.copy(alpha = 0.7f), - modifier = modifier.padding(bottom = 4.dp) + modifier = modifier.padding(bottom = 4.dp), ) } @@ -187,14 +187,14 @@ fun FamilyProfileRowPreviewWithAtRisk() { age = 37.toString(), statuses = listOf( - "Family Head, Malaria, Family Planning, Another Condition that I cannot explain here right now" + "Family Head, Malaria, Family Planning, Another Condition that I cannot explain here right now", ), showAtRisk = true, memberIcon = R.drawable.ic_pregnant, - memberTasks = membersTasks() + memberTasks = membersTasks(), ), onFamilyMemberClick = {}, - onTaskClick = { _, _ -> } + onTaskClick = { _, _ -> }, ) } @@ -211,10 +211,10 @@ fun FamilyProfileRowPreviewWithoutAtRisk() { statuses = listOf("Family Head"), showAtRisk = false, memberIcon = R.drawable.ic_pregnant, - memberTasks = membersTasks().take(1) + memberTasks = membersTasks().take(1), ), onFamilyMemberClick = {}, - onTaskClick = { _, _ -> } + onTaskClick = { _, _ -> }, ) } @@ -229,10 +229,10 @@ fun FamilyProfileRowPreviewWithNoTasks() { gender = "Male", age = 37.toString(), statuses = emptyList(), - memberTasks = emptyList() + memberTasks = emptyList(), ), onFamilyMemberClick = {}, - onTaskClick = { _, _ -> } + onTaskClick = { _, _ -> }, ) } @@ -244,20 +244,20 @@ private fun membersTasks() = taskFormId = "t12991", task = "Malaria Follow-up", taskStatus = Task.TaskStatus.COMPLETED, - colorCode = DefaultColor + colorCode = DefaultColor, ), FamilyMemberTask( taskId = "1124", taskFormId = "t12991", task = "Bednet", taskStatus = Task.TaskStatus.FAILED, - colorCode = DangerColor + colorCode = DangerColor, ), FamilyMemberTask( taskId = "1125", taskFormId = "t12991", task = "Family Planning", taskStatus = Task.TaskStatus.READY, - colorCode = InfoColor - ) + colorCode = InfoColor, + ), ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyProfileTopBar.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyProfileTopBar.kt index 402720064a..057aeba3ab 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyProfileTopBar.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/components/FamilyProfileTopBar.kt @@ -33,22 +33,22 @@ import org.smartregister.fhircore.quest.ui.shared.models.ProfileViewData @Composable fun FamilyProfileTopBar( familyProfileViewData: ProfileViewData.FamilyProfileViewData, - modifier: Modifier + modifier: Modifier, ) { Column( - modifier = modifier.fillMaxWidth().background(MaterialTheme.colors.primary).padding(16.dp) + modifier = modifier.fillMaxWidth().background(MaterialTheme.colors.primary).padding(16.dp), ) { Text( text = familyProfileViewData.name, color = Color.White, fontSize = 20.sp, - modifier = modifier.padding(top = 4.dp) + modifier = modifier.padding(top = 4.dp), ) Text( text = familyProfileViewData.address, color = Color.LightGray.copy(alpha = 0.8f), fontSize = 20.sp, - modifier = modifier.padding(top = 4.dp) + modifier = modifier.padding(top = 4.dp), ) } } @@ -59,6 +59,6 @@ fun FamilyProfileTopBarPreview() { FamilyProfileTopBar( familyProfileViewData = ProfileViewData.FamilyProfileViewData(name = "William Odinga", address = "#4 Sugoi, Bondo"), - modifier = Modifier + modifier = Modifier, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/model/FamilyBottomSheetAction.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/model/FamilyBottomSheetAction.kt index 4d0c274a71..416c591de6 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/model/FamilyBottomSheetAction.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/model/FamilyBottomSheetAction.kt @@ -18,5 +18,5 @@ package org.smartregister.fhircore.quest.ui.family.profile.model enum class FamilyBottomSheetAction { CHANGE_FAMILY_HEAD, - FAMILY_MEMBER_DETAILS + FAMILY_MEMBER_DETAILS, } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/model/FamilyMemberViewState.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/model/FamilyMemberViewState.kt index 602307c43d..ba00d036e8 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/model/FamilyMemberViewState.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/profile/model/FamilyMemberViewState.kt @@ -28,15 +28,15 @@ data class FamilyMemberViewState( val showAtRisk: Boolean = false, val isDeceased: Boolean = false, val memberIcon: Int? = null, - val memberTasks: List = emptyList() + val memberTasks: List = emptyList(), ) data class EligibleFamilyHeadMember( val list: List, - var reselect: Boolean = false + var reselect: Boolean = false, ) data class EligibleFamilyHeadMemberViewState( val familyMember: FamilyMemberViewState, - var selected: Boolean = false + var selected: Boolean = false, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/BaseRemoveFamilyEntityQuestionnaireActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/BaseRemoveFamilyEntityQuestionnaireActivity.kt index cc1bd97dc3..a2bc99d8ab 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/BaseRemoveFamilyEntityQuestionnaireActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/BaseRemoveFamilyEntityQuestionnaireActivity.kt @@ -85,7 +85,7 @@ abstract class BaseRemoveFamilyEntityQuestionnaireActivity : QuestionnaireAct neutralButtonListener = { dialog -> viewModel.discard() dialog.dismiss() - } + }, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/family/RemoveFamilyQuestionnaireActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/family/RemoveFamilyQuestionnaireActivity.kt index 30e9ae6404..bcb265aef8 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/family/RemoveFamilyQuestionnaireActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/family/RemoveFamilyQuestionnaireActivity.kt @@ -47,11 +47,11 @@ class RemoveFamilyQuestionnaireActivity : BaseRemoveFamilyEntityQuestionnaireAct fun launchQuestionnaire( context: Context, questionnaireId: String, - clientIdentifier: String? = null + clientIdentifier: String? = null, ) { context.startActivity( Intent(context, RemoveFamilyQuestionnaireActivity::class.java) - .putExtras(intentArgs(formName = questionnaireId, clientIdentifier = clientIdentifier)) + .putExtras(intentArgs(formName = questionnaireId, clientIdentifier = clientIdentifier)), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/family/RemoveFamilyViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/family/RemoveFamilyViewModel.kt index 3fd9a90440..640e99b38c 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/family/RemoveFamilyViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/family/RemoveFamilyViewModel.kt @@ -32,15 +32,17 @@ class RemoveFamilyViewModel @Inject constructor( override val repository: AppRegisterRepository, - val appFeatureManager: AppFeatureManager + val appFeatureManager: AppFeatureManager, ) : BaseRemoveFamilyEntityViewModel(repository) { var isDeactivateMembers = false init { isDeactivateMembers = - appFeatureManager.appFeatureSettings(AppFeature.HouseholdManagement)[ - DEACTIVATE_FAMILY_MEMBERS_SETTING_KEY] + appFeatureManager + .appFeatureSettings(AppFeature.HouseholdManagement)[ + DEACTIVATE_FAMILY_MEMBERS_SETTING_KEY, + ] .toBoolean() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/member/RemoveFamilyMemberQuestionnaireActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/member/RemoveFamilyMemberQuestionnaireActivity.kt index 4d6d7afef6..3a0f759d1b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/member/RemoveFamilyMemberQuestionnaireActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/member/RemoveFamilyMemberQuestionnaireActivity.kt @@ -51,12 +51,12 @@ class RemoveFamilyMemberQuestionnaireActivity : context: Context, questionnaireId: String, clientIdentifier: String? = null, - intentBundle: Bundle = Bundle.EMPTY + intentBundle: Bundle = Bundle.EMPTY, ) { context.startActivity( Intent(context, RemoveFamilyMemberQuestionnaireActivity::class.java) .putExtras(intentBundle) - .putExtras(intentArgs(formName = questionnaireId, clientIdentifier = clientIdentifier)) + .putExtras(intentArgs(formName = questionnaireId, clientIdentifier = clientIdentifier)), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/member/RemoveFamilyMemberViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/member/RemoveFamilyMemberViewModel.kt index e4002ba31f..cbea0aa7c3 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/member/RemoveFamilyMemberViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/family/remove/member/RemoveFamilyMemberViewModel.kt @@ -31,7 +31,7 @@ class RemoveFamilyMemberViewModel @Inject constructor( override val repository: AppRegisterRepository, - val appFeatureManager: AppFeatureManager + val appFeatureManager: AppFeatureManager, ) : BaseRemoveFamilyEntityViewModel(repository) { override fun fetch(profileId: String) { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/login/QuestLoginService.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/login/QuestLoginService.kt index 98e58329bb..b164c1d5b8 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/login/QuestLoginService.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/login/QuestLoginService.kt @@ -34,7 +34,7 @@ constructor( val appFeatureManager: AppFeatureManager, val secureSharedPreference: SecureSharedPreference, val p2pSenderTransferDao: P2PSenderTransferDao, - val p2pReceiverTransferDao: P2PReceiverTransferDao + val p2pReceiverTransferDao: P2PReceiverTransferDao, ) : LoginService { override lateinit var loginActivity: AppCompatActivity @@ -45,7 +45,7 @@ constructor( startActivity( Intent(loginActivity, AppMainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - } + }, ) finish() } @@ -61,8 +61,8 @@ constructor( dbPassphrase = username, username = username, senderTransferDao = p2pSenderTransferDao, - receiverTransferDao = p2pReceiverTransferDao - ) + receiverTransferDao = p2pReceiverTransferDao, + ), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainActivity.kt index f74ac82a0e..b5655e67f1 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainActivity.kt @@ -89,29 +89,30 @@ open class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { is SyncJobStatus.Started -> { showToast(getString(R.string.syncing)) appMainViewModel.onEvent( - AppMainEvent.UpdateSyncState(state, getString(R.string.syncing_initiated)) + AppMainEvent.UpdateSyncState(state, getString(R.string.syncing_initiated)), ) } is SyncJobStatus.InProgress -> { Timber.d( - "Syncing in progress: ${state.syncOperation.name} ${state.completed.div(max(state.total, 1).toDouble()).times(100)}%" + "Syncing in progress: ${state.syncOperation.name} ${state.completed.div(max(state.total, 1).toDouble()).times(100)}%", ) appMainViewModel.onEvent( - AppMainEvent.UpdateSyncState(state, getString(R.string.syncing_in_progress)) + AppMainEvent.UpdateSyncState(state, getString(R.string.syncing_in_progress)), ) } is SyncJobStatus.Glitch -> { appMainViewModel.onEvent( - AppMainEvent.UpdateSyncState(state, appMainViewModel.retrieveLastSyncTimestamp()) + AppMainEvent.UpdateSyncState(state, appMainViewModel.retrieveLastSyncTimestamp()), ) Timber.w( (if (state?.exceptions != null) state.exceptions else emptyList()).joinToString { it.exception.message.toString() - } + }, ) } is SyncJobStatus.Failed -> { - if (!state?.exceptions.isNullOrEmpty() && + if ( + !state?.exceptions.isNullOrEmpty() && state.exceptions.first().resourceType == ResourceType.Flag ) { showToast(state.exceptions.first().exception.message!!) @@ -121,21 +122,24 @@ open class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { val hasAuthError = state?.exceptions?.any { it.exception is HttpException && (it.exception as HttpException).code() == 401 - } - ?: false + } ?: false val message = if (hasAuthError) R.string.session_expired else R.string.sync_check_internet showToast(getString(message)) appMainViewModel.onEvent( AppMainEvent.UpdateSyncState( state, - if (!appMainViewModel.retrieveLastSyncTimestamp().isNullOrEmpty()) + if (!appMainViewModel.retrieveLastSyncTimestamp().isNullOrEmpty()) { getString(R.string.last_sync_timestamp, appMainViewModel.retrieveLastSyncTimestamp()) - else getString(R.string.syncing_failed) - ) + } else { + getString(R.string.syncing_failed) + }, + ), ) if (hasAuthError) { appMainViewModel.onEvent( - AppMainEvent.RefreshAuthToken { intent -> authActivityLauncherForResult.launch(intent) } + AppMainEvent.RefreshAuthToken { intent -> + authActivityLauncherForResult.launch(intent) + }, ) } Timber.w(state?.exceptions?.joinToString { it.exception.message.toString() }) @@ -147,8 +151,8 @@ open class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { onEvent( AppMainEvent.UpdateSyncState( state, - getString(R.string.last_sync_timestamp, formatLastSyncTimestamp(state.timestamp)) - ) + getString(R.string.last_sync_timestamp, formatLastSyncTimestamp(state.timestamp)), + ), ) updateLastSyncTimestamp(state.timestamp) } @@ -182,7 +186,7 @@ open class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) + if (resultCode == Activity.RESULT_OK) { data?.getStringExtra(QUESTIONNAIRE_BACK_REFERENCE_KEY)?.let { when { it.asReference(ResourceType.Task).extractId() == @@ -206,14 +210,15 @@ open class AppMainActivity : BaseMultiLanguageActivity(), OnSyncListener { } fhirCarePlanGenerator.completeTask( it.asReference(ResourceType.Task).extractId(), - encounterStatus + encounterStatus, ) } appMainViewModel.onTaskComplete( - data.getStringExtra(QuestionnaireActivity.QUESTIONNAIRE_ARG_FORM) + data.getStringExtra(QuestionnaireActivity.QUESTIONNAIRE_ARG_FORM), ) } } } + } } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainEvent.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainEvent.kt index 3a0ee0c5f9..b41bb2173f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainEvent.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainEvent.kt @@ -23,10 +23,16 @@ import org.smartregister.fhircore.engine.domain.model.Language sealed class AppMainEvent { data class SwitchLanguage(val language: Language, val context: Context) : AppMainEvent() + data class DeviceToDeviceSync(val context: Context) : AppMainEvent() + data class Logout(val context: Context) : AppMainEvent() + data class SyncData(val launchManualAuth: (Intent) -> Unit) : AppMainEvent() + object ResumeSync : AppMainEvent() + data class UpdateSyncState(val state: SyncJobStatus, val lastSyncTime: String?) : AppMainEvent() + data class RefreshAuthToken(val launchManualAuth: (Intent) -> Unit) : AppMainEvent() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainScreen.kt index 4049699411..46365be067 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainScreen.kt @@ -61,7 +61,7 @@ import org.smartregister.fhircore.quest.ui.tracing.register.TracingRegisterScree @Composable fun MainScreen( modifier: Modifier = Modifier, - appMainViewModel: AppMainViewModel = hiltViewModel() + appMainViewModel: AppMainViewModel = hiltViewModel(), ) { val navController = rememberNavController() val scope = rememberCoroutineScope() @@ -93,7 +93,7 @@ fun MainScreen( navController = navController, enableDeviceToDeviceSync = uiState.enableDeviceToDeviceSync, enableReports = uiState.enableReports, - syncClickEnabled = uiState.syncClickEnabled + syncClickEnabled = uiState.syncClickEnabled, ) }, bottomBar = { @@ -102,7 +102,7 @@ fun MainScreen( navController = navController, mainNavigationScreens = MainNavigationScreen.appScreens )*/ - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { AppMainNavigationGraph( @@ -110,7 +110,7 @@ fun MainScreen( mainNavigationScreens = MainNavigationScreen.appScreens, openDrawer = openDrawer, sideMenuOptions = uiState.sideMenuOptions, - appMainViewModel = appMainViewModel + appMainViewModel = appMainViewModel, ) } } @@ -123,22 +123,21 @@ private fun AppMainNavigationGraph( openDrawer: (Boolean) -> Unit, sideMenuOptions: List, measureReportViewModel: MeasureReportViewModel = hiltViewModel(), - appMainViewModel: AppMainViewModel + appMainViewModel: AppMainViewModel, ) { - val firstSideMenuOption = sideMenuOptions.first() val firstScreenTitle = stringResource(firstSideMenuOption.titleResource) NavHost( navController = navController, startDestination = MainNavigationScreen.Home.route + - NavigationArg.routePathsOf(includeCommonArgs = true, NavigationArg.SCREEN_TITLE) + NavigationArg.routePathsOf(includeCommonArgs = true, NavigationArg.SCREEN_TITLE), ) { mainNavigationScreens.forEach { val commonNavArgs = NavigationArg.commonNavArgs( firstSideMenuOption.appFeatureName, - firstSideMenuOption.healthModule + firstSideMenuOption.healthModule, ) when (it) { @@ -152,8 +151,8 @@ private fun AppMainNavigationGraph( type = NavType.StringType nullable = true defaultValue = firstScreenTitle - } - ) + }, + ), ) { stackEntry -> val screenTitle: String = stackEntry.arguments?.getString(NavigationArg.SCREEN_TITLE) @@ -162,7 +161,8 @@ private fun AppMainNavigationGraph( val healthModule: HealthModule = stackEntry.arguments?.getSerializable(NavigationArg.HEALTH_MODULE) as HealthModule? ?: HealthModule.HIV - if (healthModule == HealthModule.HOME_TRACING || + if ( + healthModule == HealthModule.HOME_TRACING || healthModule == HealthModule.PHONE_TRACING ) { TracingRegisterScreen(navController = navController, screenTitle = screenTitle) @@ -172,7 +172,7 @@ private fun AppMainNavigationGraph( PatientRegisterScreen( navController = navController, openDrawer = openDrawer, - screenTitle = screenTitle + screenTitle = screenTitle, ) } } @@ -187,7 +187,7 @@ private fun AppMainNavigationGraph( composable( route = "${it.route}${NavigationArg.routePathsOf(includeCommonArgs = true, NavigationArg.PATIENT_ID, NavigationArg.FAMILY_ID)}", - arguments = commonNavArgs.plus(patientIdNavArgument()) + arguments = commonNavArgs.plus(patientIdNavArgument()), ) { PatientProfileScreen(navController = navController, appMainViewModel = appMainViewModel) } @@ -195,20 +195,22 @@ private fun AppMainNavigationGraph( composable( route = "${it.route}${NavigationArg.routePathsOf(includeCommonArgs = true, NavigationArg.PATIENT_ID, NavigationArg.FAMILY_ID)}", - arguments = commonNavArgs.plus(patientIdNavArgument()) - ) { TracingProfileScreen(navController = navController) } + arguments = commonNavArgs.plus(patientIdNavArgument()), + ) { + TracingProfileScreen(navController = navController) + } MainNavigationScreen.PatientGuardians -> composable( route = "${it.route}/{${NavigationArg.PATIENT_ID}}${NavigationArg.routePathsOf(includeCommonArgs = true)}", arguments = commonNavArgs.plus( - navArgument(NavigationArg.PATIENT_ID) { type = NavType.StringType } - ) + navArgument(NavigationArg.PATIENT_ID) { type = NavType.StringType }, + ), ) { GuardiansRoute( navigateRoute = { route -> navController.navigate(route) }, - onBackPress = { navController.popBackStack() } + onBackPress = { navController.popBackStack() }, ) } MainNavigationScreen.GuardianProfile -> @@ -223,15 +225,15 @@ private fun AppMainNavigationGraph( type = NavType.StringType nullable = true defaultValue = "true" - } - ) - ) + }, + ), + ), ) { stackEntry -> val onART = stackEntry.arguments?.getString(NavigationArg.ON_ART) ?: "true" if (onART.toBoolean()) { PatientProfileScreen( navController = navController, - appMainViewModel = appMainViewModel + appMainViewModel = appMainViewModel, ) } else { GuardianRelatedPersonProfileScreen(onBackPress = { navController.popBackStack() }) @@ -241,20 +243,26 @@ private fun AppMainNavigationGraph( composable( route = "${it.route}${NavigationArg.routePathsOf(includeCommonArgs = true, NavigationArg.PATIENT_ID)}", - arguments = commonNavArgs.plus(patientIdNavArgument()) - ) { FamilyProfileScreen(navController = navController) } + arguments = commonNavArgs.plus(patientIdNavArgument()), + ) { + FamilyProfileScreen(navController = navController) + } MainNavigationScreen.ViewChildContacts -> composable( route = "${it.route}${NavigationArg.routePathsOf(includeCommonArgs = true, NavigationArg.PATIENT_ID)}", - arguments = commonNavArgs.plus(patientIdNavArgument()) - ) { ChildContactsProfileScreen(navController = navController) } + arguments = commonNavArgs.plus(patientIdNavArgument()), + ) { + ChildContactsProfileScreen(navController = navController) + } MainNavigationScreen.TracingHistory -> composable( route = "${it.route}${NavigationArg.routePathsOf(includeCommonArgs = true, NavigationArg.PATIENT_ID)}", - arguments = commonNavArgs.plus(patientIdNavArgument()) - ) { TracingHistoryScreen(navController = navController) } + arguments = commonNavArgs.plus(patientIdNavArgument()), + ) { + TracingHistoryScreen(navController = navController) + } MainNavigationScreen.TracingOutcomes -> composable( route = @@ -266,10 +274,12 @@ private fun AppMainNavigationGraph( navArgument(NavigationArg.TRACING_ID) { type = NavType.StringType nullable = false - } - ) - ) - ) { TracingOutcomesScreen(navController = navController) } + }, + ), + ), + ) { + TracingOutcomesScreen(navController = navController) + } MainNavigationScreen.TracingHistoryDetails -> composable( route = @@ -280,9 +290,9 @@ private fun AppMainNavigationGraph( navArgument(NavigationArg.PATIENT_ID) { type = NavType.StringType }, navArgument(NavigationArg.TRACING_ID) { type = NavType.StringType }, navArgument(NavigationArg.TRACING_ENCOUNTER_ID) { type = NavType.StringType }, - navArgument(NavigationArg.SCREEN_TITLE) { type = NavType.StringType } - ) - ) + navArgument(NavigationArg.SCREEN_TITLE) { type = NavType.StringType }, + ), + ), ) { stackEntry -> val screenTitle: String = stackEntry.arguments?.getString(NavigationArg.SCREEN_TITLE) ?: "" @@ -304,5 +314,5 @@ private fun patientIdNavArgument() = type = NavType.StringType nullable = true defaultValue = null - } + }, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainUiState.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainUiState.kt index c011d3f67d..80aa426253 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainUiState.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainUiState.kt @@ -29,7 +29,7 @@ data class AppMainUiState( val sideMenuOptions: List, val enableDeviceToDeviceSync: Boolean = false, val enableReports: Boolean = false, - val syncClickEnabled: Boolean = true + val syncClickEnabled: Boolean = true, ) fun appMainUiStateOf( @@ -40,7 +40,7 @@ fun appMainUiStateOf( languages: List = emptyList(), sideMenuOptions: List = emptyList(), enableDeviceToDeviceSync: Boolean = false, - enableReports: Boolean = false + enableReports: Boolean = false, ): AppMainUiState { return AppMainUiState( appTitle = appTitle, @@ -50,6 +50,6 @@ fun appMainUiStateOf( languages = languages, sideMenuOptions = sideMenuOptions, enableDeviceToDeviceSync = enableDeviceToDeviceSync, - enableReports = enableReports + enableReports = enableReports, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainViewModel.kt index 19a2657bcc..df795532a1 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/AppMainViewModel.kt @@ -66,7 +66,7 @@ constructor( val sharedPreferencesHelper: SharedPreferencesHelper, val configurationRegistry: ConfigurationRegistry, val configService: ConfigService, - val appFeatureManager: AppFeatureManager + val appFeatureManager: AppFeatureManager, ) : ViewModel() { val appMainUiState: MutableState = mutableStateOf(appMainUiStateOf()) @@ -89,7 +89,7 @@ constructor( lastSyncTime = retrieveLastSyncTimestamp() ?: "", languages = configurationRegistry.fetchLanguages(), enableDeviceToDeviceSync = appFeatureManager.isFeatureActive(AppFeature.DeviceToDeviceSync), - enableReports = appFeatureManager.isFeatureActive(AppFeature.InAppReporting) + enableReports = appFeatureManager.isFeatureActive(AppFeature.InAppReporting), ) } @@ -136,13 +136,13 @@ constructor( when (event.state) { // Update register count when sync completes is SyncJobStatus.Finished, - is SyncJobStatus.Failed -> { + is SyncJobStatus.Failed, -> { // Notify subscribers to refresh views after sync updateRefreshState() appMainUiState.value = appMainUiState.value.copy( lastSyncTime = event.lastSyncTime ?: "", - sideMenuOptions = sideMenuOptionFactory.retrieveSideMenuOptions() + sideMenuOptions = sideMenuOptionFactory.retrieveSideMenuOptions(), ) } else -> @@ -165,12 +165,11 @@ constructor( private fun loadCurrentLanguage() = Locale.forLanguageTag( - sharedPreferencesHelper.read(SharedPreferenceKey.LANG.name, Locale.UK.toLanguageTag())!! + sharedPreferencesHelper.read(SharedPreferenceKey.LANG.name, Locale.UK.toLanguageTag())!!, ) .displayName fun formatLastSyncTimestamp(timestamp: OffsetDateTime): String { - val syncTimestampFormatter = SimpleDateFormat(SYNC_TIMESTAMP_INPUT_FORMAT, Locale.getDefault()).apply { timeZone = TimeZone.getDefault() @@ -185,7 +184,7 @@ constructor( fun updateLastSyncTimestamp(timestamp: OffsetDateTime) { sharedPreferencesHelper.write( SharedPreferenceKey.LAST_SYNC_TIMESTAMP.name, - formatLastSyncTimestamp(timestamp) + formatLastSyncTimestamp(timestamp), ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/AppDrawer.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/AppDrawer.kt index 222a8e69a5..9b7b90ddb7 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/AppDrawer.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/AppDrawer.kt @@ -84,7 +84,7 @@ fun AppDrawer( onSideMenuClick: (AppMainEvent) -> Unit, enableDeviceToDeviceSync: Boolean, enableReports: Boolean, - syncClickEnabled: Boolean + syncClickEnabled: Boolean, ) { val context = LocalContext.current var expandLanguageDropdown by remember { mutableStateOf(false) } @@ -96,23 +96,23 @@ fun AppDrawer( // Re-issue sync event onSideMenuClick(AppMainEvent.ResumeSync) } - } + }, ) val syncEvent = AppMainEvent.SyncData { intent -> authActivityLauncherForResult.launch(intent) } Column( verticalArrangement = Arrangement.SpaceBetween, - modifier = modifier.fillMaxHeight().background(SideMenuDarkColor) + modifier = modifier.fillMaxHeight().background(SideMenuDarkColor), ) { Column(modifier.background(SideMenuDarkColor).padding(16.dp)) { Text( text = appTitle, fontSize = 22.sp, color = AppTitleColor, - modifier = modifier.padding(vertical = 16.dp) + modifier = modifier.padding(vertical = 16.dp), ) LazyColumn { - items(sideMenuOptions, { "${it.appFeatureName}|${it.healthModule.name}" }) { sideMenuOption + items(sideMenuOptions, { "${it.appFeatureName}|${it.healthModule.name}" }) { sideMenuOption, -> val title = stringResource(sideMenuOption.titleResource) @@ -132,10 +132,10 @@ fun AppDrawer( NavigationArg.bindArgumentsOf( Pair(NavigationArg.FEATURE, sideMenuOption.appFeatureName), Pair(NavigationArg.HEALTH_MODULE, sideMenuOption.healthModule), - Pair(NavigationArg.SCREEN_TITLE, title) - ) + Pair(NavigationArg.SCREEN_TITLE, title), + ), ) - } + }, ) } } @@ -147,7 +147,7 @@ fun AppDrawer( onSideMenuClick = { openDrawer(false) navController.navigate(MainNavigationScreen.Reports.route) - } + }, ) } if (enableDeviceToDeviceSync) { @@ -158,7 +158,7 @@ fun AppDrawer( onSideMenuClick = { openDrawer(false) onSideMenuClick(AppMainEvent.DeviceToDeviceSync(context)) - } + }, ) } if (languages.isNotEmpty()) { @@ -168,24 +168,24 @@ fun AppDrawer( title = stringResource(R.string.language), showEndText = true, endText = currentLanguage, - onSideMenuClick = { expandLanguageDropdown = true } + onSideMenuClick = { expandLanguageDropdown = true }, ) DropdownMenu( expanded = expandLanguageDropdown, onDismissRequest = { expandLanguageDropdown = false }, - modifier = modifier.wrapContentWidth(Alignment.End) + modifier = modifier.wrapContentWidth(Alignment.End), ) { for (language in languages) { DropdownMenuItem( onClick = { onSideMenuClick(AppMainEvent.SwitchLanguage(language, context)) expandLanguageDropdown = false - } + }, ) { Text( modifier = modifier.fillMaxWidth(), text = language.displayName, - fontSize = 18.sp + fontSize = 18.sp, ) } } @@ -199,20 +199,20 @@ fun AppDrawer( onSideMenuClick = { openDrawer(false) navController.navigate(MainNavigationScreen.Settings.route) - } + }, ) SideMenuItem( iconResource = R.drawable.ic_logout_white, title = stringResource(R.string.logout_user, username), showEndText = false, - onSideMenuClick = { onSideMenuClick(AppMainEvent.Logout(context)) } + onSideMenuClick = { onSideMenuClick(AppMainEvent.Logout(context)) }, ) } Box( modifier = modifier .background(SideMenuBottomItemDarkColor) - .padding(horizontal = 16.dp, vertical = 4.dp) + .padding(horizontal = 16.dp, vertical = 4.dp), ) { SideMenuItem( iconResource = R.drawable.ic_sync, @@ -221,7 +221,7 @@ fun AppDrawer( showEndText = true, endTextColor = SubtitleTextColor, onSideMenuClick = { onSideMenuClick(syncEvent) }, - enabled = syncClickEnabled + enabled = syncClickEnabled, ) } } @@ -236,13 +236,14 @@ fun SideMenuItem( endTextColor: Color = Color.White, showEndText: Boolean, onSideMenuClick: () -> Unit, - enabled: Boolean = true + enabled: Boolean = true, ) { Row( horizontalArrangement = Arrangement.SpaceBetween, modifier = - if (enabled) modifier.fillMaxWidth().clickable { onSideMenuClick() } - else modifier.fillMaxWidth(), + if (enabled) { + modifier.fillMaxWidth().clickable { onSideMenuClick() } + } else modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { val alpha = if (enabled) ContentAlpha.high else ContentAlpha.disabled @@ -252,7 +253,7 @@ fun SideMenuItem( modifier = modifier.padding(end = 10.dp).size(24.dp).alpha(alpha), painter = painterResource(id = iconResource), contentDescription = SIDE_MENU_ICON, - tint = Color.White + tint = Color.White, ) SideMenuItemText(title = title, textColor = Color.White.copy(alpha)) } @@ -293,20 +294,20 @@ fun AppDrawerPreview() { iconResource = R.drawable.ic_user, titleResource = R.string.clients, count = suspend { 16 }, - showCount = true + showCount = true, ), SideMenuOption( appFeatureName = "Reports", iconResource = R.drawable.ic_reports, titleResource = R.string.clients, - showCount = false - ) + showCount = false, + ), ), onSideMenuClick = {}, languages = listOf(Language("en", "English"), Language("sw", "Swahili")), enableDeviceToDeviceSync = true, enableReports = true, - syncClickEnabled = true + syncClickEnabled = true, ) } @@ -335,19 +336,19 @@ fun AppDrawerPreviewSyncDisabled() { iconResource = R.drawable.ic_user, titleResource = R.string.clients, count = suspend { 16 }, - showCount = true + showCount = true, ), SideMenuOption( appFeatureName = "Reports", iconResource = R.drawable.ic_reports, titleResource = R.string.clients, - showCount = false - ) + showCount = false, + ), ), onSideMenuClick = {}, languages = listOf(Language("en", "English"), Language("sw", "Swahili")), enableDeviceToDeviceSync = true, enableReports = true, - syncClickEnabled = false + syncClickEnabled = false, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/BottomScreenSection.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/BottomScreenSection.kt index ea1c97186a..f97be6850d 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/BottomScreenSection.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/BottomScreenSection.kt @@ -36,44 +36,46 @@ import org.smartregister.fhircore.quest.navigation.MainNavigationScreen @Composable fun BottomScreenSection( navController: NavHostController, - mainNavigationScreens: List + mainNavigationScreens: List, ) { BottomNavigation(backgroundColor = Color.White, contentColor = Color.Black) { val navBackStackEntry by navController.currentBackStackEntryAsState() val currentRoute = navBackStackEntry?.destination?.route - mainNavigationScreens.filter { it.showInBottomNav }.forEach { navigationScreen -> - if (navigationScreen.titleResource != null) { - BottomNavigationItem( - icon = { - navigationScreen.iconResource?.let { - Icon( - painter = painterResource(id = it), - contentDescription = stringResource(navigationScreen.titleResource) + mainNavigationScreens + .filter { it.showInBottomNav } + .forEach { navigationScreen -> + if (navigationScreen.titleResource != null) { + BottomNavigationItem( + icon = { + navigationScreen.iconResource?.let { + Icon( + painter = painterResource(id = it), + contentDescription = stringResource(navigationScreen.titleResource), + ) + } + }, + label = { + Text( + text = stringResource(navigationScreen.titleResource), + fontSize = 12.sp, ) - } - }, - label = { - Text( - text = stringResource(navigationScreen.titleResource), - fontSize = 12.sp, - ) - }, - selectedContentColor = BlueTextColor, - unselectedContentColor = Color.Black.copy(0.5f), - alwaysShowLabel = true, - selected = currentRoute == navigationScreen.route, - onClick = { - navController.navigate(navigationScreen.route) { - navController.graph.startDestinationRoute?.let { screen_route -> - popUpTo(screen_route) { saveState = true } + }, + selectedContentColor = BlueTextColor, + unselectedContentColor = Color.Black.copy(0.5f), + alwaysShowLabel = true, + selected = currentRoute == navigationScreen.route, + onClick = { + navController.navigate(navigationScreen.route) { + navController.graph.startDestinationRoute?.let { screen_route -> + popUpTo(screen_route) { saveState = true } + } + launchSingleTop = true + restoreState = false } - launchSingleTop = true - restoreState = false - } - } - ) + }, + ) + } } - } } } @@ -86,7 +88,7 @@ fun BottomScreenSectionPreview() { MainNavigationScreen.Home, MainNavigationScreen.Tasks, MainNavigationScreen.Reports, - MainNavigationScreen.Settings + MainNavigationScreen.Settings, ) BottomScreenSection(navController = navController, mainNavigationScreens = navigationScreens) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/TopScreenSection.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/TopScreenSection.kt index a95796926b..2cd97a0522 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/TopScreenSection.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/main/components/TopScreenSection.kt @@ -54,12 +54,12 @@ fun TopScreenSection( title: String, searchText: String, onSearchTextChanged: (String) -> Unit, - onTitleIconClick: () -> Unit + onTitleIconClick: () -> Unit, ) { Column(modifier = modifier.fillMaxWidth().background(MaterialTheme.colors.primary)) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = modifier.padding(vertical = 8.dp) + modifier = modifier.padding(vertical = 8.dp), ) { IconButton(onClick = onTitleIconClick) { Icon(Icons.Filled.Menu, contentDescription = DRAWER_MENU, tint = Color.White) @@ -86,11 +86,12 @@ fun TopScreenSection( .background(Color.White), leadingIcon = { Icon(imageVector = Icons.Filled.Search, SEARCH) }, trailingIcon = { - if (searchText.isNotEmpty()) + if (searchText.isNotEmpty()) { IconButton(onClick = { onSearchTextChanged("") }) { Icon(imageVector = Icons.Filled.Clear, CLEAR, tint = Color.Gray) } - } + } + }, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailScreen.kt index 8d78e90b8d..9290bdb8df 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailScreen.kt @@ -88,30 +88,36 @@ fun Toolbar(questPatientDetailViewModel: ListDataDetailViewModel) { navigationIcon = { IconButton( onClick = { questPatientDetailViewModel.onBackPressed(true) }, - Modifier.testTag(TOOLBAR_BACK_ARROW) - ) { Icon(Icons.Filled.ArrowBack, contentDescription = "Back arrow") } + Modifier.testTag(TOOLBAR_BACK_ARROW), + ) { + Icon(Icons.Filled.ArrowBack, contentDescription = "Back arrow") + } }, actions = { // show only if patient info exists patientItem?.let { IconButton( onClick = { showMenu = !showMenu }, - modifier = Modifier.testTag(TOOLBAR_MENU_BUTTON) - ) { Icon(imageVector = Icons.Outlined.MoreVert, contentDescription = null) } + modifier = Modifier.testTag(TOOLBAR_MENU_BUTTON), + ) { + Icon(imageVector = Icons.Outlined.MoreVert, contentDescription = null) + } DropdownMenu( expanded = showMenu, onDismissRequest = { showMenu = false }, - Modifier.testTag(TOOLBAR_MENU) + Modifier.testTag(TOOLBAR_MENU), ) { DropdownMenuItem( onClick = { showMenu = false questPatientDetailViewModel.onMenuItemClickListener(R.string.edit_patient_info) - } - ) { Text(text = stringResource(id = R.string.edit_patient_info)) } + }, + ) { + Text(text = stringResource(id = R.string.edit_patient_info)) + } } } - } + }, ) } @@ -125,7 +131,7 @@ fun ResultItem(testResult: QuestResultItem, questPatientDetailViewModel: ListDat .fillMaxWidth() .padding(12.dp) .clickable { questPatientDetailViewModel.onTestResultItemClickListener(testResult) } - .testTag(RESULT_ITEM) + .testTag(RESULT_ITEM), ) { Column(verticalArrangement = Arrangement.Center) { testResult.data.forEach { dataList -> @@ -136,11 +142,13 @@ fun ResultItem(testResult: QuestResultItem, questPatientDetailViewModel: ListDat text = it, color = Color( - android.graphics.Color.parseColor(item.properties?.label?.color ?: "#000000") + android.graphics.Color.parseColor(item.properties?.label?.color ?: "#000000"), ), fontSize = item.properties?.label?.textSize?.sp ?: 17.sp, fontWeight = - FontWeight(item.properties?.label?.fontWeight?.weight ?: FontWeight.Normal.weight) + FontWeight( + item.properties?.label?.fontWeight?.weight ?: FontWeight.Normal.weight, + ), ) } @@ -148,12 +156,12 @@ fun ResultItem(testResult: QuestResultItem, questPatientDetailViewModel: ListDat text = (item.valuePrefix ?: "") + item.value + (item.valuePostfix ?: ""), color = Color( - android.graphics.Color.parseColor(item.properties?.value?.color ?: "#000000") + android.graphics.Color.parseColor(item.properties?.value?.color ?: "#000000"), ), fontSize = item.properties?.value?.textSize?.sp ?: 17.sp, textAlign = TextAlign.Start, fontWeight = - FontWeight(item.properties?.value?.fontWeight?.weight ?: FontWeight.Normal.weight) + FontWeight(item.properties?.value?.fontWeight?.weight ?: FontWeight.Normal.weight), ) // add separator between items if item value itself is not supposed to act as label i.e. @@ -164,26 +172,29 @@ fun ResultItem(testResult: QuestResultItem, questPatientDetailViewModel: ListDat } } - if (questPatientDetailViewModel.patientDetailsViewConfiguration.value?.dataRowClickable == true) + if ( + questPatientDetailViewModel.patientDetailsViewConfiguration.value?.dataRowClickable == true + ) { Image( painter = painterResource(id = R.drawable.ic_forward_arrow), contentDescription = "", - colorFilter = ColorFilter.tint(colorResource(id = R.color.status_gray)) + colorFilter = ColorFilter.tint(colorResource(id = R.color.status_gray)), ) + } } } @Composable fun FormItem( questionnaireConfig: QuestionnaireConfig, - questPatientDetailViewModel: ListDataDetailViewModel + questPatientDetailViewModel: ListDataDetailViewModel, ) { Card( backgroundColor = colorResource(id = R.color.cornflower_blue), modifier = Modifier.fillMaxWidth() .clickable { questPatientDetailViewModel.onFormItemClickListener(questionnaireConfig) } - .testTag(FORM_ITEM) + .testTag(FORM_ITEM), ) { Box(contentAlignment = Alignment.Center, modifier = Modifier.padding(6.dp)) { Text( @@ -198,8 +209,10 @@ fun FormItem( @Composable fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewModel) { - val viewConfiguration by questPatientDetailViewModel.patientDetailsViewConfiguration - .observeAsState(dataDetailsListViewConfigurationOf()) + val viewConfiguration by + questPatientDetailViewModel.patientDetailsViewConfiguration.observeAsState( + dataDetailsListViewConfigurationOf(), + ) val patientItem by questPatientDetailViewModel.patientItem.observeAsState(null) val forms by questPatientDetailViewModel.questionnaireConfigs.observeAsState(null) val testResults by questPatientDetailViewModel.testResults.observeAsState(null) @@ -211,7 +224,7 @@ fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewMode modifier = Modifier.fillMaxWidth() .background(color = colorResource(id = R.color.colorPrimary)) - .padding(12.dp) + .padding(12.dp), ) { patientItem?.let { Text( @@ -219,7 +232,7 @@ fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewMode color = colorResource(id = R.color.white), fontSize = 18.sp, fontWeight = FontWeight.Bold, - modifier = Modifier.testTag(PATIENT_NAME) + modifier = Modifier.testTag(PATIENT_NAME), ) } @@ -231,10 +244,10 @@ fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewMode text = label, color = Color( - android.graphics.Color.parseColor(it.properties?.label?.color ?: "#000000") + android.graphics.Color.parseColor(it.properties?.label?.color ?: "#000000"), ), fontSize = it.properties?.label?.textSize?.sp ?: 16.sp, - modifier = Modifier.wrapContentWidth() + modifier = Modifier.wrapContentWidth(), ) } @@ -243,7 +256,7 @@ fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewMode color = Color(android.graphics.Color.parseColor(it.properties?.value?.color ?: "#000000")), fontSize = it.properties?.value?.textSize?.sp ?: 16.sp, - modifier = Modifier.wrapContentWidth() + modifier = Modifier.wrapContentWidth(), ) } } @@ -254,13 +267,13 @@ fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewMode modifier = Modifier.fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(start = 12.dp, end = 12.dp) + .padding(start = 12.dp, end = 12.dp), ) { Spacer(Modifier.height(24.dp)) Card( elevation = 3.dp, backgroundColor = colorResource(id = R.color.white), - modifier = Modifier.fillMaxWidth().testTag(FORM_CONTAINER_ITEM) + modifier = Modifier.fillMaxWidth().testTag(FORM_CONTAINER_ITEM), ) { Column(modifier = Modifier.padding(16.dp)) { forms?.let { allForms -> @@ -270,8 +283,7 @@ fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewMode Spacer(Modifier.height(16.dp)) } } - } - ?: Text(text = stringResource(id = R.string.loading_forms)) + } ?: Text(text = stringResource(id = R.string.loading_forms)) } } @@ -282,11 +294,11 @@ fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewMode text = "${viewConfiguration.contentTitle} (${testResults?.size?.toString() ?: ""})", color = colorResource(id = R.color.grayText), fontSize = 16.sp, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) Card( elevation = 4.dp, - modifier = Modifier.fillMaxWidth().padding(top = 12.dp).testTag(RESULT_CONTAINER_ITEM) + modifier = Modifier.fillMaxWidth().padding(top = 12.dp).testTag(RESULT_CONTAINER_ITEM), ) { Column { testResults?.let { @@ -299,7 +311,7 @@ fun QuestPatientDetailScreen(questPatientDetailViewModel: ListDataDetailViewMode } ?: Text( text = stringResource(id = R.string.loading_responses), - modifier = Modifier.padding(16.dp) + modifier = Modifier.padding(16.dp), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailViewModel.kt index 5a2f23156c..9896f3ec11 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailViewModel.kt @@ -49,7 +49,7 @@ constructor( val defaultRepository: DefaultRepository, val patientItemMapper: PatientItemMapper, val libraryEvaluatorProvider: Provider, - val fhirEngine: FhirEngine + val fhirEngine: FhirEngine, ) : ViewModel() { private val _patientDetailsViewConfiguration = MutableLiveData() @@ -66,7 +66,7 @@ constructor( fun getDemographicsWithAdditionalData( patientId: String, - patientDetailsViewConfiguration: DataDetailsListViewConfiguration + patientDetailsViewConfiguration: DataDetailsListViewConfiguration, ) { viewModelScope.launch { val demographic = patientRepository.fetchDemographicsWithAdditionalData(patientId) @@ -87,7 +87,7 @@ constructor( subjectId: String, subjectType: ResourceType, searchFilter: SearchFilter, - patientDetailsViewConfiguration: DataDetailsListViewConfiguration + patientDetailsViewConfiguration: DataDetailsListViewConfiguration, ) { viewModelScope.launch { val forms = patientRepository.fetchTestForms(searchFilter) @@ -97,8 +97,8 @@ constructor( subjectId, subjectType, forms, - patientDetailsViewConfiguration - ) + patientDetailsViewConfiguration, + ), ) } } @@ -121,7 +121,8 @@ constructor( fun fetchResultItemLabel(testResult: Pair): String { return testResult.second.titleElement.getLocalizedText() - ?: testResult.second.nameElement.getLocalizedText() ?: testResult.second.logicalId + ?: testResult.second.nameElement.getLocalizedText() + ?: testResult.second.logicalId } fun updateViewConfigurations(patientDetailsViewConfiguration: DataDetailsListViewConfiguration) { @@ -134,8 +135,9 @@ constructor( viewModelScope.launch { val activePregnancyConditionString = patientRepository.fetchPregnancyCondition(patientId = patientId) - if (activePregnancyConditionString.isNotEmpty()) + if (activePregnancyConditionString.isNotEmpty()) { resourceList.add(activePregnancyConditionString) + } resourceListLive.postValue(resourceList) } return resourceListLive diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/QuestPatientDetailActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/QuestPatientDetailActivity.kt index e79eabe3e7..21ce5afc86 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/QuestPatientDetailActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/QuestPatientDetailActivity.kt @@ -61,6 +61,7 @@ class QuestPatientDetailActivity : val patientViewModel by viewModels() @Inject lateinit var configurationRegistry: ConfigurationRegistry + @Inject lateinit var questJsonSpecificationProvider: QuestJsonSpecificationProvider override fun onCreate(savedInstanceState: Bundle?) { @@ -82,7 +83,7 @@ class QuestPatientDetailActivity : patientDetailConfig = configurationRegistry.retrieveConfiguration( configClassification = QuestConfigClassification.PATIENT_DETAILS_VIEW, - questJsonSpecificationProvider.getJson() + questJsonSpecificationProvider.getJson(), ) if (configurationRegistry.isAppIdInitialized()) { @@ -111,7 +112,7 @@ class QuestPatientDetailActivity : patientId, ResourceType.Patient, patientDetailConfig.questionnaireFilter!!, - patientDetailConfig + patientDetailConfig, ) getAllForms(patientDetailConfig.questionnaireFilter!!) } @@ -126,26 +127,27 @@ class QuestPatientDetailActivity : QuestionnaireActivity.intentArgs( clientIdentifier = patientId, formName = getRegistrationForm(), - questionnaireType = QuestionnaireType.EDIT - ) + questionnaireType = QuestionnaireType.EDIT, + ), ) .apply { if (patientResourcesList.isNotEmpty()) { this.putStringArrayListExtra( QuestionnaireActivity.QUESTIONNAIRE_POPULATION_RESOURCES, - patientResourcesList + patientResourcesList, ) } - } + }, ) } } } fun getRegistrationForm(): String { - return configurationRegistry.retrieveConfiguration( + return configurationRegistry + .retrieveConfiguration( configClassification = QuestConfigClassification.PATIENT_REGISTER, - questJsonSpecificationProvider.getJson() + questJsonSpecificationProvider.getJson(), ) .registrationForm } @@ -153,7 +155,7 @@ class QuestPatientDetailActivity : override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK) + if (resultCode == Activity.RESULT_OK) { getResultDetailsNavigationOptions().navigationOptions.forEach { when (it.action) { is TestDetailsNavigationAction -> { @@ -164,7 +166,7 @@ class QuestPatientDetailActivity : startActivity( Intent(this, SimpleDetailsActivity::class.java).apply { putExtra(RECORD_ID_ARG, it.replace("#", "")) - } + }, ) } } @@ -172,6 +174,7 @@ class QuestPatientDetailActivity : is QuestionnaireNavigationAction -> {} } } + } } private fun launchQuestionnaireForm(questionnaireConfig: QuestionnaireConfig?) { @@ -181,11 +184,11 @@ class QuestPatientDetailActivity : putExtras( QuestionnaireActivity.intentArgs( clientIdentifier = patientId, - formName = questionnaireConfig.identifier - ) + formName = questionnaireConfig.identifier, + ), ) }, - 0 + 0, ) } } @@ -199,7 +202,7 @@ class QuestPatientDetailActivity : private fun handleNavigationOptions( navigationOption: NavigationOption, resultItem: QuestResultItem?, - patientId: String + patientId: String, ) { when (navigationOption.action) { is QuestionnaireNavigationAction -> { @@ -218,9 +221,9 @@ class QuestPatientDetailActivity : questionnaireType = QuestionnaireType.READ_ONLY, questionnaireResponse = resultItem.source.first.questionnaireResponseString - .decodeResourceFromString() - ) - ) + .decodeResourceFromString(), + ), + ), ) } } @@ -231,7 +234,7 @@ class QuestPatientDetailActivity : startActivity( Intent(this@QuestPatientDetailActivity, SimpleDetailsActivity::class.java).apply { putExtra(RECORD_ID_ARG, it) - } + }, ) } } @@ -241,7 +244,7 @@ class QuestPatientDetailActivity : fun getResultDetailsNavigationOptions() = configurationRegistry.retrieveConfiguration( configClassification = QuestConfigClassification.RESULT_DETAILS_NAVIGATION, - questJsonSpecificationProvider.getJson() + questJsonSpecificationProvider.getJson(), ) override fun configureViews(viewConfiguration: DataDetailsListViewConfiguration) { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/QuestionnaireDataDetailActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/QuestionnaireDataDetailActivity.kt index 2070f9facd..deaead9244 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/QuestionnaireDataDetailActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/QuestionnaireDataDetailActivity.kt @@ -65,7 +65,9 @@ class QuestionnaireDataDetailActivity : detailConfig = configurationRegistry.retrieveConfiguration( configClassification = - QuestConfigClassification.valueOf(intent.getStringExtra(CLASSIFICATION_ARG)!!.uppercase()) + QuestConfigClassification.valueOf( + intent.getStringExtra(CLASSIFICATION_ARG)!!.uppercase(), + ), ) configureViews(detailConfig) @@ -94,14 +96,14 @@ class QuestionnaireDataDetailActivity : startActivity( Intent(this, QuestionnaireActivity::class.java).apply { putExtras(QuestionnaireActivity.intentArgs(formName = questionnaireConfig.identifier)) - } + }, ) } } fun getResultDetailsNavigationOptions() = configurationRegistry.retrieveConfiguration( - configClassification = QuestConfigClassification.RESULT_DETAILS_NAVIGATION + configClassification = QuestConfigClassification.RESULT_DETAILS_NAVIGATION, ) override fun configureViews(viewConfiguration: DataDetailsListViewConfiguration) { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsScreen.kt index f02061352c..f4edece8d4 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsScreen.kt @@ -83,9 +83,11 @@ fun SimpleDetailsScreen(dataProvider: SimpleDetailsDataProvider) { navigationIcon = { IconButton( onClick = { dataProvider.onBackPressed(true) }, - Modifier.testTag(DETAILS_TOOLBAR_BACK_ARROW) - ) { Icon(Icons.Filled.ArrowBack, contentDescription = "Back arrow") } - } + Modifier.testTag(DETAILS_TOOLBAR_BACK_ARROW), + ) { + Icon(Icons.Filled.ArrowBack, contentDescription = "Back arrow") + } + }, ) Column(modifier = Modifier.padding(5.dp).testTag(DETAILS_DATA_ROWS)) { @@ -96,7 +98,9 @@ fun SimpleDetailsScreen(dataProvider: SimpleDetailsDataProvider) { r.cells.forEach { c -> if (c.filter.properties?.labelDirection == Direction.UP) { Column(modifier = Modifier.weight(1f).padding(5.dp)) { DetailsViewCell(c) } - } else Row(modifier = Modifier.weight(1f).padding(5.dp)) { DetailsViewCell(c) } + } else { + Row(modifier = Modifier.weight(1f).padding(5.dp)) { DetailsViewCell(c) } + } } } @@ -104,7 +108,7 @@ fun SimpleDetailsScreen(dataProvider: SimpleDetailsDataProvider) { if (r.cells.size == 0) { Divider( color = colorResource(id = R.color.white_smoke), - modifier = Modifier.padding(2.dp) + modifier = Modifier.padding(2.dp), ) } } @@ -115,7 +119,7 @@ fun SimpleDetailsScreen(dataProvider: SimpleDetailsDataProvider) { Column( modifier = Modifier.padding(20.dp).fillMaxWidth().fillMaxHeight(), verticalArrangement = Arrangement.Bottom, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Button(onClick = { dataProvider.onBackPressed(true) }) { Text(text = stringResource(R.string.done), fontSize = 20.sp) @@ -136,7 +140,7 @@ fun DetailsViewCell(cell: DetailsViewItemCell) { this.properties?.value, cell.value, this.dynamicColors, - this.properties?.valueFormatter + this.properties?.valueFormatter, ) } } @@ -147,7 +151,7 @@ fun TextView( property: Property?, value: Base?, colors: List?, - valueFormatter: Map? + valueFormatter: Map?, ) { val valueStr = value.valueToString() val dynamicColor = getColor(valueStr, colors) @@ -180,10 +184,12 @@ fun emptyView() { object : SimpleDetailsDataProvider { override val onBackPressClicked: LiveData = MutableLiveData(true) + override fun onBackPressed(back: Boolean) {} + override val detailsViewItem: LiveData get() = MutableLiveData(null) - } + }, ) } @@ -195,14 +201,14 @@ fun simpleDetailsScreenView1() { Properties( labelDirection = Direction.UP, label = Property(color = "FF888888", textSize = 15), - value = Property(textSize = 30) + value = Property(textSize = 30), ) val row3Props = Properties( labelDirection = Direction.UP, label = Property(color = "FF888888", textSize = 15), - value = Property(textSize = 40) + value = Property(textSize = 40), ) val row4Props = @@ -211,15 +217,15 @@ fun simpleDetailsScreenView1() { valueFormatter = mapOf( "Dynamic Value 1" to "Dynamic value 1 with a different text with value One", - "Dynamic Value 2" to "Dynamic value 2 with a different text with value Two" - ) + "Dynamic Value 2" to "Dynamic value 2 with a different text with value Two", + ), ) val row5Props = Properties( labelDirection = Direction.UP, label = Property(color = "FF888888", textSize = 15), - value = Property(textSize = 40) + value = Property(textSize = 40), ) val row6Props = @@ -228,14 +234,16 @@ fun simpleDetailsScreenView1() { valueFormatter = mapOf( "Dynamic Value 1" to "Another Dynamic value 1 having a different sample text", - "Dynamic Value 2" to "Another Dynamic value 2 having a different sample text" - ) + "Dynamic Value 2" to "Another Dynamic value 2 having a different sample text", + ), ) SimpleDetailsScreen( object : SimpleDetailsDataProvider { override val onBackPressClicked: LiveData = MutableLiveData(true) + override fun onBackPressed(back: Boolean) {} + override val detailsViewItem: LiveData get() = MutableLiveData( @@ -248,13 +256,13 @@ fun simpleDetailsScreenView1() { mutableListOf( DetailsViewItemCell( StringType("Val 1"), - filterOf("key 1", "Sample Label 1", row1Props) + filterOf("key 1", "Sample Label 1", row1Props), ), DetailsViewItemCell( StringType("Val 2"), - filterOf("key 2", "Sample Label Two", row1Props) - ) - ) + filterOf("key 2", "Sample Label Two", row1Props), + ), + ), ), // section 2 DetailsViewItemRow(), @@ -263,18 +271,18 @@ fun simpleDetailsScreenView1() { mutableListOf( DetailsViewItemCell( StringType("Value of Yellow"), - filterOf("key 1", "Label 1", row3Props) - ) - ) + filterOf("key 1", "Label 1", row3Props), + ), + ), ), DetailsViewItemRow( cells = mutableListOf( DetailsViewItemCell( StringType("Dynamic Value 1"), - filterOf("key 1", "What is the value of Label", row4Props) - ) - ) + filterOf("key 1", "What is the value of Label", row4Props), + ), + ), ), // section 3 DetailsViewItemRow( @@ -282,23 +290,23 @@ fun simpleDetailsScreenView1() { mutableListOf( DetailsViewItemCell( StringType("Value of Gray"), - filterOf("key 1", "My test label with long text", row5Props) - ) - ) + filterOf("key 1", "My test label with long text", row5Props), + ), + ), ), DetailsViewItemRow( cells = mutableListOf( DetailsViewItemCell( StringType("Dynamic Value 1"), - filterOf("key 1", "Here is the long value of line", row6Props) - ) - ) - ) - ) - ) + filterOf("key 1", "Here is the long value of line", row6Props), + ), + ), + ), + ), + ), ) - } + }, ) } @@ -313,7 +321,7 @@ fun simpleDetailsScreenView2() { Properties( labelDirection = Direction.UP, label = Property(color = "FF08F00F", textSize = 15), - value = Property(textSize = 40) + value = Property(textSize = 40), ) val row4Props = @@ -322,14 +330,16 @@ fun simpleDetailsScreenView2() { valueFormatter = mapOf( "Dynamic Value 1" to "Dynamic value 1 with a different text with value One", - "Dynamic Value 2" to "Dynamic value 2 with a different text with value Two" - ) + "Dynamic Value 2" to "Dynamic value 2 with a different text with value Two", + ), ) SimpleDetailsScreen( object : SimpleDetailsDataProvider { override val onBackPressClicked: LiveData = MutableLiveData(true) + override fun onBackPressed(back: Boolean) {} + override val detailsViewItem: LiveData get() = MutableLiveData( @@ -342,13 +352,13 @@ fun simpleDetailsScreenView2() { mutableListOf( DetailsViewItemCell( StringType("Val 1"), - filterOf("key 1", "Sample Label 1", row1Props) + filterOf("key 1", "Sample Label 1", row1Props), ), DetailsViewItemCell( StringType("Val 2"), - filterOf("key 2", "Sample Label Two", row1Props) - ) - ) + filterOf("key 2", "Sample Label Two", row1Props), + ), + ), ), DetailsViewItemRow(), DetailsViewItemRow( @@ -356,23 +366,23 @@ fun simpleDetailsScreenView2() { mutableListOf( DetailsViewItemCell( StringType("Value of Magenta"), - filterOf("key 1", "Label 1", row3Props) - ) - ) + filterOf("key 1", "Label 1", row3Props), + ), + ), ), DetailsViewItemRow( cells = mutableListOf( DetailsViewItemCell( StringType("Dynamic Value 2"), - filterOf("key 1", "What is the value of Label", row4Props) - ) - ) - ) - ) - ) + filterOf("key 1", "What is the value of Label", row4Props), + ), + ), + ), + ), + ), ) - } + }, ) } @@ -388,6 +398,6 @@ fun filterOf(key: String, label: String, properties: Properties): Filter { DynamicColor("Value of Yellow", "FFFFFF00"), ), valueType = Enumerations.DataType.CODING, - valueCoding = Code("sys", "cod", "disp") + valueCoding = Code("sys", "cod", "disp"), ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsViewModel.kt index a1408f5953..470ace701f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsViewModel.kt @@ -59,7 +59,7 @@ class SimpleDetailsViewModel @Inject constructor(val patientRepository: PatientR val encounter = patientRepository.loadEncounter(encounterId) val config = patientRepository.configurationRegistry.retrieveConfiguration( - configClassification = QuestConfigClassification.TEST_RESULT_DETAIL_VIEW + configClassification = QuestConfigClassification.TEST_RESULT_DETAIL_VIEW, ) val dataItem = DetailsViewItem() @@ -95,14 +95,14 @@ class SimpleDetailsViewModel @Inject constructor(val patientRepository: PatientR * scale this when needed. Has data sorted by date in descending order */ suspend fun getDataMap( - encounter: Encounter + encounter: Encounter, ): MutableMap> { return mutableMapOf( Enumerations.ResourceType.PATIENT to listOf(getPatient(encounter)), Enumerations.ResourceType.CONDITION to patientRepository.getCondition(encounter, null), Enumerations.ResourceType.OBSERVATION to patientRepository.getObservation(encounter, null), Enumerations.ResourceType.MEDICATIONREQUEST to - patientRepository.getMedicationRequest(encounter, null) + patientRepository.getMedicationRequest(encounter, null), ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileEvent.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileEvent.kt index 127c19c385..32e4fcd236 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileEvent.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileEvent.kt @@ -34,7 +34,7 @@ sealed class PatientProfileEvent { data class OverflowMenuClick( val navController: NavHostController, val context: Context, - val menuId: Int + val menuId: Int, ) : PatientProfileEvent() data class OpenChildProfile(val patientId: String, val navController: NavHostController) : diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileScreen.kt index ffc6be7cc4..f04eb4e7a0 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileScreen.kt @@ -79,9 +79,8 @@ fun PatientProfileScreen( navController: NavHostController, modifier: Modifier = Modifier, appMainViewModel: AppMainViewModel, - patientProfileViewModel: PatientProfileViewModel = hiltViewModel() + patientProfileViewModel: PatientProfileViewModel = hiltViewModel(), ) { - val context = LocalContext.current val profileViewDataState = patientProfileViewModel.patientProfileViewData.collectAsState() val profileViewData by remember { profileViewDataState } @@ -109,26 +108,26 @@ fun PatientProfileScreen( Icon( imageVector = Icons.Outlined.Refresh, contentDescription = null, - tint = Color.White + tint = Color.White, ) } IconButton(onClick = { showOverflowMenu = !showOverflowMenu }) { Icon( imageVector = Icons.Outlined.MoreVert, contentDescription = null, - tint = Color.White + tint = Color.White, ) } DropdownMenu( expanded = showOverflowMenu, - onDismissRequest = { showOverflowMenu = false } + onDismissRequest = { showOverflowMenu = false }, ) { viewState.visibleOverflowMenuItems().forEach { DropdownMenuItem( onClick = { showOverflowMenu = false patientProfileViewModel.onEvent( - PatientProfileEvent.OverflowMenuClick(navController, context, it.id) + PatientProfileEvent.OverflowMenuClick(navController, context, it.id), ) }, contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp), @@ -137,9 +136,10 @@ fun PatientProfileScreen( .fillMaxWidth() .background( color = - if (it.confirmAction) it.titleColor.copy(alpha = 0.1f) - else Color.Transparent - ) + if (it.confirmAction) { + it.titleColor.copy(alpha = 0.1f) + } else Color.Transparent, + ), ) { when (it.id) { R2.id.view_children -> { @@ -148,7 +148,7 @@ fun PatientProfileScreen( R2.id.view_guardians -> { Text( text = stringResource(it.titleResource, profileViewData.guardians.size), - color = it.titleColor + color = it.titleColor, ) } else -> { @@ -158,9 +158,9 @@ fun PatientProfileScreen( } } } - } + }, ) - } + }, ) { innerPadding -> Column(modifier = modifier.fillMaxHeight().fillMaxWidth()) { Box(modifier = Modifier.padding(innerPadding).weight(2.0f)) { @@ -168,9 +168,8 @@ fun PatientProfileScreen( modifier = modifier .verticalScroll(rememberScrollState()) - .background(PatientProfileSectionsBackgroundColor) + .background(PatientProfileSectionsBackgroundColor), ) { - // Personal Data: e.g. sex, age, dob if (tasksId.contains(PatientProfileViewModel.WELCOME_SERVICE_NEWLY_DIAGNOSED)) { PersonalData(profileViewData, color = WelcomeServiceNewlyDiagnosed) @@ -193,18 +192,18 @@ fun PatientProfileScreen( title = { Row( modifier = Modifier.weight(1f), - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.SpaceBetween, ) { Text( text = - stringResource(R.string.next_appointment_date).uppercase(Locale.getDefault()) + stringResource(R.string.next_appointment_date).uppercase(Locale.getDefault()), ) if (appointmentDate != null) Text(text = appointmentDate.asDdMmmYyyy()) } }, onActionClick = {}, showSeeAll = profileViewData.showListsHighlights, - profileViewSection = PatientProfileViewSection.TASKS + profileViewSection = PatientProfileViewSection.TASKS, ) { profileViewData.tasks.forEach { ProfileActionableItem( @@ -214,10 +213,10 @@ fun PatientProfileScreen( PatientProfileEvent.OpenTaskForm( context = context, taskFormId = taskFormId, - taskId = taskId - ) + taskId = taskId, + ), ) - } + }, ) } } @@ -228,16 +227,16 @@ fun PatientProfileScreen( ProfileCard( title = stringResource(R.string.forms), onActionClick = { patientProfileViewModel.onEvent(PatientProfileEvent.SeeAll(it)) }, - profileViewSection = PatientProfileViewSection.FORMS + profileViewSection = PatientProfileViewSection.FORMS, ) { profileViewData.forms.forEach { FormButton( formButtonData = it, onFormClick = { questionnaireId, _ -> patientProfileViewModel.onEvent( - PatientProfileEvent.LoadQuestionnaire(questionnaireId, context) + PatientProfileEvent.LoadQuestionnaire(questionnaireId, context), ) - } + }, ) } } @@ -249,7 +248,7 @@ fun PatientProfileScreen( ProfileCard( title = stringResource(R.string.medical_history), onActionClick = { patientProfileViewModel.onEvent(PatientProfileEvent.SeeAll(it)) }, - profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY + profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY, ) { profileViewData.medicalHistoryData.forEach { ProfileActionableItem(it, onActionClick = { _, _ -> }) @@ -262,7 +261,7 @@ fun PatientProfileScreen( ProfileCard( title = stringResource(R.string.upcoming_services), onActionClick = { patientProfileViewModel.onEvent(PatientProfileEvent.SeeAll(it)) }, - profileViewSection = PatientProfileViewSection.UPCOMING_SERVICES + profileViewSection = PatientProfileViewSection.UPCOMING_SERVICES, ) { profileViewData.upcomingServices.forEach { ProfileActionableItem(it, onActionClick = { _, _ -> }) @@ -275,7 +274,7 @@ fun PatientProfileScreen( ProfileCard( title = stringResource(R.string.service_card), onActionClick = { patientProfileViewModel.onEvent(PatientProfileEvent.SeeAll(it)) }, - profileViewSection = PatientProfileViewSection.SERVICE_CARD + profileViewSection = PatientProfileViewSection.SERVICE_CARD, ) { profileViewData.ancCardData.forEach { ProfileActionableItem(it, onActionClick = { _, _ -> }) @@ -295,11 +294,11 @@ fun PatientProfileScreen( PatientProfileEvent.OpenTaskForm( context = context, taskFormId = PatientProfileViewModel.PATIENT_FINISH_VISIT, - taskId = PatientProfileViewModel.PATIENT_FINISH_VISIT - ) + taskId = PatientProfileViewModel.PATIENT_FINISH_VISIT, + ), ) }, - enabled = profileViewData.tasksCompleted + enabled = profileViewData.tasksCompleted, ) { Text( modifier = Modifier.padding(10.dp), @@ -307,7 +306,7 @@ fun PatientProfileScreen( textAlign = TextAlign.Center, fontSize = 18.sp, fontFamily = FontFamily.SansSerif, - fontWeight = FontWeight.Medium + fontWeight = FontWeight.Medium, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileViewModel.kt index 7eba6a1581..b0fd2d0351 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/PatientProfileViewModel.kt @@ -76,7 +76,7 @@ constructor( val registerRepository: AppRegisterRepository, val configurationRegistry: ConfigurationRegistry, val profileViewDataMapper: ProfileViewDataMapper, - val registerViewDataMapper: RegisterViewDataMapper + val registerViewDataMapper: RegisterViewDataMapper, ) : ViewModel() { val appFeatureName = savedStateHandle.get(NavigationArg.FEATURE) @@ -91,8 +91,8 @@ constructor( var patientProfileUiState: MutableState = mutableStateOf( PatientProfileUiState( - overflowMenuFactory.retrieveOverflowMenuItems(OverflowMenuHost.PATIENT_PROFILE) - ) + overflowMenuFactory.retrieveOverflowMenuItems(OverflowMenuHost.PATIENT_PROFILE), + ), ) private val _patientProfileViewDataFlow = @@ -112,7 +112,9 @@ constructor( object : OnSyncListener { override fun onSync(state: SyncJobStatus) { when (state) { - is SyncJobStatus.Finished, is SyncJobStatus.Failed, is SyncJobStatus.Glitch -> { + is SyncJobStatus.Finished, + is SyncJobStatus.Failed, + is SyncJobStatus.Glitch, -> { isSyncing.value = false fetchPatientProfileDataWithChildren() } @@ -125,7 +127,7 @@ constructor( } } }, - viewModelScope + viewModelScope, ) fetchPatientProfileDataWithChildren() @@ -152,9 +154,9 @@ constructor( PatientProfileUiState( overflowMenuFactory.retrieveOverflowMenuItems( getOverflowMenuHostByPatientType( - (patientProfile as ProfileData.HivProfileData).healthStatus - ) - ) + (patientProfile as ProfileData.HivProfileData).healthStatus, + ), + ), ) } } @@ -171,19 +173,19 @@ constructor( tasks = hivPatientProfileData.tasks.filter { it.isGuardianVisit(applicationConfiguration.taskFilterTagViaMetaCodingSystem) - } + }, ) _patientProfileViewDataFlow.value = - profileViewDataMapper.transformInputToOutputModel(newProfileData) as - ProfileViewData.PatientProfileViewData + profileViewDataMapper.transformInputToOutputModel(newProfileData) + as ProfileViewData.PatientProfileViewData } } fun undoGuardianVisitTasksFilter() { if (patientProfileData != null) { _patientProfileViewDataFlow.value = - profileViewDataMapper.transformInputToOutputModel(patientProfileData!!) as - ProfileViewData.PatientProfileViewData + profileViewDataMapper.transformInputToOutputModel(patientProfileData!!) + as ProfileViewData.PatientProfileViewData } } @@ -196,10 +198,10 @@ constructor( event.context, questionnaireId = event.questionnaireId, clientIdentifier = patientId, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) is PatientProfileEvent.SeeAll -> { - /* TODO(View all records in this category e.g. all medical history, tasks etc) */ + // TODO(View all records in this category e.g. all medical history, tasks etc) } is PatientProfileEvent.OverflowMenuClick -> { when (event.menuId) { @@ -208,7 +210,7 @@ constructor( event.context, questionnaireId = FAMILY_MEMBER_REGISTER_FORM, clientIdentifier = patientId, - questionnaireType = QuestionnaireType.EDIT + questionnaireType = QuestionnaireType.EDIT, ) R.id.guardian_visit -> { isClientVisit.value = false @@ -222,12 +224,14 @@ constructor( val commonParams = NavigationArg.bindArgumentsOf( Pair(NavigationArg.FEATURE, AppFeature.PatientManagement.name), - Pair(NavigationArg.HEALTH_MODULE, HealthModule.HIV) + Pair(NavigationArg.HEALTH_MODULE, HealthModule.HIV), ) event.navController.navigate( - route = "${MainNavigationScreen.PatientGuardians.route}/$patientId$commonParams" - ) { launchSingleTop = true } + route = "${MainNavigationScreen.PatientGuardians.route}/$patientId$commonParams", + ) { + launchSingleTop = true + } } R.id.view_family -> { familyId?.let { @@ -235,10 +239,10 @@ constructor( NavigationArg.bindArgumentsOf( Pair(NavigationArg.FEATURE, AppFeature.HouseholdManagement.name), Pair(NavigationArg.HEALTH_MODULE, HealthModule.FAMILY), - Pair(NavigationArg.PATIENT_ID, it) + Pair(NavigationArg.PATIENT_ID, it), ) event.navController.navigate( - route = MainNavigationScreen.FamilyProfile.route + urlParams + route = MainNavigationScreen.FamilyProfile.route + urlParams, ) } } @@ -248,10 +252,10 @@ constructor( NavigationArg.bindArgumentsOf( Pair(NavigationArg.FEATURE, AppFeature.PatientManagement.name), Pair(NavigationArg.HEALTH_MODULE, HealthModule.HIV), - Pair(NavigationArg.PATIENT_ID, it) + Pair(NavigationArg.PATIENT_ID, it), ) event.navController.navigate( - route = MainNavigationScreen.ViewChildContacts.route + urlParams + route = MainNavigationScreen.ViewChildContacts.route + urlParams, ) } } @@ -260,14 +264,14 @@ constructor( event.context, questionnaireId = REMOVE_FAMILY_FORM, clientIdentifier = patientId, - intentBundle = bundleOf(Pair(NavigationArg.FAMILY_ID, familyId)) + intentBundle = bundleOf(Pair(NavigationArg.FAMILY_ID, familyId)), ) R.id.record_as_anc -> QuestionnaireActivity.launchQuestionnaire( event.context, questionnaireId = ANC_ENROLLMENT_FORM, clientIdentifier = patientId, - questionnaireType = QuestionnaireType.DEFAULT + questionnaireType = QuestionnaireType.DEFAULT, ) R.id.edit_profile -> QuestionnaireActivity.launchQuestionnaire( @@ -275,7 +279,7 @@ constructor( questionnaireId = EDIT_PROFILE_FORM, clientIdentifier = patientId, questionnaireType = QuestionnaireType.DEFAULT, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) R.id.viral_load_results -> QuestionnaireActivity.launchQuestionnaire( @@ -283,7 +287,7 @@ constructor( questionnaireId = VIRAL_LOAD_RESULTS_FORM, clientIdentifier = patientId, questionnaireType = QuestionnaireType.DEFAULT, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) R.id.hiv_test_and_results -> QuestionnaireActivity.launchQuestionnaire( @@ -291,7 +295,7 @@ constructor( questionnaireId = HIV_TEST_AND_RESULTS_FORM, clientIdentifier = patientId, questionnaireType = QuestionnaireType.DEFAULT, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) R.id.hiv_test_and_next_appointment -> QuestionnaireActivity.launchQuestionnaire( @@ -299,7 +303,7 @@ constructor( questionnaireId = HIV_TEST_AND_NEXT_APPOINTMENT_FORM, clientIdentifier = patientId, questionnaireType = QuestionnaireType.DEFAULT, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) R.id.patient_transfer_out -> QuestionnaireActivity.launchQuestionnaire( @@ -307,7 +311,7 @@ constructor( questionnaireId = PATIENT_TRANSFER_OUT, clientIdentifier = patientId, questionnaireType = QuestionnaireType.DEFAULT, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) R.id.patient_change_status -> QuestionnaireActivity.launchQuestionnaire( @@ -315,7 +319,7 @@ constructor( questionnaireId = PATIENT_CHANGE_STATUS, clientIdentifier = patientId, questionnaireType = QuestionnaireType.DEFAULT, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) else -> {} } @@ -326,20 +330,20 @@ constructor( questionnaireId = event.taskFormId, clientIdentifier = patientId, backReference = event.taskId.asReference(ResourceType.Task).reference, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) is PatientProfileEvent.OpenChildProfile -> { val urlParams = NavigationArg.bindArgumentsOf( Pair(NavigationArg.FEATURE, AppFeature.PatientManagement.name), Pair(NavigationArg.HEALTH_MODULE, healthModule), - Pair(NavigationArg.PATIENT_ID, event.patientId) + Pair(NavigationArg.PATIENT_ID, event.patientId), ) - if (healthModule == HealthModule.FAMILY) + if (healthModule == HealthModule.FAMILY) { event.navController.navigate(route = MainNavigationScreen.FamilyProfile.route + urlParams) - else + } else event.navController.navigate( - route = MainNavigationScreen.PatientProfile.route + urlParams + route = MainNavigationScreen.PatientProfile.route + urlParams, ) } } @@ -379,8 +383,8 @@ constructor( registerRepository.loadPatientProfileData(appFeatureName, healthModule, patientId)?.let { patientProfileData = it _patientProfileViewDataFlow.value = - profileViewDataMapper.transformInputToOutputModel(it) as - ProfileViewData.PatientProfileViewData + profileViewDataMapper.transformInputToOutputModel(it) + as ProfileViewData.PatientProfileViewData refreshOverFlowMenu(healthModule = healthModule, patientProfile = it) paginateChildrenRegisterData(true) handleVisitType(isClientVisit.value) @@ -400,19 +404,19 @@ constructor( private fun getPager( appFeatureName: String?, healthModule: HealthModule, - loadAll: Boolean = true + loadAll: Boolean = true, ): Pager = Pager( config = PagingConfig( pageSize = RegisterPagingSource.DEFAULT_PAGE_SIZE, - initialLoadSize = RegisterPagingSource.DEFAULT_INITIAL_LOAD_SIZE + initialLoadSize = RegisterPagingSource.DEFAULT_INITIAL_LOAD_SIZE, ), pagingSourceFactory = { ChildContactPagingSource( patientProfileViewData.value.otherPatients, registerRepository, - registerViewDataMapper + registerViewDataMapper, ) .apply { setPatientPagingSourceState( @@ -420,11 +424,11 @@ constructor( appFeatureName = appFeatureName, healthModule = healthModule, loadAll = loadAll, - currentPage = 0 - ) + currentPage = 0, + ), ) } - } + }, ) companion object { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/childcontact/ChildContactPagingSource.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/childcontact/ChildContactPagingSource.kt index bfd74111f2..01b0e15873 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/childcontact/ChildContactPagingSource.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/childcontact/ChildContactPagingSource.kt @@ -26,12 +26,12 @@ import org.smartregister.fhircore.quest.util.mappers.RegisterViewDataMapper /** * @property _patientPagingSourceState as state containing the properties used in the - * [AppRegisterRepository] function for loading data to the paging source. + * [AppRegisterRepository] function for loading data to the paging source. */ class ChildContactPagingSource( private val otherChildResource: List, private val registerRepository: AppRegisterRepository, - private val registerViewDataMapper: RegisterViewDataMapper + private val registerViewDataMapper: RegisterViewDataMapper, ) : PagingSource() { private var _patientPagingSourceState = PatientPagingSourceState() @@ -51,9 +51,10 @@ class ChildContactPagingSource( override suspend fun load(params: LoadParams): LoadResult { return try { val data = - registerRepository.loadChildrenRegisterData( + registerRepository + .loadChildrenRegisterData( healthModule = _patientPagingSourceState.healthModule, - otherPatientResource = otherChildResource + otherPatientResource = otherChildResource, ) .map { registerViewDataMapper.transformInputToOutputModel(it) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/childcontact/ChildContactsProfileScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/childcontact/ChildContactsProfileScreen.kt index 8b09f8f47e..e3418459c2 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/childcontact/ChildContactsProfileScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/childcontact/ChildContactsProfileScreen.kt @@ -49,14 +49,12 @@ import org.smartregister.fhircore.quest.ui.shared.models.RegisterViewData fun ChildContactsProfileScreen( navController: NavHostController, modifier: Modifier = Modifier, - patientProfileViewModel: PatientProfileViewModel = hiltViewModel() + patientProfileViewModel: PatientProfileViewModel = hiltViewModel(), ) { - val profileViewData = patientProfileViewModel.patientProfileViewData.value val pagingItems: LazyPagingItems = - patientProfileViewModel - .paginatedChildrenRegisterData + patientProfileViewModel.paginatedChildrenRegisterData .collectAsState(emptyFlow()) .value .collectAsLazyPagingItems() @@ -71,9 +69,9 @@ fun ChildContactsProfileScreen( IconButton(onClick = { navController.popBackStack() }) { Icon(Icons.Filled.ArrowBack, null) } - } + }, ) - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { Column(modifier = modifier.background(PatientProfileSectionsBackgroundColor)) { @@ -82,9 +80,9 @@ fun ChildContactsProfileScreen( pagingItems = pagingItems, onRowClick = { patientId: String -> patientProfileViewModel.onEvent( - PatientProfileEvent.OpenChildProfile(patientId, navController) + PatientProfileEvent.OpenChildProfile(patientId, navController), ) - } + }, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/PersonalData.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/PersonalData.kt index 36d0ea67b7..16770c0567 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/PersonalData.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/PersonalData.kt @@ -47,7 +47,7 @@ import org.smartregister.fhircore.quest.ui.shared.models.ProfileViewData fun PersonalData( patientProfileViewData: ProfileViewData.PatientProfileViewData, modifier: Modifier = Modifier, - color: androidx.compose.ui.graphics.Color = MaterialTheme.colors.background + color: androidx.compose.ui.graphics.Color = MaterialTheme.colors.background, ) { Card(elevation = 3.dp, modifier = modifier.fillMaxWidth(), backgroundColor = color) { Column(modifier = modifier.padding(16.dp)) { @@ -56,14 +56,14 @@ fun PersonalData( fontWeight = FontWeight.Bold, fontSize = 18.sp, maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) if (patientProfileViewData.status != null) { Text( text = patientProfileViewData.status, color = StatusTextColor, fontSize = 18.sp, - modifier = modifier.padding(vertical = 10.dp) + modifier = modifier.padding(vertical = 10.dp), ) } if (patientProfileViewData.identifier != null) { @@ -72,7 +72,7 @@ fun PersonalData( R.string.id, patientProfileViewData.identifier.ifEmpty { stringResource(R.string.identifier_unassigned) - } + }, ) if (patientProfileViewData.showIdentifierInProfile) { idKeyValue = @@ -81,14 +81,14 @@ fun PersonalData( patientProfileViewData.identifierKey, patientProfileViewData.identifier.ifEmpty { stringResource(R.string.identifier_unassigned) - } + }, ) Text( text = idKeyValue, color = StatusTextColor, fontSize = 18.sp, maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) } } @@ -96,7 +96,7 @@ fun PersonalData( Row( horizontalArrangement = Arrangement.SpaceBetween, modifier = - modifier.clip(RoundedCornerShape(size = 8.dp)).background(PersonalDataBackgroundColor) + modifier.clip(RoundedCornerShape(size = 8.dp)).background(PersonalDataBackgroundColor), ) { OtherDetailsItem(title = stringResource(R.string.sex), value = patientProfileViewData.sex) OtherDetailsItem(title = stringResource(R.string.age), value = patientProfileViewData.age) @@ -124,7 +124,7 @@ fun PersonalDataPreview() { sex = "Female", age = "48y", dob = "08 Dec", - identifier = "123455" + identifier = "123455", ) PersonalData(patientProfileViewData = patientProfileData) } @@ -142,7 +142,7 @@ fun PersonalDataPreviewWithARTNumber() { dob = "08 Dec", identifier = "123455", identifierKey = "HCC Number", - showIdentifierInProfile = true + showIdentifierInProfile = true, ) PersonalData(patientProfileViewData = patientProfileData) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/ProfileActionableItem.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/ProfileActionableItem.kt index b658f9d000..86ef981f7a 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/ProfileActionableItem.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/ProfileActionableItem.kt @@ -66,14 +66,15 @@ fun ProfileActionableItem( Row( modifier = modifier.fillMaxWidth().padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { if (patientProfileRowItem.title.isEmpty() && patientProfileRowItem.subtitle.isEmpty()) { ActionButton(patientProfileRowItem, modifier = modifier.fillMaxWidth(1f), onActionClick) } else { Row(verticalAlignment = Alignment.CenterVertically) { - if (patientProfileRowItem.profileViewSection == - PatientProfileViewSection.UPCOMING_SERVICES && patientProfileRowItem.startIcon != null + if ( + patientProfileRowItem.profileViewSection == PatientProfileViewSection.UPCOMING_SERVICES && + patientProfileRowItem.startIcon != null ) { Box( contentAlignment = Alignment.Center, @@ -84,7 +85,7 @@ fun ProfileActionableItem( .background( patientProfileRowItem.startIconBackgroundColor ?: DefaultColor.copy(alpha = 0.3f), ) - .padding(8.dp) + .padding(8.dp), ) { Image( painter = painterResource(patientProfileRowItem.startIcon), @@ -92,9 +93,10 @@ fun ProfileActionableItem( contentScale = ContentScale.FillBounds, colorFilter = ColorFilter.tint( - if (patientProfileRowItem.startIconBackgroundColor != null) Color.White - else Color.Black.copy(alpha = 0.5f) - ) + if (patientProfileRowItem.startIconBackgroundColor != null) { + Color.White + } else Color.Black.copy(alpha = 0.5f), + ), ) } } @@ -113,9 +115,10 @@ fun ProfileActionableItem( private fun ActionButton( patientProfileRowItem: PatientProfileRowItem, modifier: Modifier, - onActionClick: (String, String) -> Unit + onActionClick: (String, String) -> Unit, ) { - if (patientProfileRowItem.profileViewSection == PatientProfileViewSection.TASKS && + if ( + patientProfileRowItem.profileViewSection == PatientProfileViewSection.TASKS && patientProfileRowItem.actionButtonColor != null && patientProfileRowItem.actionButtonText != null ) { @@ -130,13 +133,13 @@ private fun ActionButton( ButtonDefaults.buttonColors( backgroundColor = patientProfileRowItem.actionButtonColor.copy(alpha = 0.2f), contentColor = patientProfileRowItem.actionButtonColor, - ) + ), ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( imageVector = patientProfileRowItem.actionButtonIcon, contentDescription = null, - tint = patientProfileRowItem.actionIconColor ?: patientProfileRowItem.actionButtonColor + tint = patientProfileRowItem.actionIconColor ?: patientProfileRowItem.actionButtonColor, ) Text(text = patientProfileRowItem.actionButtonText) } @@ -145,7 +148,7 @@ private fun ActionButton( Icon( imageVector = Icons.Outlined.ChevronRight, contentDescription = null, - tint = DefaultColor.copy(0.7f) + tint = DefaultColor.copy(0.7f), ) } } @@ -156,10 +159,11 @@ private fun TitleRow(patientProfileRowItem: PatientProfileRowItem, modifier: Mod Text( text = patientProfileRowItem.title, fontWeight = FontWeight.SemiBold, - modifier = modifier.padding(end = 8.dp) + modifier = modifier.padding(end = 8.dp), ) - if (patientProfileRowItem.titleIcon != null) + if (patientProfileRowItem.titleIcon != null) { Image(painter = painterResource(patientProfileRowItem.titleIcon), contentDescription = null) + } } } @@ -170,10 +174,10 @@ private fun SubtitleRow(patientProfileRowItem: PatientProfileRowItem, modifier: text = patientProfileRowItem.subtitle, color = StatusTextColor, fontSize = 12.sp, - modifier = modifier.padding(end = 8.dp) + modifier = modifier.padding(end = 8.dp), ) if (patientProfileRowItem.showDot) Separator() - if (patientProfileRowItem.subtitleStatus != null) + if (patientProfileRowItem.subtitleStatus != null) { Text( text = patientProfileRowItem.subtitleStatus, color = patientProfileRowItem.subtitleStatusColor ?: StatusTextColor, @@ -181,13 +185,15 @@ private fun SubtitleRow(patientProfileRowItem: PatientProfileRowItem, modifier: modifier .clip(RoundedCornerShape(6.dp)) .background( - if (patientProfileRowItem.showDot) Color.Transparent - else + if (patientProfileRowItem.showDot) { + Color.Transparent + } else patientProfileRowItem.subtitleStatusColor?.copy(alpha = 0.2f) - ?: StatusTextColor.copy(alpha = 0.2f) + ?: StatusTextColor.copy(alpha = 0.2f), ) - .padding(4.dp) + .padding(4.dp), ) + } } } @@ -203,9 +209,9 @@ fun ProfileActionableItemForTasksPreview() { subtitle = "due date", profileViewSection = PatientProfileViewSection.TASKS, actionButtonColor = InfoColor, - actionButtonText = "ANC visit" + actionButtonText = "ANC visit", ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -216,9 +222,9 @@ fun ProfileActionableItemForTasksPreview() { subtitle = "due date", profileViewSection = PatientProfileViewSection.TASKS, actionButtonColor = OverdueColor, - actionButtonText = "Malaria medicine" + actionButtonText = "Malaria medicine", ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) } } @@ -235,9 +241,9 @@ fun ProfileActionableItemForVisitPreview() { subtitle = "", profileViewSection = PatientProfileViewSection.TASKS, actionButtonColor = InfoColor, - actionButtonText = "ANC visit" + actionButtonText = "ANC visit", ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -248,9 +254,9 @@ fun ProfileActionableItemForVisitPreview() { subtitle = "", profileViewSection = PatientProfileViewSection.TASKS, actionButtonColor = OverdueColor, - actionButtonText = "Malaria medicine" + actionButtonText = "Malaria medicine", ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) } } @@ -264,9 +270,9 @@ fun ProfileActionableItemForAncCardPreview() { id = "1", title = "Granuloma Annulare", subtitle = "23 weeks (EDD: 20-Jun-2021)", - profileViewSection = PatientProfileViewSection.SERVICE_CARD + profileViewSection = PatientProfileViewSection.SERVICE_CARD, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -276,9 +282,9 @@ fun ProfileActionableItemForAncCardPreview() { subtitle = "111/80", subtitleStatus = "at risk", subtitleStatusColor = WarningColor, - profileViewSection = PatientProfileViewSection.SERVICE_CARD + profileViewSection = PatientProfileViewSection.SERVICE_CARD, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -288,9 +294,9 @@ fun ProfileActionableItemForAncCardPreview() { subtitle = "186", subtitleStatus = "danger", subtitleStatusColor = DangerColor, - profileViewSection = PatientProfileViewSection.SERVICE_CARD + profileViewSection = PatientProfileViewSection.SERVICE_CARD, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -300,9 +306,9 @@ fun ProfileActionableItemForAncCardPreview() { subtitle = "+ 6.7kg", subtitleStatus = "good", subtitleStatusColor = DefaultColor, - profileViewSection = PatientProfileViewSection.SERVICE_CARD + profileViewSection = PatientProfileViewSection.SERVICE_CARD, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) } } @@ -316,9 +322,9 @@ fun ProfileActionableItemForMedicalHistoryPreview() { id = "1", title = "Diarrhoea", subtitle = "Stomach ache, with painful running stomach", - profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY + profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -326,9 +332,9 @@ fun ProfileActionableItemForMedicalHistoryPreview() { id = "2", title = "Malaria", subtitle = "High temperatures and loss of appetite, long sleepless nights", - profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY + profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -336,9 +342,9 @@ fun ProfileActionableItemForMedicalHistoryPreview() { id = "3", title = "Health issue", subtitle = "Description of symptoms", - profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY + profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) } } @@ -355,9 +361,9 @@ fun ProfileActionableItemForTestResultsPreview() { subtitleStatus = "Hb: 2.2", profileViewSection = PatientProfileViewSection.TEST_RESULTS, showDot = true, - showAngleRightIcon = true + showAngleRightIcon = true, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -368,9 +374,9 @@ fun ProfileActionableItemForTestResultsPreview() { subtitleStatus = "Hb: 9.0", profileViewSection = PatientProfileViewSection.TEST_RESULTS, showDot = true, - showAngleRightIcon = true + showAngleRightIcon = true, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -381,9 +387,9 @@ fun ProfileActionableItemForTestResultsPreview() { subtitleStatus = "Hb: 2.0", profileViewSection = PatientProfileViewSection.TEST_RESULTS, showDot = true, - showAngleRightIcon = true + showAngleRightIcon = true, ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) } } @@ -399,9 +405,9 @@ fun ProfileActionableItemForUpcomingServicesPreview() { subtitle = "22-May-2021", profileViewSection = PatientProfileViewSection.UPCOMING_SERVICES, startIcon = R.drawable.gm_calendar_today_24, - startIconBackgroundColor = WarningColor.copy(alpha = 0.7f) + startIconBackgroundColor = WarningColor.copy(alpha = 0.7f), ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -411,9 +417,9 @@ fun ProfileActionableItemForUpcomingServicesPreview() { subtitle = "25-Aug-2021", profileViewSection = PatientProfileViewSection.UPCOMING_SERVICES, startIcon = R.drawable.ic_households, - startIconBackgroundColor = DangerColor.copy(alpha = 0.6f) + startIconBackgroundColor = DangerColor.copy(alpha = 0.6f), ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -423,9 +429,9 @@ fun ProfileActionableItemForUpcomingServicesPreview() { subtitle = "03-Sept-2021", profileViewSection = PatientProfileViewSection.UPCOMING_SERVICES, startIcon = R.drawable.ic_needle, - startIconBackgroundColor = InfoColor.copy(alpha = 0.5f) + startIconBackgroundColor = InfoColor.copy(alpha = 0.5f), ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/ProfileCard.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/ProfileCard.kt index 10d9161e52..0d80d943b3 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/ProfileCard.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/components/ProfileCard.kt @@ -52,7 +52,7 @@ fun ProfileCard( onActionClick: ((PatientProfileViewSection) -> Unit), showSeeAll: Boolean = true, modifier: Modifier = Modifier, - body: (@Composable() () -> Unit) + body: (@Composable() () -> Unit), ) { ProfileCard( title = { Text(text = title.uppercase(Locale.getDefault())) }, @@ -60,7 +60,7 @@ fun ProfileCard( onActionClick = onActionClick, showSeeAll, modifier, - body + body, ) } @@ -71,31 +71,31 @@ fun ProfileCard( onActionClick: (PatientProfileViewSection) -> Unit, showSeeAll: Boolean = true, modifier: Modifier = Modifier, - body: (@Composable() () -> Unit) + body: (@Composable() () -> Unit), ) { Column { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, - modifier = modifier.fillMaxWidth().padding(start = 16.dp, end = 16.dp, top = 16.dp) + modifier = modifier.fillMaxWidth().padding(start = 16.dp, end = 16.dp, top = 16.dp), ) { title() if (showSeeAll) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = modifier.clickable { onActionClick(profileViewSection) } + modifier = modifier.clickable { onActionClick(profileViewSection) }, ) { TextButton(onClick = { onActionClick(profileViewSection) }) { Text( text = stringResource(R.string.see_all).uppercase(Locale.getDefault()), - color = InfoColor + color = InfoColor, ) } Icon( imageVector = Icons.Outlined.ChevronRight, contentDescription = null, - tint = InfoColor + tint = InfoColor, ) } } @@ -103,8 +103,10 @@ fun ProfileCard( Card( elevation = 5.dp, - modifier = modifier.fillMaxWidth().clip(RoundedCornerShape(6.dp)).padding(16.dp) - ) { Column { body() } } + modifier = modifier.fillMaxWidth().clip(RoundedCornerShape(6.dp)).padding(16.dp), + ) { + Column { body() } + } } } @@ -114,7 +116,7 @@ private fun PatientProfileSectionPreview() { ProfileCard( title = "TASKS", onActionClick = {}, - profileViewSection = PatientProfileViewSection.TASKS + profileViewSection = PatientProfileViewSection.TASKS, ) { Column { ProfileActionableItem( @@ -125,9 +127,9 @@ private fun PatientProfileSectionPreview() { subtitle = "due date", profileViewSection = PatientProfileViewSection.TASKS, actionButtonColor = InfoColor, - actionButtonText = "ANC visit" + actionButtonText = "ANC visit", ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) Divider() ProfileActionableItem( @@ -138,9 +140,9 @@ private fun PatientProfileSectionPreview() { subtitle = "due date", profileViewSection = PatientProfileViewSection.TASKS, actionButtonColor = OverdueColor, - actionButtonText = "Malaria medicine" + actionButtonText = "Malaria medicine", ), - onActionClick = { _, _ -> } + onActionClick = { _, _ -> }, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianNotOnARTProfileScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianNotOnARTProfileScreen.kt index c24dc1d2d8..5e3cbfe982 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianNotOnARTProfileScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianNotOnARTProfileScreen.kt @@ -59,7 +59,7 @@ import org.smartregister.fhircore.quest.ui.shared.models.PatientProfileViewSecti fun GuardianRelatedPersonProfileScreen( onBackPress: () -> Unit, modifier: Modifier = Modifier, - viewModel: GuardianNotOnARTProfileViewModel = hiltViewModel() + viewModel: GuardianNotOnARTProfileViewModel = hiltViewModel(), ) { val context = LocalContext.current val profileViewData = viewModel.profileViewData.value @@ -78,12 +78,12 @@ fun GuardianRelatedPersonProfileScreen( Icon( imageVector = Icons.Outlined.MoreVert, contentDescription = null, - tint = Color.White + tint = Color.White, ) } DropdownMenu( expanded = showOverflowMenu, - onDismissRequest = { showOverflowMenu = false } + onDismissRequest = { showOverflowMenu = false }, ) { viewState.visibleOverflowMenuItems().forEach { DropdownMenuItem( @@ -97,9 +97,10 @@ fun GuardianRelatedPersonProfileScreen( .fillMaxWidth() .background( color = - if (it.confirmAction) it.titleColor.copy(alpha = 0.1f) - else Color.Transparent - ) + if (it.confirmAction) { + it.titleColor.copy(alpha = 0.1f) + } else Color.Transparent, + ), ) { when (it.id) { R.id.view_children -> { @@ -108,7 +109,7 @@ fun GuardianRelatedPersonProfileScreen( R.id.view_guardians -> { Text( text = stringResource(it.titleResource, profileViewData.guardians.size), - color = it.titleColor + color = it.titleColor, ) } else -> { @@ -118,16 +119,16 @@ fun GuardianRelatedPersonProfileScreen( } } } - } + }, ) - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { Column( modifier = modifier .verticalScroll(rememberScrollState()) - .background(PatientProfileSectionsBackgroundColor) + .background(PatientProfileSectionsBackgroundColor), ) { // Personal Data: e.g. sex, age, dob PersonalData(profileViewData) @@ -139,7 +140,7 @@ fun GuardianRelatedPersonProfileScreen( stringResource(org.smartregister.fhircore.engine.R.string.clinic_visits).uppercase(), onActionClick = {}, showSeeAll = profileViewData.showListsHighlights, - profileViewSection = PatientProfileViewSection.TASKS + profileViewSection = PatientProfileViewSection.TASKS, ) { profileViewData.tasks.forEach { ProfileActionableItem( @@ -149,10 +150,10 @@ fun GuardianRelatedPersonProfileScreen( PatientProfileEvent.OpenTaskForm( context = context, taskFormId = taskFormId, - taskId = taskId - ) + taskId = taskId, + ), ) - } + }, ) } } @@ -163,14 +164,14 @@ fun GuardianRelatedPersonProfileScreen( ProfileCard( title = stringResource(org.smartregister.fhircore.engine.R.string.forms), onActionClick = { viewModel.onEvent(PatientProfileEvent.SeeAll(it)) }, - profileViewSection = PatientProfileViewSection.FORMS + profileViewSection = PatientProfileViewSection.FORMS, ) { profileViewData.forms.forEach { FormButton( formButtonData = it, onFormClick = { questionnaireId, _ -> viewModel.onEvent(PatientProfileEvent.LoadQuestionnaire(questionnaireId, context)) - } + }, ) } } @@ -182,7 +183,7 @@ fun GuardianRelatedPersonProfileScreen( ProfileCard( title = stringResource(org.smartregister.fhircore.engine.R.string.medical_history), onActionClick = { viewModel.onEvent(PatientProfileEvent.SeeAll(it)) }, - profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY + profileViewSection = PatientProfileViewSection.MEDICAL_HISTORY, ) { profileViewData.medicalHistoryData.forEach { ProfileActionableItem(it, onActionClick = { _, _ -> }) @@ -195,7 +196,7 @@ fun GuardianRelatedPersonProfileScreen( ProfileCard( title = stringResource(org.smartregister.fhircore.engine.R.string.upcoming_services), onActionClick = { viewModel.onEvent(PatientProfileEvent.SeeAll(it)) }, - profileViewSection = PatientProfileViewSection.UPCOMING_SERVICES + profileViewSection = PatientProfileViewSection.UPCOMING_SERVICES, ) { profileViewData.upcomingServices.forEach { ProfileActionableItem(it, onActionClick = { _, _ -> }) @@ -208,7 +209,7 @@ fun GuardianRelatedPersonProfileScreen( ProfileCard( title = stringResource(org.smartregister.fhircore.engine.R.string.service_card), onActionClick = { viewModel.onEvent(PatientProfileEvent.SeeAll(it)) }, - profileViewSection = PatientProfileViewSection.SERVICE_CARD + profileViewSection = PatientProfileViewSection.SERVICE_CARD, ) { profileViewData.ancCardData.forEach { ProfileActionableItem(it, onActionClick = { _, _ -> }) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianNotOnARTProfileViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianNotOnARTProfileViewModel.kt index 465439321b..dac908d18b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianNotOnARTProfileViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianNotOnARTProfileViewModel.kt @@ -49,7 +49,7 @@ constructor( syncBroadcaster: SyncBroadcaster, val overflowMenuFactory: OverflowMenuFactory, val profileViewDataMapper: ProfileViewDataMapper, - val repository: HivPatientGuardianRepository + val repository: HivPatientGuardianRepository, ) : ViewModel() { // Get your argument from the SavedStateHandle private val guardianId: String = savedStateHandle[NavigationArg.PATIENT_ID]!! @@ -68,12 +68,13 @@ constructor( object : OnSyncListener { override fun onSync(state: SyncJobStatus) { when (state) { - is SyncJobStatus.Finished, is SyncJobStatus.Failed -> getProfileData() + is SyncJobStatus.Finished, + is SyncJobStatus.Failed, -> getProfileData() else -> {} } } }, - viewModelScope + viewModelScope, ) getProfileData() } @@ -82,8 +83,8 @@ constructor( viewModelScope.launch { repository.loadGuardianNotOnARTProfile(guardianId).let { profileViewData.value = - profileViewDataMapper.transformInputToOutputModel(it) as - ProfileViewData.PatientProfileViewData + profileViewDataMapper.transformInputToOutputModel(it) + as ProfileViewData.PatientProfileViewData } guardianResource = repository.loadRelatedPerson(guardianId) patientId = IdType(guardianResource?.patient?.reference).idPart @@ -98,7 +99,7 @@ constructor( questionnaireId = FORM.EDIT_PROFILE, clientIdentifier = patientId, populationResources = - if (guardianResource != null) arrayListOf(guardianResource!!) else null + if (guardianResource != null) arrayListOf(guardianResource!!) else null, ) R.id.remove_hiv_patient -> QuestionnaireActivity.launchQuestionnaire( @@ -106,7 +107,7 @@ constructor( questionnaireId = FORM.REMOVE_PERSON, clientIdentifier = patientId, populationResources = - if (guardianResource != null) arrayListOf(guardianResource!!) else null + if (guardianResource != null) arrayListOf(guardianResource!!) else null, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianRegisterUiState.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianRegisterUiState.kt index 900a3cfebf..3a77a6ea1b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianRegisterUiState.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianRegisterUiState.kt @@ -22,10 +22,10 @@ typealias GuardianProfileNavRoute = String data class GuardianUiState( val patientFirstName: String, - val registerViewData: List + val registerViewData: List, ) data class GuardianPatientRegisterData( val profileNavRoute: GuardianProfileNavRoute, - val viewData: RegisterViewData + val viewData: RegisterViewData, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianRegisterViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianRegisterViewModel.kt index b841da086c..c5e17d3b33 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianRegisterViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardianRegisterViewModel.kt @@ -44,7 +44,7 @@ constructor( savedStateHandle: SavedStateHandle, syncBroadcaster: SyncBroadcaster, val repository: HivPatientGuardianRepository, - val registerViewDataMapper: RegisterViewDataMapper + val registerViewDataMapper: RegisterViewDataMapper, ) : ViewModel() { // Get your argument from the SavedStateHandle @@ -63,12 +63,13 @@ constructor( object : OnSyncListener { override fun onSync(state: SyncState) { when (state) { - is SyncState.Finished, is SyncState.Failed -> loadData() + is SyncState.Finished, + is SyncState.Failed, -> loadData() else -> {} } } }, - viewModelScope + viewModelScope, ) loadData() } @@ -83,13 +84,13 @@ constructor( .map { GuardianPatientRegisterData( viewData = registerViewDataMapper.transformInputToOutputModel(it), - profileNavRoute = getRoute(it) + profileNavRoute = getRoute(it), ) } _guardianUiDetails.value = GuardianUiState( patientFirstName = patient.extractFirstName(), - registerViewData = guardiansRegisterViewData + registerViewData = guardiansRegisterViewData, ) } } @@ -98,14 +99,14 @@ constructor( val commonNavArgs = listOf( Pair(NavigationArg.FEATURE, appFeatureName), - Pair(NavigationArg.HEALTH_MODULE, healthModule) + Pair(NavigationArg.HEALTH_MODULE, healthModule), ) val navArgs = commonNavArgs + Pair( NavigationArg.ON_ART, - (registerData.healthStatus != HealthStatus.NOT_ON_ART).toString() + (registerData.healthStatus != HealthStatus.NOT_ON_ART).toString(), ) val urlParams = NavigationArg.bindArgumentsOf(*navArgs.toTypedArray()) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardiansRegisterScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardiansRegisterScreen.kt index 4d9b865c8b..d310d5a62f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardiansRegisterScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/profile/guardians/GuardiansRegisterScreen.kt @@ -43,7 +43,7 @@ import org.smartregister.fhircore.quest.ui.shared.models.RegisterViewData fun GuardiansRoute( navigateRoute: (String) -> Unit, onBackPress: () -> Unit, - viewModel: GuardianRegisterViewModel = hiltViewModel() + viewModel: GuardianRegisterViewModel = hiltViewModel(), ) { val uiState by viewModel.guardianUiDetails @@ -51,7 +51,7 @@ fun GuardiansRoute( navigateRoute = navigateRoute, onBackPress = onBackPress, patientFirstName = uiState.patientFirstName, - viewGuardiansData = uiState.registerViewData + viewGuardiansData = uiState.registerViewData, ) } @@ -60,7 +60,7 @@ fun GuardiansRegisterScreen( navigateRoute: (String) -> Unit, onBackPress: () -> Unit, patientFirstName: String, - viewGuardiansData: List + viewGuardiansData: List, ) { Scaffold( topBar = { @@ -70,15 +70,15 @@ fun GuardiansRegisterScreen( IconButton(onClick = { onBackPress() }) { Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = null) } - } + }, ) - } + }, ) { contentPadding -> LazyColumn(modifier = Modifier.padding(contentPadding)) { items(viewGuardiansData, key = { it.viewData.logicalId }) { viewGuardianItem -> HivPatientRegisterListRow( data = viewGuardianItem.viewData, - onItemClick = { navigateRoute(viewGuardianItem.profileNavRoute) } + onItemClick = { navigateRoute(viewGuardianItem.profileNavRoute) }, ) } } @@ -104,7 +104,7 @@ fun PreviewGuardiansScreen() { serviceButtonBackgroundColor = FemalePinkColor, registerType = RegisterData.HivRegisterData::class, ), - profileNavRoute = "*TODO*" + profileNavRoute = "*TODO*", ), GuardianPatientRegisterData( viewData = @@ -117,9 +117,9 @@ fun PreviewGuardiansScreen() { serviceButtonBackgroundColor = MaleBlueColor, registerType = RegisterData.HivRegisterData::class, ), - profileNavRoute = "*TODO*" - ) + profileNavRoute = "*TODO*", + ), ), - navigateRoute = { /*TODO*/} + navigateRoute = { /*TODO*/}, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientItemMapper.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientItemMapper.kt index 50bcd03cb8..069648e7bc 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientItemMapper.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientItemMapper.kt @@ -52,11 +52,11 @@ class PatientItemMapper @Inject constructor(@ApplicationContext val context: Con district = inputModel.extractWithFhirPath("Patient.address.district"), state = inputModel.extractWithFhirPath("Patient.address.state"), text = inputModel.extractWithFhirPath("Patient.address.text"), - fullAddress = inputModel.extractAddress() + fullAddress = inputModel.extractAddress(), ), telecom = inputModel.extractTelecom(), generalPractitionerReference = inputModel.extractGeneralPractitionerReference(), - managingOrganizationReference = inputModel.extractManagingOrganizationReference() + managingOrganizationReference = inputModel.extractManagingOrganizationReference(), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterActivity.kt index f9edd8700c..df9ed75ecb 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterActivity.kt @@ -41,7 +41,9 @@ import org.smartregister.fhircore.quest.util.QuestJsonSpecificationProvider class PatientRegisterActivity : BaseRegisterActivity() { @Inject lateinit var configurationRegistry: ConfigurationRegistry + @Inject lateinit var questJsonSpecificationProvider: QuestJsonSpecificationProvider + @Inject lateinit var fhirCarePlanGenerator: FhirCarePlanGenerator override fun onCreate(savedInstanceState: Bundle?) { @@ -50,14 +52,14 @@ class PatientRegisterActivity : BaseRegisterActivity() { val registerViewConfiguration = configurationRegistry.retrieveConfiguration( configClassification = QuestConfigClassification.PATIENT_REGISTER, - questJsonSpecificationProvider.getJson() + questJsonSpecificationProvider.getJson(), ) configureViews(registerViewConfiguration) } override fun onBottomNavigationOptionItemSelected( item: MenuItem, - viewConfiguration: RegisterViewConfiguration + viewConfiguration: RegisterViewConfiguration, ): Boolean { viewConfiguration.bottomNavigationOptions?.forEach { navigationOption -> if (item.itemId == navigationOption.id.hashCode()) { @@ -67,14 +69,14 @@ class PatientRegisterActivity : BaseRegisterActivity() { action.tag, action.isRegisterFragment, action.isFilterVisible, - action.toolbarTitle + action.toolbarTitle, ) } is QuestionnaireDataDetailsNavigationAction -> { startActivity( Intent(this, QuestionnaireDataDetailActivity::class.java).apply { putExtra(CLASSIFICATION_ARG, action.classification) - } + }, ) } } @@ -89,7 +91,7 @@ class PatientRegisterActivity : BaseRegisterActivity() { mapOf( Pair(PatientRegisterFragment.TAG, PatientRegisterFragment()), Pair(PatientTaskFragment.TAG, PatientTaskFragment()), - Pair(UserProfileFragment.TAG, UserProfileFragment()) + Pair(UserProfileFragment.TAG, UserProfileFragment()), ) override fun registersList(): List = @@ -97,7 +99,7 @@ class PatientRegisterActivity : BaseRegisterActivity() { RegisterItem( uniqueTag = PatientRegisterFragment.TAG, title = getString(R.string.clients), - isSelected = true - ) + isSelected = true, + ), ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterFragment.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterFragment.kt index 540ba944df..316a9c4547 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterFragment.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterFragment.kt @@ -43,19 +43,19 @@ class PatientRegisterFragment : ComposeRegisterFragment() override fun navigateToDetails(uniqueIdentifier: String) { startActivity( Intent(requireActivity(), QuestPatientDetailActivity::class.java) - .putExtra(QUESTIONNAIRE_ARG_PATIENT_KEY, uniqueIdentifier) + .putExtra(QUESTIONNAIRE_ARG_PATIENT_KEY, uniqueIdentifier), ) } @Composable override fun ConstructRegisterList( pagingItems: LazyPagingItems, - modifier: Modifier + modifier: Modifier, ) { PatientRegisterList( pagingItems = pagingItems, modifier = modifier, - clickListener = { listenerIntent, data -> onItemClicked(listenerIntent, data) } + clickListener = { listenerIntent, data -> onItemClicked(listenerIntent, data) }, ) } @@ -74,18 +74,18 @@ class PatientRegisterFragment : ComposeRegisterFragment() * @param registerFilterType the filter type * @param data the data that will be filtered * @param value the query - * * @return true if the data should be filtered */ override fun performFilter( registerFilterType: RegisterFilterType, data: PatientItem, - value: Any + value: Any, ): Boolean { return when (registerFilterType) { RegisterFilterType.SEARCH_FILTER -> { - if (value is String && value.isEmpty()) return true - else + if (value is String && value.isEmpty()) { + return true + } else data.name.contains(value.toString(), ignoreCase = true) || data.identifier.contentEquals(value.toString()) || data.id == value.toString() @@ -98,10 +98,11 @@ class PatientRegisterFragment : ComposeRegisterFragment() val registerDataViewModel = RegisterDataViewModel( application = requireActivity().application, - registerRepository = patientRepository + registerRepository = patientRepository, ) return ViewModelProvider(viewModelStore, registerDataViewModel.createFactory())[ - registerDataViewModel::class.java] + registerDataViewModel::class.java, + ] } companion object { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterScreen.kt index a924f0252f..1a43b74d1c 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterScreen.kt @@ -57,7 +57,7 @@ fun PatientRegisterScreen( screenTitle: String, openDrawer: (Boolean) -> Unit, navController: NavHostController, - patientRegisterViewModel: PatientRegisterViewModel = hiltViewModel() + patientRegisterViewModel: PatientRegisterViewModel = hiltViewModel(), ) { val context = LocalContext.current val firstTimeSyncState = patientRegisterViewModel.firstTimeSyncState.collectAsState() @@ -77,11 +77,11 @@ fun PatientRegisterScreen( if (patientId != null) { patientRegisterViewModel.syncBroadcaster.runSync() patientRegisterViewModel.onEvent( - PatientRegisterEvent.OpenProfile(patientId, navController) + PatientRegisterEvent.OpenProfile(patientId, navController), ) } } - } + }, ) val registerConfigs = remember { patientRegisterViewModel.registerViewConfiguration } @@ -96,10 +96,12 @@ fun PatientRegisterScreen( searchText = searchText, onSearchTextChanged = { searchText -> patientRegisterViewModel.onEvent( - PatientRegisterEvent.SearchRegister(searchText = searchText) + PatientRegisterEvent.SearchRegister(searchText = searchText), ) - } - ) { openDrawer(true) } + }, + ) { + openDrawer(true) + } }, bottomBar = { // Bottom section has a pagination footer and button with client registration action @@ -116,36 +118,38 @@ fun PatientRegisterScreen( }, nextButtonClickListener = { patientRegisterViewModel.onEvent(PatientRegisterEvent.MoveToNextPage) - } + }, ) // TODO activate this button action via config; now only activated for family register - if (patientRegisterViewModel.isAppFeatureHousehold() || + if ( + patientRegisterViewModel.isAppFeatureHousehold() || patientRegisterViewModel.isRegisterFormViaSettingExists() ) { Button( modifier = modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp), onClick = { patientRegistrationLauncher.launch( - patientRegisterViewModel.patientRegisterQuestionnaireIntent(context) + patientRegisterViewModel.patientRegisterQuestionnaireIntent(context), ) // // patientRegisterViewModel.onEvent(PatientRegisterEvent.RegisterNewClient(context)) }, - enabled = !firstTimeSync + enabled = !firstTimeSync, ) { Text(text = registerConfigs.newClientButtonText, modifier = modifier.padding(8.dp)) } } } } - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { - if (firstTimeSync) + if (firstTimeSync) { LoaderDialog( modifier = modifier, - syncProgressStateFlow = patientRegisterViewModel.syncProgressStateFlow + syncProgressStateFlow = patientRegisterViewModel.syncProgressStateFlow, ) + } // Only show counter during search var iModifier = Modifier.padding(top = 0.dp) if (searchText.isNotEmpty()) { @@ -158,16 +162,16 @@ fun PatientRegisterScreen( state = rememberSwipeRefreshState(isRefreshing), onRefresh = { patientRegisterViewModel.refresh() }, // indicator = { _, _ -> } - ) { + ) { RegisterList( modifier = iModifier, pagingItems = pagingItems, onRowClick = { patientId: String -> patientRegisterViewModel.onEvent( - PatientRegisterEvent.OpenProfile(patientId, navController) + PatientRegisterEvent.OpenProfile(patientId, navController), ) }, - progressMessage = patientRegisterViewModel.progressMessage() + progressMessage = patientRegisterViewModel.progressMessage(), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterViewModel.kt index 0a2828dbad..b159aea122 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterViewModel.kt @@ -82,7 +82,7 @@ constructor( val configurationRegistry: ConfigurationRegistry, val registerViewDataMapper: RegisterViewDataMapper, val appFeatureManager: AppFeatureManager, - val sharedPreferencesHelper: SharedPreferencesHelper + val sharedPreferencesHelper: SharedPreferencesHelper, ) : ViewModel() { private val appFeatureName = savedStateHandle.get(NavigationArg.FEATURE) @@ -158,7 +158,8 @@ constructor( object : OnSyncListener { override fun onSync(state: SyncJobStatus) { when (state) { - is SyncJobStatus.Failed, is SyncJobStatus.Finished -> { + is SyncJobStatus.Failed, + is SyncJobStatus.Finished, -> { refresh() _firstTimeSyncState.value = false } @@ -198,7 +199,7 @@ constructor( appFeatureName = appFeatureName, healthModule = healthModule, loadAll = false, - searchFilter = text + searchFilter = text, ) .flow .cachedIn(viewModelScope) @@ -213,14 +214,14 @@ constructor( healthModule: HealthModule, loadAll: Boolean = false, page: Int = 0, - searchFilter: String? = null + searchFilter: String? = null, ): Pager = Pager( config = PagingConfig( pageSize = DEFAULT_PAGE_SIZE, initialLoadSize = DEFAULT_INITIAL_LOAD_SIZE, - enablePlaceholders = false + enablePlaceholders = false, ), pagingSourceFactory = { RegisterPagingSource(registerRepository, registerViewDataMapper).apply { @@ -230,11 +231,11 @@ constructor( healthModule = healthModule, loadAll = loadAll, currentPage = if (loadAll) 0 else page, - searchFilter = searchFilter - ) + searchFilter = searchFilter, + ), ) } - } + }, ) fun countPages() = @@ -245,8 +246,8 @@ constructor( .putExtras( QuestionnaireActivity.intentArgs( formName = registerViewConfiguration.registrationForm, - questionnaireType = QuestionnaireType.DEFAULT - ) + questionnaireType = QuestionnaireType.DEFAULT, + ), ) fun onEvent(event: PatientRegisterEvent) { @@ -271,13 +272,13 @@ constructor( NavigationArg.bindArgumentsOf( Pair(NavigationArg.FEATURE, AppFeature.PatientManagement.name), Pair(NavigationArg.HEALTH_MODULE, healthModule), - Pair(NavigationArg.PATIENT_ID, event.patientId) + Pair(NavigationArg.PATIENT_ID, event.patientId), ) - if (healthModule == HealthModule.FAMILY) + if (healthModule == HealthModule.FAMILY) { event.navController.navigate(route = MainNavigationScreen.FamilyProfile.route + urlParams) - else + } else event.navController.navigate( - route = MainNavigationScreen.PatientProfile.route + urlParams + route = MainNavigationScreen.PatientProfile.route + urlParams, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/HivPatientRegisterListRow.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/HivPatientRegisterListRow.kt index 8bd23ef836..6c896b098b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/HivPatientRegisterListRow.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/HivPatientRegisterListRow.kt @@ -55,12 +55,12 @@ import org.smartregister.fhircore.quest.ui.shared.models.RegisterViewData fun HivPatientRegisterListRow(data: RegisterViewData, onItemClick: (String) -> Unit) { Card( onClick = { onItemClick(data.logicalId) }, - modifier = Modifier.padding(8.dp).fillMaxWidth().height(IntrinsicSize.Min) + modifier = Modifier.padding(8.dp).fillMaxWidth().height(IntrinsicSize.Min), ) { Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth().padding(16.dp).height(IntrinsicSize.Min) + modifier = Modifier.fillMaxWidth().padding(16.dp).height(IntrinsicSize.Min), ) { Box( modifier = @@ -72,28 +72,28 @@ fun HivPatientRegisterListRow(data: RegisterViewData, onItemClick: (String) -> U modifier = Modifier.width(48.dp), textAlign = TextAlign.Center, overflow = TextOverflow.Visible, - style = MaterialTheme.typography.caption + style = MaterialTheme.typography.caption, ) } Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.weight(1f).padding(8.dp) + modifier = Modifier.weight(1f).padding(8.dp), ) { Text( text = data.title, style = MaterialTheme.typography.h6, textAlign = TextAlign.Center, maxLines = 2, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) Text( text = data.subtitle!!, style = MaterialTheme.typography.caption, textAlign = TextAlign.Center, maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) } @@ -101,13 +101,13 @@ fun HivPatientRegisterListRow(data: RegisterViewData, onItemClick: (String) -> U modifier = Modifier.size(48.dp) .background(color = data.serviceButtonBackgroundColor, shape = CircleShape), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { if (data.serviceTextIcon != null) { Image( painterResource(id = data.serviceTextIcon), contentDescription = "ART", - Modifier.size(36.dp) + Modifier.size(36.dp), ) } } @@ -130,7 +130,7 @@ fun PreviewHivFemalePatientRegisterRowItem() { serviceButtonBackgroundColor = FemalePinkColor, registerType = RegisterData.HivRegisterData::class, ), - onItemClick = {} + onItemClick = {}, ) } @@ -149,7 +149,7 @@ fun PreviewHivMalePatientRegisterRowItem() { serviceButtonBackgroundColor = MaleBlueColor, registerType = RegisterData.HivRegisterData::class, ), - onItemClick = {} + onItemClick = {}, ) } @@ -168,7 +168,7 @@ fun PreviewHivExposedInfantPatientRegisterRowItem() { serviceButtonBackgroundColor = MaleBlueColor, registerType = RegisterData.HivRegisterData::class, ), - onItemClick = {} + onItemClick = {}, ) } @@ -187,7 +187,7 @@ fun PreviewHivFemalePregnantPatientRegisterRowItem() { serviceButtonBackgroundColor = FemalePinkColor, registerType = RegisterData.HivRegisterData::class, ), - onItemClick = {} + onItemClick = {}, ) } @@ -206,6 +206,6 @@ fun PreviewHivFemaleBreastfeedingPatientRegisterRowItem() { serviceButtonBackgroundColor = FemalePinkColor, registerType = RegisterData.HivRegisterData::class, ), - onItemClick = {} + onItemClick = {}, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientListItem.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientListItem.kt index c6af97012a..e9615732b4 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientListItem.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientListItem.kt @@ -56,7 +56,7 @@ const val PATIENT_BIO = "patientBio" fun PatientRow( patientItem: PatientItem, clickListener: (PatientRowClickListenerIntent, PatientItem) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( horizontalArrangement = Arrangement.SpaceBetween, @@ -69,12 +69,12 @@ fun PatientRow( .clickable { clickListener(OpenPatientProfile, patientItem) } .padding(15.dp) .weight(0.65f) - .testTag(PATIENT_BIO) + .testTag(PATIENT_BIO), ) { Text( text = "${patientItem.name}, ${patientItem.age}", fontSize = 18.sp, - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) Spacer(modifier = modifier.height(8.dp)) Row { @@ -82,7 +82,7 @@ fun PatientRow( color = SubtitleTextColor, text = patientItem.genderFull(), fontSize = 16.sp, - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) Column { patientItem.additionalData?.forEach { @@ -92,12 +92,14 @@ fun PatientRow( text = label, color = Color( - android.graphics.Color.parseColor(it.properties?.label?.color ?: "#000000") + android.graphics.Color.parseColor(it.properties?.label?.color ?: "#000000"), ), fontSize = it.properties?.label?.textSize?.sp ?: 16.sp, modifier = modifier.wrapContentWidth(), fontWeight = - FontWeight(it.properties?.label?.fontWeight?.weight ?: FontWeight.Normal.weight) + FontWeight( + it.properties?.label?.fontWeight?.weight ?: FontWeight.Normal.weight, + ), ) } @@ -106,7 +108,7 @@ fun PatientRow( fontSize = it.properties?.value?.textSize?.sp ?: 16.sp, modifier = modifier.wrapContentWidth(), fontWeight = - FontWeight(it.properties?.value?.fontWeight?.weight ?: FontWeight.Normal.weight) + FontWeight(it.properties?.value?.fontWeight?.weight ?: FontWeight.Normal.weight), ) } } @@ -124,7 +126,7 @@ fun PreviewPatientRow() { PatientRow( patientItem = PatientItem("1", "1", "Rickey Ron", "M", "32y", ""), clickListener = { listenerIntent, data -> }, - modifier = Modifier.background(Color.White) + modifier = Modifier.background(Color.White), ) } } @@ -151,13 +153,13 @@ fun PreviewPatientRowWithG6PDNormalStatus() { properties = Properties( label = Property(color = "#FF0000", textSize = 16), - value = Property(color = "#00a000", textSize = 16) - ) - ) - ) + value = Property(color = "#00a000", textSize = 16), + ), + ), + ), ), clickListener = { listenerIntent, data -> }, - modifier = Modifier.background(Color.White) + modifier = Modifier.background(Color.White), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientRegisterList.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientRegisterList.kt index ea1f4bf930..484bdb8ff9 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientRegisterList.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientRegisterList.kt @@ -39,7 +39,7 @@ import org.smartregister.fhircore.quest.ui.patient.register.PatientRowClickListe fun PatientRegisterList( pagingItems: LazyPagingItems, modifier: Modifier = Modifier, - clickListener: (PatientRowClickListenerIntent, PatientItem) -> Unit + clickListener: (PatientRowClickListenerIntent, PatientItem) -> Unit, ) { LazyColumn { items(pagingItems, key = { it.id }) { @@ -83,7 +83,7 @@ fun dummyPatientPagingList(): LazyPagingItems { name = "John Doe", gender = "M", age = "27y", - displayAddress = "Nairobi" + displayAddress = "Nairobi", ), PatientItem( id = "my-test-id2", @@ -91,10 +91,10 @@ fun dummyPatientPagingList(): LazyPagingItems { name = "Jane Doe", gender = "F", age = "20y", - displayAddress = "Nairobi" - ) - ) - ) + displayAddress = "Nairobi", + ), + ), + ), ) return listFlow.collectAsLazyPagingItems() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/RegisterList.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/RegisterList.kt index 86c9313a90..1da854fe66 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/RegisterList.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/RegisterList.kt @@ -41,7 +41,7 @@ fun RegisterList( pagingItems: LazyPagingItems, onRowClick: (String) -> Unit, modifier: Modifier = Modifier, - progressMessage: String = "" + progressMessage: String = "", ) { LazyColumn(modifier = modifier) { items(pagingItems, key = { it.logicalId }) { @@ -58,7 +58,7 @@ fun RegisterList( item { ErrorMessage( message = loadStateError.error.also { Timber.e(it) }.localizedMessage!!, - onClickRetry = { retry() } + onClickRetry = { retry() }, ) } } @@ -81,7 +81,7 @@ fun BoxedCircularProgressBar(progressMessage: String) { ) { CircularProgressBar( modifier = Modifier.wrapContentWidth(Alignment.CenterHorizontally), - text = progressMessage + text = progressMessage, ) } } @@ -91,7 +91,7 @@ fun RegisterRowItem(registerViewData: RegisterViewData, onRowClick: (String) -> when (registerViewData.registerType) { RegisterData.HivRegisterData::class, RegisterData.TracingRegisterData::class, - RegisterData.AppointmentRegisterData::class -> { + RegisterData.AppointmentRegisterData::class, -> { HivPatientRegisterListRow(data = registerViewData, onItemClick = onRowClick) } else -> { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/RegisterListRow.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/RegisterListRow.kt index d5a7984f45..1843174144 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/RegisterListRow.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/register/components/RegisterListRow.kt @@ -64,25 +64,25 @@ import org.smartregister.fhircore.quest.ui.shared.models.ServiceMember fun RegisterListRow( modifier: Modifier = Modifier, registerViewData: RegisterViewData, - onRowClick: (String) -> Unit + onRowClick: (String) -> Unit, ) { Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, - modifier = modifier.fillMaxWidth().height(IntrinsicSize.Min) + modifier = modifier.fillMaxWidth().height(IntrinsicSize.Min), ) { Column( modifier = modifier .clickable { onRowClick(registerViewData.logicalId) } .weight(0.75f) - .padding(horizontal = 16.dp, vertical = 28.dp) + .padding(horizontal = 16.dp, vertical = 28.dp), ) { if (registerViewData.serviceButtonActionable) { Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, - modifier = modifier.fillMaxWidth() + modifier = modifier.fillMaxWidth(), ) { Column(modifier = modifier.wrapContentWidth(Alignment.Start)) { Text(text = registerViewData.title) @@ -94,21 +94,21 @@ fun RegisterListRow( Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, - modifier = modifier.fillMaxWidth() + modifier = modifier.fillMaxWidth(), ) { Column(modifier = modifier.wrapContentWidth(Alignment.Start).weight(0.7f)) { if (!registerViewData.subtitle.isNullOrEmpty()) { Text( text = registerViewData.subtitle, color = DefaultColor, - modifier = modifier.padding(top = 4.dp) + modifier = modifier.padding(top = 4.dp), ) } RegisterListStatus(registerViewData, modifier) } ServiceMemberIcons( registerViewData, - modifier = modifier.wrapContentWidth(Alignment.End).weight(0.3f) + modifier = modifier.wrapContentWidth(Alignment.End).weight(0.3f), ) } } @@ -120,7 +120,7 @@ fun RegisterListRow( .fillMaxHeight() .padding(horizontal = 4.dp) .width(1.dp) - .background(color = DividerColor) + .background(color = DividerColor), ) } Box(modifier = modifier.weight(0.25f), contentAlignment = Alignment.Center) { @@ -131,13 +131,13 @@ fun RegisterListRow( modifier = modifier .wrapContentHeight(Alignment.CenterVertically) - .wrapContentWidth(Alignment.CenterHorizontally) + .wrapContentWidth(Alignment.CenterHorizontally), ) } else { ServiceActionSection( registerViewData = registerViewData, modifier = - modifier.fillMaxHeight(0.6f).fillMaxWidth(0.9f).clip(RoundedCornerShape(4.dp)) + modifier.fillMaxHeight(0.6f).fillMaxWidth(0.9f).clip(RoundedCornerShape(4.dp)), ) } } @@ -155,13 +155,13 @@ private fun ServiceButton(registerViewData: RegisterViewData, modifier: Modifier .clip(RoundedCornerShape(8.dp)) .clickable { /*TODO Provide the given service*/} .background(color = registerViewData.serviceButtonForegroundColor.copy(alpha = 0.1f)), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Filled.Add, contentDescription = null, tint = contentColor, - modifier = modifier.size(16.dp).padding(horizontal = 1.dp) + modifier = modifier.size(16.dp).padding(horizontal = 1.dp), ) Text( text = registerViewData.serviceText ?: "", @@ -170,7 +170,7 @@ private fun ServiceButton(registerViewData: RegisterViewData, modifier: Modifier fontWeight = FontWeight.Bold, modifier = modifier.padding(4.dp).wrapContentHeight(Alignment.CenterVertically), overflow = TextOverflow.Visible, - maxLines = 1 + maxLines = 1, ) } } @@ -185,7 +185,7 @@ private fun RegisterListStatus(registerViewData: RegisterViewData, modifier: Mod Text( text = registerViewData.status, color = DefaultColor, - modifier = modifier.wrapContentWidth(Alignment.Start) + modifier = modifier.wrapContentWidth(Alignment.Start), ) } if (!registerViewData.otherStatus.isNullOrEmpty()) { @@ -193,7 +193,7 @@ private fun RegisterListStatus(registerViewData: RegisterViewData, modifier: Mod Text( text = registerViewData.otherStatus, color = DefaultColor, - modifier = modifier.wrapContentWidth(Alignment.Start) + modifier = modifier.wrapContentWidth(Alignment.Start), ) } } @@ -211,18 +211,19 @@ private fun ServiceActionSection(registerViewData: RegisterViewData, modifier: M .padding(if (registerViewData.borderedServiceButton) 1.4.dp else 0.dp) .background(registerViewData.serviceButtonBackgroundColor), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { - if (registerViewData.serviceTextIcon != null) + if (registerViewData.serviceTextIcon != null) { Icon( painter = painterResource(id = registerViewData.serviceTextIcon), contentDescription = null, - tint = registerViewData.serviceButtonForegroundColor + tint = registerViewData.serviceButtonForegroundColor, ) + } Text( text = registerViewData.serviceText, color = registerViewData.serviceButtonForegroundColor, - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) } } @@ -235,23 +236,24 @@ private fun ServiceMemberIcons(registerViewData: RegisterViewData, modifier: Mod if (!registerViewData.serviceButtonActionable) { Row(modifier.padding(start = 4.dp)) { twoMemberIcons.forEach { - if (it.icon != null) + if (it.icon != null) { Icon( painter = painterResource(id = it.icon), contentDescription = null, modifier = modifier.size(20.dp).padding(0.dp), - tint = Color.Unspecified + tint = Color.Unspecified, ) + } } if (twoMemberIcons.size == 2 && registerViewData.serviceMembers.size > 2) { Box( contentAlignment = Alignment.Center, - modifier = modifier.clip(CircleShape).size(24.dp).background(DefaultColor.copy(0.1f)) + modifier = modifier.clip(CircleShape).size(24.dp).background(DefaultColor.copy(0.1f)), ) { Text( text = "+${registerViewData.serviceMembers.size - 2}", fontSize = 12.sp, - color = Color.DarkGray + color = Color.DarkGray, ) } } @@ -279,10 +281,10 @@ fun RegisterListRowForFamilyRegisterOverduePreview() { ServiceMember(R.drawable.ic_pregnant, "1920192"), ServiceMember(R.drawable.ic_pregnant, "1920190"), ServiceMember(R.drawable.ic_pregnant, "1920191"), - ServiceMember(R.drawable.ic_pregnant, "1920194") - ) + ServiceMember(R.drawable.ic_pregnant, "1920194"), + ), ), - onRowClick = {} + onRowClick = {}, ) } @@ -303,7 +305,7 @@ fun RegisterListRowForFamilyRegisterDuePreview() { serviceButtonBorderColor = InfoColor, showDivider = true, ), - onRowClick = {} + onRowClick = {}, ) } @@ -313,7 +315,7 @@ fun RegisterListRowForQuestRegisterPreview() { RegisterListRow( registerViewData = RegisterViewData(logicalId = "1234", title = "John Doe, 40y", subtitle = "Male"), - onRowClick = {} + onRowClick = {}, ) } @@ -326,9 +328,9 @@ fun RegisterListRowForRdtRegisterPreview() { logicalId = "1234", title = "Jackie Johnson, Female, 40y", status = "Last test", - otherStatus = "04 Feb 2022" + otherStatus = "04 Feb 2022", ), - onRowClick = {} + onRowClick = {}, ) } @@ -344,9 +346,9 @@ fun RegisterListRowForAncRegisterPreview() { otherStatus = "Kimulu village", serviceButtonActionable = true, serviceText = "ANC visit", - serviceButtonForegroundColor = InfoColor + serviceButtonForegroundColor = InfoColor, ), - onRowClick = {} + onRowClick = {}, ) } @@ -363,8 +365,8 @@ fun RegisterListRowForEirRegisterPreview() { serviceText = "Overdue", serviceButtonForegroundColor = Color.White, serviceButtonBackgroundColor = OverdueColor, - showDivider = true + showDivider = true, ), - onRowClick = {} + onRowClick = {}, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/remove/HivPatientQuestionnaireActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/remove/HivPatientQuestionnaireActivity.kt index b55db05d76..617a2bf057 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/remove/HivPatientQuestionnaireActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/patient/remove/HivPatientQuestionnaireActivity.kt @@ -88,7 +88,7 @@ class HivPatientQuestionnaireActivity : QuestionnaireActivity() { neutralButtonListener = { dialog -> viewModel.discard() dialog.dismiss() - } + }, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportEvent.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportEvent.kt index 1cb50ed3ac..e9fb1ad1b7 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportEvent.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportEvent.kt @@ -25,17 +25,22 @@ import org.smartregister.fhircore.quest.ui.shared.models.MeasureReportPatientVie sealed class MeasureReportEvent { data class OnSelectMeasure( val measureReportRowData: MeasureReportRowData, - val navController: NavController + val navController: NavController, ) : MeasureReportEvent() + data class OnDateRangeSelected(val newDateRange: androidx.core.util.Pair) : MeasureReportEvent() + data class GenerateReport(val navController: NavController, val context: Context) : MeasureReportEvent() + data class OnReportTypeChanged( val measureReportType: MeasureReport.MeasureReportType, - val navController: NavController + val navController: NavController, ) : MeasureReportEvent() + data class OnPatientSelected(val patientViewData: MeasureReportPatientViewData) : MeasureReportEvent() + data class OnSearchTextChanged(val searchText: String) : MeasureReportEvent() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportMainScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportMainScreen.kt index eb3295cbc0..a051f7be35 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportMainScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportMainScreen.kt @@ -32,13 +32,12 @@ import org.smartregister.fhircore.quest.ui.report.measure.screens.ReportTypeSele fun NavGraphBuilder.measureReportNavigationGraph( navController: NavController, - measureReportViewModel: MeasureReportViewModel + measureReportViewModel: MeasureReportViewModel, ) { navigation( startDestination = MeasureReportNavigationScreen.MeasureReportList.route, - route = MainNavigationScreen.Reports.route + route = MainNavigationScreen.Reports.route, ) { - // Display list of supported measures for reporting composable(MeasureReportNavigationScreen.MeasureReportList.route) { MeasureReportListScreen( @@ -46,9 +45,9 @@ fun NavGraphBuilder.measureReportNavigationGraph( dataList = measureReportViewModel.reportMeasuresList(), onReportMeasureClicked = { measureReportRowData -> measureReportViewModel.onEvent( - MeasureReportEvent.OnSelectMeasure(measureReportRowData, navController) + MeasureReportEvent.OnSelectMeasure(measureReportRowData, navController), ) - } + }, ) } // Choose report type; for either individual or population @@ -61,14 +60,14 @@ fun NavGraphBuilder.measureReportNavigationGraph( navArgument(NavigationArg.SCREEN_TITLE) { type = NavType.StringType defaultValue = "" - } - ) + }, + ), ) { stackEntry -> val screenTitle: String = stackEntry.arguments?.getString(NavigationArg.SCREEN_TITLE) ?: "" ReportTypeSelectorScreen( screenTitle = screenTitle, navController = navController, - measureReportViewModel = measureReportViewModel + measureReportViewModel = measureReportViewModel, ) } @@ -76,7 +75,7 @@ fun NavGraphBuilder.measureReportNavigationGraph( composable(MeasureReportNavigationScreen.PatientsList.route) { MeasureReportPatientsScreen( navController = navController, - measureReportViewModel = measureReportViewModel + measureReportViewModel = measureReportViewModel, ) } @@ -84,7 +83,7 @@ fun NavGraphBuilder.measureReportNavigationGraph( composable(MeasureReportNavigationScreen.MeasureReportResult.route) { MeasureReportResultScreen( navController = navController, - measureReportViewModel = measureReportViewModel + measureReportViewModel = measureReportViewModel, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportViewModel.kt index e5ba44d835..6ed0f996b4 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/MeasureReportViewModel.kt @@ -69,7 +69,7 @@ constructor( val sharedPreferencesHelper: SharedPreferencesHelper, val dispatcherProvider: DefaultDispatcherProvider, val measureReportRepository: MeasureReportRepository, - val measureReportPatientViewDataMapper: MeasureReportPatientViewDataMapper + val measureReportPatientViewDataMapper: MeasureReportPatientViewDataMapper, ) : ViewModel() { private val dateRangeDateFormatter = SimpleDateFormat(DATE_RANGE_DATE_FORMAT, Locale.getDefault()) @@ -102,7 +102,7 @@ constructor( private val loggedInPractitioner by lazy { sharedPreferencesHelper.read( key = SharedPreferenceKey.PRACTITIONER_DETAILS.name, - decodeWithGson = true + decodeWithGson = true, ) } @@ -113,7 +113,7 @@ constructor( private fun defaultDateRangeState() = androidx.core.util.Pair( MaterialDatePicker.thisMonthInUtcMilliseconds(), - MaterialDatePicker.todayInUtcMilliseconds() + MaterialDatePicker.todayInUtcMilliseconds(), ) fun reportMeasuresList(): Flow> = @@ -127,9 +127,11 @@ constructor( event.navController.navigate( MeasureReportNavigationScreen.ReportTypeSelector.route + NavigationArg.bindArgumentsOf( - Pair(NavigationArg.SCREEN_TITLE, event.measureReportRowData.title) - ) - ) { launchSingleTop = true } + Pair(NavigationArg.SCREEN_TITLE, event.measureReportRowData.title), + ), + ) { + launchSingleTop = true + } } is MeasureReportEvent.GenerateReport -> evaluateMeasure(event.context, event.navController) is MeasureReportEvent.OnDateRangeSelected -> { @@ -138,7 +140,7 @@ constructor( reportTypeSelectorUiState.value = reportTypeSelectorUiState.value.copy( startDate = dateRangeDateFormatter.format(Date(dateRange.value.first)), - endDate = dateRangeDateFormatter.format(Date(dateRange.value.second)) + endDate = dateRangeDateFormatter.format(Date(dateRange.value.second)), ) } is MeasureReportEvent.OnReportTypeChanged -> { @@ -173,14 +175,14 @@ constructor( config = PagingConfig( pageSize = PaginationConstant.DEFAULT_PAGE_SIZE, - initialLoadSize = PaginationConstant.DEFAULT_INITIAL_LOAD_SIZE + initialLoadSize = PaginationConstant.DEFAULT_INITIAL_LOAD_SIZE, ), pagingSourceFactory = { MeasureReportPatientsPagingSource( measureReportRepository, - measureReportPatientViewDataMapper + measureReportPatientViewDataMapper, ) - } + }, ) .flow @@ -195,11 +197,11 @@ constructor( // Retrieve and parse dates from this format (16 Nov, 2020) to this (2020-11-16) val startDateFormatted = measureReportDateFormatter.format( - dateRangeDateFormatter.parse(reportTypeSelectorUiState.value.startDate)!! + dateRangeDateFormatter.parse(reportTypeSelectorUiState.value.startDate)!!, ) val endDateFormatted = measureReportDateFormatter.format( - dateRangeDateFormatter.parse(reportTypeSelectorUiState.value.endDate)!! + dateRangeDateFormatter.parse(reportTypeSelectorUiState.value.endDate)!!, ) viewModelScope.launch { @@ -213,7 +215,7 @@ constructor( context = context, fhirOperator = fhirOperator.get(), sharedPreferencesHelper = sharedPreferencesHelper, - resourcesBundlePath = measureResourceBundleUrl + resourcesBundlePath = measureResourceBundleUrl, ) } if (reportTypeSelectorUiState.value.patientViewData != null && individualEvaluation) { @@ -228,7 +230,7 @@ constructor( reportType = SUBJECT, subject = reportTypeSelectorUiState.value.patientViewData!!.logicalId, practitioner = loggedInPractitioner?.id, - lastReceivedOn = null // Non-null value not supported yet + lastReceivedOn = null, // Non-null value not supported yet ) } @@ -237,11 +239,11 @@ constructor( measureReport.group.first().population.find { it.id == NUMERATOR } measureReportIndividualResult.value = MeasureReportIndividualResult( - status = if (population != null && population.count > 0) "True" else "False" + status = if (population != null && population.count > 0) "True" else "False", ) } - } else if (reportTypeSelectorUiState.value.patientViewData == null && - !individualEvaluation + } else if ( + reportTypeSelectorUiState.value.patientViewData == null && !individualEvaluation ) { evaluatePopulationMeasure(measureUrl, startDateFormatted, endDateFormatted) } @@ -261,7 +263,7 @@ constructor( private suspend fun evaluatePopulationMeasure( measureUrl: String, startDateFormatted: String, - endDateFormatted: String + endDateFormatted: String, ) { val measureReport = withContext(dispatcherProvider.io()) { @@ -274,7 +276,7 @@ constructor( reportType = POPULATION, subject = null, practitioner = loggedInPractitioner?.id, - lastReceivedOn = null // Non-null value not supported yet + lastReceivedOn = null, // Non-null value not supported yet ) } @@ -287,35 +289,37 @@ constructor( } fun formatPopulationMeasureReport( - measureReport: MeasureReport + measureReport: MeasureReport, ): List { return measureReport.group.flatMap { reportGroup: MeasureReport.MeasureReportGroupComponent -> reportGroup.stratifier.map { stratifier -> val resultItems: List = - stratifier.stratum.filter { it.hasValue() }.map { stratifierComponent -> - val text = - when { - stratifierComponent.value.hasText() -> stratifierComponent.value.text - stratifierComponent.value.hasCoding() -> - stratifierComponent.value.coding.last().display - else -> "" - } + stratifier.stratum + .filter { it.hasValue() } + .map { stratifierComponent -> + val text = + when { + stratifierComponent.value.hasText() -> stratifierComponent.value.text + stratifierComponent.value.hasCoding() -> + stratifierComponent.value.coding.last().display + else -> "" + } - val numerator = stratifierComponent.findPopulation(NUMERATOR)?.count ?: 0 - val denominator = stratifierComponent.findPopulation(DENOMINATOR)?.count ?: 0 - - val percentage = - ceil((numerator / if (denominator == 0) 1 else denominator) * 100.0).toInt() - val count = "$numerator/$denominator" - MeasureReportIndividualResult( - title = text, - percentage = percentage.toString(), - count = count - ) - } + val numerator = stratifierComponent.findPopulation(NUMERATOR)?.count ?: 0 + val denominator = stratifierComponent.findPopulation(DENOMINATOR)?.count ?: 0 + + val percentage = + ceil((numerator / if (denominator == 0) 1 else denominator) * 100.0).toInt() + val count = "$numerator/$denominator" + MeasureReportIndividualResult( + title = text, + percentage = percentage.toString(), + count = count, + ) + } MeasureReportPopulationResult( title = stratifier.id.replace("-", " ").uppercase(Locale.getDefault()), - dataList = resultItems + dataList = resultItems, ) } } @@ -323,7 +327,7 @@ constructor( // TODO: Enhancement - use FhirPathEngine evaluator for data extraction private fun MeasureReport.StratifierGroupComponent.findPopulation( - id: String + id: String, ): MeasureReport.StratifierGroupPopulationComponent? { return this.population.find { it.hasId() && it.id.equals(id, ignoreCase = true) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/ReportTypeSelectorUiState.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/ReportTypeSelectorUiState.kt index ec69e94f44..4588e1340e 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/ReportTypeSelectorUiState.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/ReportTypeSelectorUiState.kt @@ -22,5 +22,5 @@ data class ReportTypeSelectorUiState( val startDate: String = "", val endDate: String = "", val showProgressIndicator: Boolean = false, - val patientViewData: MeasureReportPatientViewData? = null + val patientViewData: MeasureReportPatientViewData? = null, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/DateRangeItem.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/DateRangeItem.kt index 5627a79bd2..8df4941148 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/DateRangeItem.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/DateRangeItem.kt @@ -42,11 +42,11 @@ fun DateRangeItem(text: String, showBackground: Boolean = true, modifier: Modifi modifier .clip(RoundedCornerShape(if (showBackground) 12.dp else 0.dp)) .background( - color = if (showBackground) Color.LightGray.copy(alpha = 0.4f) else Color.Transparent + color = if (showBackground) Color.LightGray.copy(alpha = 0.4f) else Color.Transparent, ) .wrapContentWidth() .padding(horizontal = 16.dp, vertical = 4.dp), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Text(text = text, textAlign = TextAlign.Start, fontSize = 16.sp, color = SubtitleTextColor) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/DateSelectionBox.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/DateSelectionBox.kt index 2422cbbfa4..43841af607 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/DateSelectionBox.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/DateSelectionBox.kt @@ -57,25 +57,25 @@ fun DateSelectionBox( endDate: String = "", showDateRangePicker: Boolean = true, dateRange: MutableState>, - onDateRangeSelected: (Pair) -> Unit + onDateRangeSelected: (Pair) -> Unit, ) { val context = LocalContext.current Column( modifier = modifier.wrapContentWidth(), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.Start + horizontalAlignment = Alignment.Start, ) { Text( text = stringResource(id = R.string.date_range), fontWeight = FontWeight.Bold, fontSize = 18.sp, - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) Spacer(modifier = modifier.height(16.dp)) Row( horizontalArrangement = Arrangement.SpaceAround, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { DateRangeItem(text = startDate) Text("-", fontSize = 18.sp, modifier = modifier.padding(horizontal = 8.dp)) @@ -90,10 +90,10 @@ fun DateSelectionBox( showDateRangePicker( context = context, dateRange = dateRange, - onDateRangeSelected = onDateRangeSelected + onDateRangeSelected = onDateRangeSelected, ) } - .padding(8.dp) + .padding(8.dp), ) } } @@ -103,7 +103,7 @@ fun DateSelectionBox( fun showDateRangePicker( context: Context, dateRange: MutableState>, - onDateRangeSelected: (Pair) -> Unit + onDateRangeSelected: (Pair) -> Unit, ) { val constraintsBuilder = CalendarConstraints.Builder().setValidator(DateValidatorPointBackward.now()).build() @@ -133,6 +133,6 @@ private fun DateRangeSelectedPreview() { startDate = "Start date", endDate = "End date", onDateRangeSelected = {}, - dateRange = dateRange + dateRange = dateRange, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportIndividualResultView.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportIndividualResultView.kt index 8e332eb10f..f392fc4534 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportIndividualResultView.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportIndividualResultView.kt @@ -52,7 +52,7 @@ fun MeasureReportIndividualResultView( patientViewData: MeasureReportPatientViewData, isMatchedIndicator: Boolean = true, indicatorStatus: String = "", - indicatorDescription: String = "" + indicatorDescription: String = "", ) { Box( modifier = @@ -60,49 +60,49 @@ fun MeasureReportIndividualResultView( .clip(RoundedCornerShape(15.dp)) .background(color = colorResource(id = R.color.white)) .wrapContentWidth(), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Column( modifier = Modifier.wrapContentWidth().padding(16.dp), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.Start + horizontalAlignment = Alignment.Start, ) { Text( color = SubtitleTextColor, text = patientViewData.personalDetails(), fontSize = 16.sp, - modifier = Modifier.wrapContentWidth() + modifier = Modifier.wrapContentWidth(), ) Spacer(modifier = Modifier.height(12.dp)) Divider(color = DividerColor) Spacer(modifier = Modifier.height(12.dp)) Row( horizontalArrangement = Arrangement.SpaceAround, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { if (isMatchedIndicator) { Image( painter = painterResource(id = R.drawable.ic_check), contentDescription = null, - modifier = modifier.wrapContentWidth().requiredHeight(40.dp) + modifier = modifier.wrapContentWidth().requiredHeight(40.dp), ) } else { Image( painter = painterResource(id = R.drawable.ic_stalled), contentDescription = null, - modifier = modifier.wrapContentWidth().requiredHeight(40.dp) + modifier = modifier.wrapContentWidth().requiredHeight(40.dp), ) } Column( modifier = Modifier.wrapContentWidth().padding(horizontal = 16.dp, vertical = 4.dp), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.Start + horizontalAlignment = Alignment.Start, ) { Text( text = indicatorStatus, fontWeight = FontWeight.Bold, fontSize = 16.sp, - modifier = Modifier.wrapContentWidth() + modifier = Modifier.wrapContentWidth(), ) Spacer(modifier = Modifier.height(4.dp)) if (indicatorDescription.isNotEmpty()) { @@ -110,7 +110,7 @@ fun MeasureReportIndividualResultView( color = SubtitleTextColor, text = indicatorDescription, fontSize = 14.sp, - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) } } @@ -129,10 +129,10 @@ private fun MeasureReportIndividualResultViewPreview() { name = "Jacky Coughlin", gender = "F", age = "27", - logicalId = "12444" + logicalId = "12444", ), isMatchedIndicator = true, indicatorStatus = "True", - indicatorDescription = "" + indicatorDescription = "", ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportPatientRow.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportPatientRow.kt index 37ca5dee0f..b1d5215a73 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportPatientRow.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportPatientRow.kt @@ -41,7 +41,7 @@ import org.smartregister.fhircore.quest.ui.shared.models.MeasureReportPatientVie fun MeasureReportPatientRow( measureReportPatientViewData: MeasureReportPatientViewData, onRowClick: (MeasureReportPatientViewData) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( horizontalArrangement = Arrangement.SpaceBetween, @@ -49,24 +49,24 @@ fun MeasureReportPatientRow( modifier = modifier.fillMaxWidth().height(IntrinsicSize.Min).clickable { onRowClick(measureReportPatientViewData) - } + }, ) { Column( modifier = - modifier.wrapContentWidth(Alignment.Start).padding(horizontal = 16.dp, vertical = 16.dp) + modifier.wrapContentWidth(Alignment.Start).padding(horizontal = 16.dp, vertical = 16.dp), ) { Text( text = listOf( measureReportPatientViewData.name, measureReportPatientViewData.gender, - measureReportPatientViewData.age + measureReportPatientViewData.age, ) .joinToString(", "), fontSize = 18.sp, modifier = modifier.wrapContentWidth(), maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) Spacer(modifier = modifier.height(8.dp)) if (measureReportPatientViewData.family != null) { @@ -76,7 +76,7 @@ fun MeasureReportPatientRow( fontSize = 14.sp, modifier = modifier.wrapContentWidth(), maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) } } @@ -93,8 +93,8 @@ private fun MeasureReportPatientRowPreview() { name = "John Jared", gender = "M", age = "56", - family = "Oduor" + family = "Oduor", ), - onRowClick = {} + onRowClick = {}, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportPopulationResultView.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportPopulationResultView.kt index 1504c9108a..4ed2f15a58 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportPopulationResultView.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportPopulationResultView.kt @@ -60,14 +60,14 @@ private fun PopulationResultCard( .clip(RoundedCornerShape(8.dp)) .background(color = colorResource(id = R.color.white)) .padding(16.dp) - .fillMaxWidth() + .fillMaxWidth(), ) { Column { Text( text = resultItem.title.uppercase(), color = colorResource(id = R.color.darkGrayText), fontSize = 16.sp, - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) Divider(color = DividerColor, modifier = modifier.padding(vertical = 20.dp)) resultItem.dataList.forEach { item -> PopulationResultItem(item) } @@ -84,11 +84,11 @@ private fun PopulationResultItem( Row( modifier = modifier.fillMaxWidth().padding(vertical = 4.dp), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Row( horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { CircularPercentageIndicator(percentage = measureReportIndividualResult.percentage) @@ -103,19 +103,19 @@ private fun PopulationResultItem( Column( modifier = modifier.wrapContentWidth(), verticalArrangement = Arrangement.SpaceBetween, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Text( text = "${measureReportIndividualResult.percentage}%", fontSize = 16.sp, fontWeight = FontWeight.Normal, - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) Text( text = measureReportIndividualResult.count, fontSize = 16.sp, color = colorResource(id = R.color.darkGrayText), - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportRow.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportRow.kt index 02328000c7..ee1e6fd030 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportRow.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/MeasureReportRow.kt @@ -51,7 +51,7 @@ fun MeasureReportRowPreview() { id = "fid", title = "4+ ANC Contacts ", description = "Pregnant women with at least four ANC Contacts", - reportType = "4" + reportType = "4", ) MeasureReportRow(measureReportRowData = measureReportRowData, onRowClick = {}) } @@ -60,29 +60,29 @@ fun MeasureReportRowPreview() { fun MeasureReportRow( measureReportRowData: MeasureReportRowData, onRowClick: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, - modifier = modifier.clickable { onRowClick() }.fillMaxWidth().height(IntrinsicSize.Min) + modifier = modifier.clickable { onRowClick() }.fillMaxWidth().height(IntrinsicSize.Min), ) { Column(modifier = modifier.padding(16.dp).weight(0.70f)) { Text( text = measureReportRowData.title, fontSize = 18.sp, - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) Spacer(modifier = modifier.height(8.dp)) Row( horizontalArrangement = Arrangement.SpaceAround, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Text( color = SubtitleTextColor, text = measureReportRowData.description, fontSize = 14.sp, - modifier = modifier.wrapContentWidth() + modifier = modifier.wrapContentWidth(), ) } } @@ -90,7 +90,7 @@ fun MeasureReportRow( painter = painterResource(id = R.drawable.ic_forward_arrow), contentDescription = "", colorFilter = ColorFilter.tint(colorResource(id = R.color.status_gray)), - modifier = Modifier.padding(end = 12.dp) + modifier = Modifier.padding(end = 12.dp), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/PatientSelector.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/PatientSelector.kt index 72c03ba486..a5d430b162 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/PatientSelector.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/components/PatientSelector.kt @@ -48,12 +48,12 @@ import org.smartregister.fhircore.quest.R fun PatientSelector( patientName: String, onChangePatient: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( modifier = modifier.wrapContentWidth().padding(vertical = 8.dp, horizontal = 8.dp), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Box( modifier = @@ -62,11 +62,11 @@ fun PatientSelector( .background(color = Color.LightGray.copy(alpha = 0.4f)) .wrapContentWidth() .padding(8.dp), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Row( modifier = Modifier.align(Alignment.Center), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Text(text = patientName, textAlign = TextAlign.Center, fontSize = 16.sp) Spacer(modifier = Modifier.size(8.dp)) @@ -76,7 +76,7 @@ fun PatientSelector( .clip(RoundedCornerShape(8.dp)) .background(color = Color.LightGray) .wrapContentWidth() - .clickable { onChangePatient() } + .clickable { onChangePatient() }, ) { Box( modifier = @@ -86,12 +86,12 @@ fun PatientSelector( .background(color = Color.DarkGray.copy(alpha = 0.4f)) .wrapContentWidth() .padding(4.dp), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { Icon( Icons.Filled.Close, contentDescription = "Back arrow", - modifier = Modifier.size(20.dp) + modifier = Modifier.size(20.dp), ) } } @@ -104,13 +104,13 @@ fun PatientSelector( .clickable { onChangePatient() } .padding(vertical = 8.dp, horizontal = 12.dp), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Text( text = stringResource(id = R.string.change), textAlign = TextAlign.Center, color = InfoColor, - fontSize = 16.sp + fontSize = 16.sp, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportIndividualResult.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportIndividualResult.kt index c6935bfec9..3a4f411250 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportIndividualResult.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportIndividualResult.kt @@ -27,5 +27,5 @@ data class MeasureReportIndividualResult( val description: String = "", val title: String = "", val percentage: String = "", - val count: String = "" + val count: String = "", ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportPopulationResult.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportPopulationResult.kt index 8c9168d491..75e82b9207 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportPopulationResult.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportPopulationResult.kt @@ -23,5 +23,5 @@ import kotlinx.serialization.Serializable @Serializable data class MeasureReportPopulationResult( val title: String = "", - val dataList: List = emptyList() + val dataList: List = emptyList(), ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportTypeData.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportTypeData.kt index eeec0e6097..deafba48ae 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportTypeData.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/models/MeasureReportTypeData.kt @@ -20,5 +20,5 @@ import org.hl7.fhir.r4.model.MeasureReport data class MeasureReportTypeData( val textResource: Int, - val measureReportType: MeasureReport.MeasureReportType + val measureReportType: MeasureReport.MeasureReportType, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportListScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportListScreen.kt index 6cfb15eb3f..e8b96063d5 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportListScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportListScreen.kt @@ -52,7 +52,7 @@ fun MeasureReportListScreen( navController: NavController, dataList: Flow>, onReportMeasureClicked: (MeasureReportRowData) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val lazyReportItems = dataList.collectAsLazyPagingItems() @@ -66,9 +66,9 @@ fun MeasureReportListScreen( } }, contentColor = Color.White, - backgroundColor = MaterialTheme.colors.primary + backgroundColor = MaterialTheme.colors.primary, ) - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { LazyColumn(modifier = modifier.background(Color.White).fillMaxSize()) { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportPatientsScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportPatientsScreen.kt index 9beea7b701..9a42c6a57a 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportPatientsScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportPatientsScreen.kt @@ -52,7 +52,7 @@ import timber.log.Timber fun MeasureReportPatientsScreen( navController: NavController, measureReportViewModel: MeasureReportViewModel, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val pagingItems = measureReportViewModel.patientsData.collectAsState(emptyFlow()).value.collectAsLazyPagingItems() @@ -65,17 +65,17 @@ fun MeasureReportPatientsScreen( measureReportViewModel.onEvent(MeasureReportEvent.OnSearchTextChanged(it)) }, onBackPress = { navController.popBackStack() }, - searchTextState = measureReportViewModel.searchTextState + searchTextState = measureReportViewModel.searchTextState, ) Text( color = SubtitleTextColor, text = stringResource(id = R.string.select_patient), fontSize = 14.sp, - modifier = modifier.wrapContentWidth().padding(16.dp) + modifier = modifier.wrapContentWidth().padding(16.dp), ) Divider(color = DividerColor) } - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { LazyColumn { @@ -85,7 +85,7 @@ fun MeasureReportPatientsScreen( onRowClick = { patientViewData -> measureReportViewModel.onEvent(MeasureReportEvent.OnPatientSelected(patientViewData)) navController.popBackStack() - } + }, ) Divider(color = DividerColor, thickness = 1.dp) } @@ -100,7 +100,7 @@ fun MeasureReportPatientsScreen( item { ErrorMessage( message = loadStateError.error.also { Timber.e(it) }.localizedMessage!!, - onClickRetry = { retry() } + onClickRetry = { retry() }, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportResultScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportResultScreen.kt index 8ae4d115b7..ad57ee4440 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportResultScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/MeasureReportResultScreen.kt @@ -62,7 +62,7 @@ import org.smartregister.fhircore.quest.ui.shared.models.MeasureReportPatientVie @Composable fun MeasureReportResultScreen( navController: NavController, - measureReportViewModel: MeasureReportViewModel + measureReportViewModel: MeasureReportViewModel, ) { val uiState = measureReportViewModel.reportTypeSelectorUiState.value @@ -77,7 +77,7 @@ fun MeasureReportResultScreen( startDate = uiState.startDate, measureReportIndividualResult = measureReportViewModel.measureReportIndividualResult.value, measureReportPopulationResult = measureReportViewModel.measureReportPopulationResults.value, - patientViewData = uiState.patientViewData + patientViewData = uiState.patientViewData, ) } @@ -91,7 +91,7 @@ fun MeasureReportResultPage( patientViewData: MeasureReportPatientViewData?, measureReportIndividualResult: MeasureReportIndividualResult?, measureReportPopulationResult: List?, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Scaffold( topBar = { @@ -103,13 +103,13 @@ fun MeasureReportResultPage( } }, contentColor = Color.White, - backgroundColor = MaterialTheme.colors.primary + backgroundColor = MaterialTheme.colors.primary, ) - } + }, ) { Column( modifier = - modifier.background(color = colorResource(id = R.color.backgroundGray)).fillMaxSize() + modifier.background(color = colorResource(id = R.color.backgroundGray)).fillMaxSize(), ) { Column(modifier = modifier.padding(16.dp)) { Box( @@ -119,21 +119,22 @@ fun MeasureReportResultPage( .background(color = colorResource(id = R.color.light_gray_background)) .padding(12.dp) .wrapContentWidth(), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { - if (measureReportRowData != null) + if (measureReportRowData != null) { Text( text = measureReportRowData.description, textAlign = TextAlign.Start, - fontSize = 16.sp + fontSize = 16.sp, ) + } } Spacer(modifier = modifier.height(16.dp)) // Display date range e.g. 1 Apr, 2020 - 28 Apr, 2022 Row( horizontalArrangement = Arrangement.SpaceAround, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { DateRangeItem(text = startDate, showBackground = false) Text("-", fontSize = 18.sp, modifier = modifier.padding(horizontal = 8.dp)) @@ -147,7 +148,7 @@ fun MeasureReportResultPage( patientViewData = patientViewData, isMatchedIndicator = measureReportIndividualResult.isMatchedIndicator, indicatorStatus = measureReportIndividualResult.status, - indicatorDescription = measureReportIndividualResult.description + indicatorDescription = measureReportIndividualResult.description, ) } if (measureReportPopulationResult != null) { @@ -168,7 +169,7 @@ private fun MeasureReportResultScreenForIndividualPreview() { measureReportRowData = MeasureReportRowData( title = "First ANC", - description = "Description For Preview, i.e 4+ Anc women etc, 2 lines text in preview" + description = "Description For Preview, i.e 4+ Anc women etc, 2 lines text in preview", ), startDate = "25 Nov, 2021", endDate = "29 Nov, 2021", @@ -177,11 +178,11 @@ private fun MeasureReportResultScreenForIndividualPreview() { name = "Jacky Coughlin", gender = "F", age = "27", - logicalId = "1920192" + logicalId = "1920192", ), measureReportIndividualResult = MeasureReportIndividualResult(status = "True", isMatchedIndicator = true, description = ""), - null + null, ) } @@ -198,7 +199,7 @@ private fun MeasureReportResultScreenForPopulationPreview() { navController = rememberNavController(), measureReportRowData = MeasureReportRowData( - description = "Description For Preview, i.e 4+ Anc women etc, 2 lines text in preview" + description = "Description For Preview, i.e 4+ Anc women etc, 2 lines text in preview", ), startDate = "25 Nov, 2021", endDate = "29 Nov, 2021", @@ -207,19 +208,19 @@ private fun MeasureReportResultScreenForPopulationPreview() { name = "Jacky Coughlin", gender = "F", age = "27", - logicalId = "1902912" + logicalId = "1902912", ), measureReportIndividualResult = null, measureReportPopulationResult = listOf( MeasureReportPopulationResult( title = "Age Range", - listOf(testResultItem1, testResultItem2) + listOf(testResultItem1, testResultItem2), ), MeasureReportPopulationResult( title = "Education Level", - listOf(testResultItem1, testResultItem2) - ) - ) + listOf(testResultItem1, testResultItem2), + ), + ), ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/ReportTypeSelectorScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/ReportTypeSelectorScreen.kt index 817f2bf2e8..ca7d3f2e0d 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/ReportTypeSelectorScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/report/measure/screens/ReportTypeSelectorScreen.kt @@ -103,9 +103,9 @@ fun ReportTypeSelectorScreen( measureReportViewModel.resetState() navController.popBackStack( route = MeasureReportNavigationScreen.MeasureReportList.route, - inclusive = false + inclusive = false, ) - } + }, ) } @@ -123,9 +123,8 @@ fun ReportTypeSelectorPage( onGenerateReportClicked: () -> Unit, onBackPress: () -> Unit, modifier: Modifier = Modifier, - showProgressIndicator: Boolean = false + showProgressIndicator: Boolean = false, ) { - Scaffold( topBar = { TopAppBar( @@ -134,9 +133,9 @@ fun ReportTypeSelectorPage( IconButton(onClick = onBackPress) { Icon(Icons.Filled.ArrowBack, null) } }, contentColor = Color.White, - backgroundColor = MaterialTheme.colors.primary + backgroundColor = MaterialTheme.colors.primary, ) - } + }, ) { innerPadding -> Box(modifier = modifier.padding(innerPadding)) { Column(modifier = modifier.fillMaxSize()) { @@ -150,7 +149,7 @@ fun ReportTypeSelectorPage( Text( text = stringResource(R.string.please_wait), textAlign = TextAlign.Center, - modifier = modifier.padding(vertical = 16.dp) + modifier = modifier.padding(vertical = 16.dp), ) } } else { @@ -159,7 +158,7 @@ fun ReportTypeSelectorPage( startDate = startDate, endDate = endDate, dateRange = dateRange, - onDateRangeSelected = onDateRangeSelected + onDateRangeSelected = onDateRangeSelected, ) Spacer(modifier = modifier.size(28.dp)) PatientSelectionBox( @@ -167,25 +166,25 @@ fun ReportTypeSelectorPage( listOf( MeasureReportTypeData( textResource = R.string.all, - measureReportType = MeasureReport.MeasureReportType.SUMMARY + measureReportType = MeasureReport.MeasureReportType.SUMMARY, ), MeasureReportTypeData( textResource = R.string.individual, - measureReportType = MeasureReport.MeasureReportType.INDIVIDUAL - ) + measureReportType = MeasureReport.MeasureReportType.INDIVIDUAL, + ), ), patientName = patientName, reportTypeState = reportTypeState, - onReportTypeSelected = onReportTypeSelected + onReportTypeSelected = onReportTypeSelected, ) Column( modifier = modifier.fillMaxHeight(), - verticalArrangement = Arrangement.Bottom + verticalArrangement = Arrangement.Bottom, ) { Row(modifier = modifier.fillMaxWidth(), verticalAlignment = Alignment.Bottom) { GenerateReportButton( generateReportEnabled = generateReport, - onGenerateReportClicked = onGenerateReportClicked + onGenerateReportClicked = onGenerateReportClicked, ) } } @@ -203,17 +202,17 @@ fun PatientSelectionBox( patientName: String?, reportTypeState: MutableState, onReportTypeSelected: (MeasureReport.MeasureReportType) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column( modifier = modifier.wrapContentWidth(), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.Start + horizontalAlignment = Alignment.Start, ) { Text( text = stringResource(id = R.string.patient), fontSize = 18.sp, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) radioOptions.forEach { reportTypeData -> @@ -223,7 +222,7 @@ fun PatientSelectionBox( onClick = { reportTypeState.value = reportTypeData.measureReportType onReportTypeSelected(reportTypeState.value) - } + }, ) Text( text = stringResource(id = reportTypeData.textResource), @@ -232,13 +231,14 @@ fun PatientSelectionBox( modifier.clickable { reportTypeState.value = reportTypeData.measureReportType onReportTypeSelected(reportTypeState.value) - } + }, ) } Spacer(modifier = modifier.size(4.dp)) } - if (reportTypeState.value == MeasureReport.MeasureReportType.INDIVIDUAL && + if ( + reportTypeState.value == MeasureReport.MeasureReportType.INDIVIDUAL && !patientName.isNullOrEmpty() ) { Row(modifier = modifier.padding(start = 24.dp)) { @@ -256,18 +256,18 @@ fun PatientSelectionBox( fun GenerateReportButton( generateReportEnabled: Boolean, onGenerateReportClicked: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column { Button( enabled = generateReportEnabled, onClick = onGenerateReportClicked, - modifier = modifier.fillMaxWidth() + modifier = modifier.fillMaxWidth(), ) { Text( color = Color.White, text = stringResource(id = R.string.generate_report), - modifier = modifier.padding(8.dp) + modifier = modifier.padding(8.dp), ) } } @@ -288,11 +288,11 @@ fun PatientSelectionAllPreview() { MeasureReportTypeData( textResource = R.string.individual, measureReportType = MeasureReport.MeasureReportType.INDIVIDUAL, - ) + ), ), reportTypeState = reportTypeState, onReportTypeSelected = {}, - patientName = null + patientName = null, ) } @@ -311,11 +311,11 @@ fun PatientSelectionIndividualPreview() { MeasureReportTypeData( textResource = R.string.individual, measureReportType = MeasureReport.MeasureReportType.INDIVIDUAL, - ) + ), ), reportTypeState = reportTypeState, onReportTypeSelected = {}, - patientName = "John Jared" + patientName = "John Jared", ) } @@ -339,6 +339,6 @@ fun ReportFilterPreview() { onReportTypeSelected = {}, reportTypeState = reportTypeState, showProgressIndicator = false, - onBackPress = {} + onBackPress = {}, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/components/SearchBar.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/components/SearchBar.kt index 4f1c3e25fb..3d5aef2a5f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/components/SearchBar.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/components/SearchBar.kt @@ -55,7 +55,7 @@ fun SearchBar( onTextChanged: (String) -> Unit, onBackPress: () -> Unit, searchTextState: MutableState, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Box(modifier = modifier.background(color = Color.White)) { TextField( @@ -71,7 +71,7 @@ fun SearchBar( Icon( Icons.Filled.ArrowBack, contentDescription = null, - modifier = modifier.padding(16.dp) + modifier = modifier.padding(16.dp), ) } }, @@ -83,12 +83,12 @@ fun SearchBar( // Remove text from TextField when you press the 'X' icon searchTextState.value = TextFieldValue("") onTextChanged(searchTextState.value.text) - } + }, ) { Icon( Icons.Default.Close, contentDescription = "", - modifier = modifier.padding(16.dp).size(24.dp) + modifier = modifier.padding(16.dp).size(24.dp), ) } } @@ -100,9 +100,9 @@ fun SearchBar( backgroundColor = Color.White, focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, - disabledIndicatorColor = Color.Transparent + disabledIndicatorColor = Color.Transparent, ), - placeholder = { SearchHint(modifier) } + placeholder = { SearchHint(modifier) }, ) } } @@ -111,7 +111,7 @@ fun SearchBar( fun SearchHint(modifier: Modifier) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = modifier.wrapContentHeight().focusable(false).then(modifier) + modifier = modifier.wrapContentHeight().focusable(false).then(modifier), ) { Text( color = Color(0xff757575), diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/MeasureReportPatientViewData.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/MeasureReportPatientViewData.kt index d886253d53..2441c18c0b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/MeasureReportPatientViewData.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/MeasureReportPatientViewData.kt @@ -21,7 +21,7 @@ data class MeasureReportPatientViewData( val name: String, val gender: String, val age: String, - val family: String? = null + val family: String? = null, ) { fun personalDetails() = listOf(name, gender, age).joinToString(", ") } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileRowItem.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileRowItem.kt index e0452f4b86..ddb91c3d19 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileRowItem.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileRowItem.kt @@ -37,5 +37,5 @@ data class PatientProfileRowItem( val actionButtonColor: Color? = null, val actionButtonText: String? = null, val showAngleRightIcon: Boolean = false, - val showDot: Boolean = false + val showDot: Boolean = false, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileViewSection.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileViewSection.kt index 9c60858198..802288315b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileViewSection.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileViewSection.kt @@ -22,5 +22,5 @@ enum class PatientProfileViewSection { UPCOMING_SERVICES, MEDICAL_HISTORY, TEST_RESULTS, - FORMS + FORMS, } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileViewData.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/ProfileViewData.kt similarity index 98% rename from android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileViewData.kt rename to android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/ProfileViewData.kt index fbcacd61df..00adcc2967 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/PatientProfileViewData.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/ProfileViewData.kt @@ -65,7 +65,7 @@ sealed class ProfileViewData( val addressPhysicalLocator: String = "", val phoneContacts: List = emptyList(), val observations: List = emptyList(), - val practitioners: List = emptyList() + val practitioners: List = emptyList(), ) : ProfileViewData(name = name, logicalId = logicalId, identifier = identifier) { val tasksCompleted = carePlans.isNotEmpty() && @@ -90,7 +90,7 @@ sealed class ProfileViewData( override val name: String = "", val address: String = "", val age: String = "", - val familyMemberViewStates: List = emptyList() + val familyMemberViewStates: List = emptyList(), ) : ProfileViewData(logicalId = logicalId, name = name) data class TracingProfileData( diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/RegisterViewData.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/RegisterViewData.kt index 9513f26bd7..6adc83ea49 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/RegisterViewData.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/shared/models/RegisterViewData.kt @@ -42,5 +42,5 @@ data class RegisterViewData( val showDivider: Boolean = false, val showServiceButton: Boolean = true, val registerType: KClass = RegisterData.DefaultRegisterData::class, - val identifier: String = "" + val identifier: String = "", ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/task/PatientTaskFragment.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/task/PatientTaskFragment.kt index c1c00f4ab1..b82e6c9e1c 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/task/PatientTaskFragment.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/task/PatientTaskFragment.kt @@ -41,7 +41,9 @@ import org.smartregister.fhircore.quest.util.QuestJsonSpecificationProvider class PatientTaskFragment : ComposeRegisterFragment() { @Inject lateinit var patientTaskRepository: PatientTaskRepository + @Inject lateinit var questJsonSpecificationProvider: QuestJsonSpecificationProvider + @Inject lateinit var configurationRegistry: ConfigurationRegistry override lateinit var registerViewConfiguration: RegisterViewConfiguration @@ -51,7 +53,7 @@ class PatientTaskFragment : ComposeRegisterFragment, - modifier: Modifier + modifier: Modifier, ) { PatientTaskList( pagingItems = pagingItems, useLabel = registerViewConfiguration.useLabel, modifier = Modifier, - clickListener = { listenerIntent, data -> onItemClicked(listenerIntent, data) } + clickListener = { listenerIntent, data -> onItemClicked(listenerIntent, data) }, ) } @@ -80,7 +82,7 @@ class PatientTaskFragment : ComposeRegisterFragment, useLabel: Boolean, modifier: Modifier = Modifier, - clickListener: (PatientTaskListenerIntent, PatientTaskItem) -> Unit + clickListener: (PatientTaskListenerIntent, PatientTaskItem) -> Unit, ) { - LazyColumn { items(pagingItems, key = { it.id }) { PatientTaskRow(it!!, useLabel, clickListener, modifier = modifier) @@ -61,7 +60,7 @@ fun PatientTaskList( ErrorMessage( message = loadStateError.error.localizedMessage!!, modifier = modifier.fillParentMaxSize(), - onClickRetry = { retry() } + onClickRetry = { retry() }, ) } } @@ -91,7 +90,7 @@ fun dummyPatientTaskPagingList(): LazyPagingItems { birthdate = "2020-03-10".getDate("yyyy-MM-dd"), address = "Nairobi", description = "Sick Visit", - overdue = true + overdue = true, ), PatientTaskItem( id = "2", @@ -100,10 +99,10 @@ fun dummyPatientTaskPagingList(): LazyPagingItems { birthdate = "2021-04-20".getDate("yyyy-MM-dd"), address = "Nairobi", description = "Immunization Visit", - overdue = false - ) - ) - ) + overdue = false, + ), + ), + ), ) return listFlow.collectAsLazyPagingItems() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/task/components/PatientTaskListItem.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/task/components/PatientTaskListItem.kt index c6dc178672..8d81c414c6 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/task/components/PatientTaskListItem.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/task/components/PatientTaskListItem.kt @@ -78,28 +78,28 @@ fun PatientTaskRow( Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, - modifier = modifier.testTag(ROW_PATIENT_TASK).fillMaxWidth().height(IntrinsicSize.Min) + modifier = modifier.testTag(ROW_PATIENT_TASK).fillMaxWidth().height(IntrinsicSize.Min), ) { Column( modifier = - modifier.wrapContentWidth(Alignment.Start).padding(horizontal = 16.dp, vertical = 16.dp) + modifier.wrapContentWidth(Alignment.Start).padding(horizontal = 16.dp, vertical = 16.dp), ) { Text( text = titleText, fontSize = 18.sp, - modifier = modifier.testTag(TEXT_TITLE).wrapContentWidth() + modifier = modifier.testTag(TEXT_TITLE).wrapContentWidth(), ) Spacer(modifier = modifier.height(8.dp)) Row( horizontalArrangement = Arrangement.SpaceAround, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { if (useLabel) { Text( color = SubtitleTextColor, text = subTitleText, fontSize = 14.sp, - modifier = modifier.testTag(TEXT_SUBTITLE_ADDRESS).wrapContentWidth() + modifier = modifier.testTag(TEXT_SUBTITLE_ADDRESS).wrapContentWidth(), ) Separator(modifier = modifier, showSeparator = patientItem.id.isNotEmpty()) if (patientItem.id.isNotEmpty()) { @@ -107,27 +107,27 @@ fun PatientTaskRow( color = SubtitleTextColor, text = stringResource(R.string.hash_sign) + patientItem.id, fontSize = 14.sp, - modifier = modifier.testTag(TEXT_SUBTITLE_ID).wrapContentWidth() + modifier = modifier.testTag(TEXT_SUBTITLE_ID).wrapContentWidth(), ) } } else { Image( painter = painterResource(id = R.drawable.ic_walk), contentDescription = null, - modifier = modifier.testTag(ICON_SUBTITLE).padding(end = 4.dp) + modifier = modifier.testTag(ICON_SUBTITLE).padding(end = 4.dp), ) Text( color = SubtitleTextColor, text = stringResource(R.string.sample_distance), fontSize = 14.sp, - modifier = modifier.testTag(TEXT_SUBTITLE_DISTANCE).wrapContentWidth() + modifier = modifier.testTag(TEXT_SUBTITLE_DISTANCE).wrapContentWidth(), ) Separator(modifier = modifier, showSeparator = patientItem.description.isNotEmpty()) Text( color = SubtitleTextColor, text = patientItem.description, fontSize = 14.sp, - modifier = modifier.testTag(TEXT_SUBTITLE_DESCRIPTION).wrapContentWidth() + modifier = modifier.testTag(TEXT_SUBTITLE_DESCRIPTION).wrapContentWidth(), ) } } @@ -137,14 +137,14 @@ fun PatientTaskRow( modifier = modifier.testTag(LABEL_MAIN).wrapContentWidth(Alignment.End).padding(horizontal = 16.dp), patientItem = patientItem, - clickListener = clickListener + clickListener = clickListener, ) } else { TaskIcon( modifier = modifier.testTag(ICON_MAIN).wrapContentWidth(Alignment.End).padding(horizontal = 16.dp), patientItem = patientItem, - clickListener = clickListener + clickListener = clickListener, ) } } @@ -154,7 +154,7 @@ fun PatientTaskRow( fun TaskIcon( patientItem: PatientTaskItem, clickListener: (PatientTaskListenerIntent, PatientTaskItem) -> Unit, - modifier: Modifier + modifier: Modifier, ) { val iconId = if (patientItem.overdue) R.drawable.ic_overdue else R.drawable.ic_due Image(painter = painterResource(id = iconId), contentDescription = null, modifier = modifier) @@ -164,7 +164,7 @@ fun TaskIcon( fun TaskLabel( patientItem: PatientTaskItem, clickListener: (PatientTaskListenerIntent, PatientTaskItem) -> Unit, - modifier: Modifier + modifier: Modifier, ) { val textColor = if (patientItem.overdue) OverdueDarkRedColor else BlueTextColor val bgColor = if (patientItem.overdue) OverdueLightColor else DueLightColor @@ -180,6 +180,6 @@ fun TaskLabel( .clip(RoundedCornerShape(2.8.dp)) .wrapContentWidth() .background(color = bgColor) - .padding(4.8.dp) + .padding(4.8.dp), ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/layouts.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/Layouts.kt similarity index 93% rename from android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/layouts.kt rename to android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/Layouts.kt index 67432e0e19..54c0621b80 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/layouts.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/Layouts.kt @@ -37,14 +37,17 @@ fun InfoBoxItem(title: String, value: String, modifier: Modifier = Modifier) { text = title, modifier.padding(bottom = 4.dp, end = 8.dp), color = StatusTextColor, - fontSize = 18.sp + fontSize = 18.sp, ) Text(text = value, fontSize = 18.sp) } } @Composable -fun OutlineCard(modifier: Modifier = Modifier, content: (@Composable() () -> Unit)) { +fun OutlineCard( + modifier: Modifier = Modifier, + content: (@Composable() () -> Unit), +) { Card( elevation = 0.dp, shape = RoundedCornerShape(12.dp), diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/TracingDataList.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/TracingDataList.kt index afef538af5..0b74bb3701 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/TracingDataList.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/components/TracingDataList.kt @@ -54,7 +54,7 @@ fun TracingDataScaffoldList( title: String, navController: NavHostController, viewModel: GeneralListViewModel, - content: (@Composable() (value: T) -> Unit) + content: (@Composable() (value: T) -> Unit), ) { Scaffold( topBar = { @@ -66,7 +66,7 @@ fun TracingDataScaffoldList( } }, ) - } + }, ) { innerPadding -> val pagingItems: LazyPagingItems = viewModel.paginateData.collectAsState().value.collectAsLazyPagingItems() @@ -76,7 +76,7 @@ fun TracingDataScaffoldList( pagingItems = pagingItems, refreshing = viewModel.isRefreshing, refresh = { viewModel.refresh() }, - content = content + content = content, ) } } @@ -87,7 +87,7 @@ fun TracingDataList( modifier: Modifier = Modifier, refreshing: StateFlow, refresh: () -> Unit, - content: (@Composable() (value: T) -> Unit) + content: (@Composable() (value: T) -> Unit), ) { Box(modifier = modifier) { val isRefreshing by refreshing.collectAsState() @@ -95,15 +95,16 @@ fun TracingDataList( state = rememberSwipeRefreshState(isRefreshing), onRefresh = refresh, // indicator = { _, _ -> } - ) { + ) { LazyColumn( modifier = modifier.padding(horizontal = 12.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) + verticalArrangement = Arrangement.spacedBy(8.dp), ) { item { Spacer(modifier = Modifier.height(8.dp)) } items(pagingItems) { history -> if (history != null) content(history) } pagingItems.apply { - if (itemCount <= 0 && + if ( + itemCount <= 0 && loadState.source.refresh is LoadState.NotLoading && loadState.append.endOfPaginationReached ) { @@ -119,7 +120,7 @@ fun TracingDataList( item { ErrorMessage( message = loadStateError.error.also { Timber.e(it) }.localizedMessage!!, - onClickRetry = { retry() } + onClickRetry = { retry() }, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/details/TracingHistoryDetailsScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/details/TracingHistoryDetailsScreen.kt index e710c18230..a49586f4b7 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/details/TracingHistoryDetailsScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/details/TracingHistoryDetailsScreen.kt @@ -44,7 +44,7 @@ import org.smartregister.fhircore.quest.ui.tracing.components.OutlineCard fun TracingHistoryDetailsScreen( title: String, navController: NavHostController, - viewModel: TracingHistoryDetailsViewModel = hiltViewModel() + viewModel: TracingHistoryDetailsViewModel = hiltViewModel(), ) { Scaffold( topBar = { @@ -56,11 +56,13 @@ fun TracingHistoryDetailsScreen( } }, ) - } + }, ) { innerPadding -> Column( - Modifier.padding(innerPadding).padding(horizontal = 12.dp, vertical = 8.dp).fillMaxSize() - ) { TracingHistoryDetailsScreenView(viewModel) } + Modifier.padding(innerPadding).padding(horizontal = 12.dp, vertical = 8.dp).fillMaxSize(), + ) { + TracingHistoryDetailsScreenView(viewModel) + } } } @@ -82,13 +84,13 @@ fun HistoryDetailsCard(details: TracingOutcomeDetails) { InfoBoxItem(title = "Date:", value = details.date.asDdMmYyyy()) InfoBoxItem( title = "Reason for tracing:", - value = details.reasons.joinToString(separator = ",") + value = details.reasons.joinToString(separator = ","), ) InfoBoxItem(title = "Spoke to patient:", value = if (details.conducted) "Yes" else "No") InfoBoxItem(title = "Tracing Outcome:", value = details.outcome) InfoBoxItem( title = "Date of Clinic Appointment:", - value = details.dateOfAppointment?.asDdMmYyyy() ?: "N/A" + value = details.dateOfAppointment?.asDdMmYyyy() ?: "N/A", ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/details/TracingHistoryDetailsViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/details/TracingHistoryDetailsViewModel.kt index c473cd09e5..5de6f3a7cd 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/details/TracingHistoryDetailsViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/details/TracingHistoryDetailsViewModel.kt @@ -53,14 +53,15 @@ constructor( object : OnSyncListener { override fun onSync(state: SyncJobStatus) { when (state) { - is SyncJobStatus.Finished, is SyncJobStatus.Failed -> { + is SyncJobStatus.Finished, + is SyncJobStatus.Failed, -> { fetchTracingData() } else -> {} } } }, - viewModelScope + viewModelScope, ) fetchTracingData() @@ -70,7 +71,7 @@ constructor( viewModelScope.launch { try { _tracingHistoryDetailsViewDataFlow.emit( - repository.getHistoryDetails(historyId = historyId, encounterId = encounterId) + repository.getHistoryDetails(historyId = historyId, encounterId = encounterId), ) } catch (e: Exception) { e.printStackTrace() diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryEvent.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryEvent.kt index da7424f357..4ef48979d1 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryEvent.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryEvent.kt @@ -23,6 +23,6 @@ sealed class TracingHistoryEvent { data class OpenOutComesScreen( val navController: NavHostController, val context: Context, - val historyId: String + val historyId: String, ) : TracingHistoryEvent() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryScreen.kt index b75a3e132c..0bee906037 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryScreen.kt @@ -41,7 +41,7 @@ import org.smartregister.fhircore.quest.ui.tracing.components.TracingDataScaffol @Composable fun TracingHistoryScreen( navController: NavHostController, - viewModel: TracingHistoryViewModel = hiltViewModel() + viewModel: TracingHistoryViewModel = hiltViewModel(), ) { val context = LocalContext.current @@ -57,12 +57,12 @@ fun TracingHistoryScreen( TracingHistoryEvent.OpenOutComesScreen( context = context, navController = navController, - historyId = history.historyId - ) + historyId = history.historyId, + ), ) - } + }, ) - } + }, ) } @@ -81,9 +81,9 @@ fun TracingHistoryCard(history: TracingHistory, onClick: () -> Unit) { style = MaterialTheme.typography.subtitle1.copy( color = if (history.isActive) SuccessColor else MaterialTheme.colors.onSurface, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ), - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryViewModel.kt index d55dfeb2a3..04c7e8ca7b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/history/TracingHistoryViewModel.kt @@ -47,12 +47,13 @@ constructor( val urlParams = NavigationArg.bindArgumentsOf( Pair(NavigationArg.PATIENT_ID, patientId), - Pair(NavigationArg.TRACING_ID, event.historyId) + Pair(NavigationArg.TRACING_ID, event.historyId), ) event.navController.navigate(route = MainNavigationScreen.TracingOutcomes.route + urlParams) } } } + override fun paginateRegisterDataFlow(page: Int): Flow> { paginateData.value = createPager( @@ -61,9 +62,9 @@ constructor( repository.getTracingHistory( currentPage = currentPage, loadAll = false, - patientId = patientId + patientId = patientId, ) - } + }, ) .flow .cachedIn(viewModelScope) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesEvent.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesEvent.kt index bd9436dcba..b6c5c0210d 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesEvent.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesEvent.kt @@ -25,6 +25,6 @@ sealed class TracingOutcomesEvent { val context: Context, val title: String, val historyId: String, - val encounterId: String + val encounterId: String, ) : TracingOutcomesEvent() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesScreen.kt index 848f119f70..aea72e3d45 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesScreen.kt @@ -37,7 +37,7 @@ import org.smartregister.fhircore.quest.ui.tracing.components.TracingDataScaffol @Composable fun TracingOutcomesScreen( navController: NavHostController, - viewModel: TracingOutcomesViewModel = hiltViewModel() + viewModel: TracingOutcomesViewModel = hiltViewModel(), ) { val context = LocalContext.current TracingDataScaffoldList( @@ -52,11 +52,11 @@ fun TracingOutcomesScreen( navController = navController, historyId = it.historyId, encounterId = it.encounterId, - title = it.title - ) + title = it.title, + ), ) } - } + }, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesViewModel.kt index c0ab47f44b..0a14e228d6 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/outcomes/TracingOutcomesViewModel.kt @@ -50,10 +50,10 @@ constructor( Pair(NavigationArg.PATIENT_ID, patientId), Pair(NavigationArg.TRACING_ID, event.historyId), Pair(NavigationArg.TRACING_ENCOUNTER_ID, event.encounterId), - Pair(NavigationArg.SCREEN_TITLE, event.title) + Pair(NavigationArg.SCREEN_TITLE, event.title), ) event.navController.navigate( - route = MainNavigationScreen.TracingHistoryDetails.route + urlParams + route = MainNavigationScreen.TracingHistoryDetails.route + urlParams, ) } } @@ -63,7 +63,7 @@ constructor( paginateData.value = createPager( pageSize = DEFAULT_PAGE_SIZE, - block = { currentPage -> repository.getTracingOutcomes(currentPage, tracingId) } + block = { currentPage -> repository.getTracingOutcomes(currentPage, tracingId) }, ) .flow .cachedIn(viewModelScope) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileEvent.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileEvent.kt index 9257132e04..7cec1aede6 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileEvent.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileEvent.kt @@ -32,13 +32,13 @@ sealed class TracingProfileEvent { data class OpenTracingOutcomeScreen( val navController: NavHostController, val context: Context, - val historyId: String + val historyId: String, ) : TracingProfileEvent() data class OverflowMenuClick( val navController: NavHostController, val context: Context, - val menuId: Int + val menuId: Int, ) : TracingProfileEvent() data class CallPhoneNumber( diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileScreen.kt index 6de83493ca..99b9d9412b 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileScreen.kt @@ -84,14 +84,13 @@ import org.smartregister.fhircore.quest.ui.tracing.components.OutlineCard fun TracingProfileScreen( navController: NavHostController, modifier: Modifier = Modifier, - viewModel: TracingProfileViewModel = hiltViewModel() + viewModel: TracingProfileViewModel = hiltViewModel(), ) { - TracingProfilePage( navController, modifier = modifier, tracingProfileViewModel = viewModel, - onBackPress = { navController.popBackStack() } + onBackPress = { navController.popBackStack() }, ) } @@ -102,7 +101,6 @@ fun TracingProfilePage( onBackPress: () -> Unit, tracingProfileViewModel: TracingProfileViewModel, ) { - val context = LocalContext.current val profileViewDataState = tracingProfileViewModel.patientProfileViewData.collectAsState() val profileViewData by remember { profileViewDataState } @@ -122,19 +120,19 @@ fun TracingProfilePage( Icon( imageVector = Icons.Outlined.Refresh, contentDescription = null, - tint = Color.White + tint = Color.White, ) } IconButton(onClick = { showOverflowMenu = !showOverflowMenu }) { Icon( imageVector = Icons.Outlined.MoreVert, contentDescription = null, - tint = Color.White + tint = Color.White, ) } DropdownMenu( expanded = showOverflowMenu, - onDismissRequest = { showOverflowMenu = false } + onDismissRequest = { showOverflowMenu = false }, ) { viewState.visibleOverflowMenuItems().forEach { DropdownMenuItem( @@ -144,8 +142,8 @@ fun TracingProfilePage( TracingProfileEvent.OverflowMenuClick( navController = navController, context, - it.id - ) + it.id, + ), ) }, contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp), @@ -154,13 +152,16 @@ fun TracingProfilePage( .fillMaxWidth() .background( color = - if (it.confirmAction) it.titleColor.copy(alpha = 0.1f) - else Color.Transparent - ) - ) { Text(text = stringResource(id = it.titleResource), color = it.titleColor) } + if (it.confirmAction) { + it.titleColor.copy(alpha = 0.1f) + } else Color.Transparent, + ), + ) { + Text(text = stringResource(id = it.titleResource), color = it.titleColor) + } } } - } + }, ) }, bottomBar = { @@ -169,36 +170,36 @@ fun TracingProfilePage( colors = ButtonDefaults.buttonColors( backgroundColor = LoginButtonColor, - LoginFieldBackgroundColor + LoginFieldBackgroundColor, ), enabled = !profileViewData.hasFinishedAttempts, onClick = { tracingProfileViewModel.onEvent(TracingProfileEvent.LoadOutComesForm(context)) }, - modifier = modifier.fillMaxWidth() + modifier = modifier.fillMaxWidth(), ) { Text( color = Color.White, text = stringResource(id = R2.string.tracing_outcomes), - modifier = modifier.padding(8.dp) + modifier = modifier.padding(8.dp), ) } } - } + }, ) { innerPadding -> TracingProfilePageView( innerPadding = innerPadding, profileViewData = profileViewData, onCall = { tracingProfileViewModel.onEvent( - TracingProfileEvent.CallPhoneNumber(navController, context, it) + TracingProfileEvent.CallPhoneNumber(navController, context, it), ) - } + }, ) { val historyId = it.historyId if (historyId != null) { tracingProfileViewModel.onEvent( - TracingProfileEvent.OpenTracingOutcomeScreen(navController, context, historyId) + TracingProfileEvent.OpenTracingOutcomeScreen(navController, context, historyId), ) } else { Toast.makeText(context, "No Tracing outcomes recorded", Toast.LENGTH_SHORT).show() @@ -213,7 +214,7 @@ fun TracingProfilePageView( innerPadding: PaddingValues = PaddingValues(all = 0.dp), profileViewData: ProfileViewData.TracingProfileData = ProfileViewData.TracingProfileData(), onCall: (String) -> Unit, - onCurrentAttemptClicked: (TracingAttempt) -> Unit + onCurrentAttemptClicked: (TracingAttempt) -> Unit, ) { Column(modifier = modifier.fillMaxHeight().fillMaxWidth().padding(innerPadding)) { Box(modifier = Modifier.padding(5.dp).weight(2.0f)) { @@ -221,7 +222,7 @@ fun TracingProfilePageView( modifier = modifier .verticalScroll(rememberScrollState()) - .background(PatientProfileSectionsBackgroundColor) + .background(PatientProfileSectionsBackgroundColor), ) { // Personal Data: e.g. sex, age, dob PatientInfo(profileViewData) @@ -235,21 +236,22 @@ fun TracingProfilePageView( TracingReasonCard( currentAttempt = profileViewData.currentAttempt, displayForHomeTrace = profileViewData.isHomeTracing!!, - onClick = onCurrentAttemptClicked + onClick = onCurrentAttemptClicked, ) } Spacer(modifier = modifier.height(20.dp)) // Tracing Patient address/contact - if (profileViewData.isHomeTracing != null) + if (profileViewData.isHomeTracing != null) { TracingContactAddress( profileViewData, displayForHomeTrace = profileViewData.isHomeTracing, - onCall = onCall + onCall = onCall, ) + } Spacer(modifier = modifier.height(20.dp)) TracingGuardianAddress( guardiansRelatedPersonResource = profileViewData.guardiansRelatedPersonResource, - onCall = onCall + onCall = onCall, ) } } @@ -282,14 +284,14 @@ fun PatientInfo( patientProfileViewData.identifierKey, patientProfileViewData.identifier.ifEmpty { stringResource(R.string.identifier_unassigned) - } + }, ) Text( text = idKeyValue, color = StatusTextColor, fontSize = 18.sp, maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) } } @@ -331,13 +333,13 @@ private fun TracingVisitDue(dueDate: String?, modifier: Modifier = Modifier) { ) { Row( modifier = modifier.padding(6.dp, 8.dp).fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.SpaceBetween, ) { Text( text = stringResource(R2.string.tracing_visit_due), modifier.padding(bottom = 4.dp), color = StatusTextColor, - fontSize = 18.sp + fontSize = 18.sp, ) Text(text = dueDate ?: "N/A", fontSize = 18.sp) } @@ -349,7 +351,7 @@ private fun TracingReasonCard( currentAttempt: TracingAttempt, modifier: Modifier = Modifier, displayForHomeTrace: Boolean = false, - onClick: (TracingAttempt) -> Unit + onClick: (TracingAttempt) -> Unit, ) { OutlineCard( modifier = modifier.fillMaxWidth().clickable { onClick(currentAttempt) }, @@ -358,24 +360,29 @@ private fun TracingReasonCard( TracingReasonItem( title = stringResource(R2.string.reason_for_trace), value = - if (currentAttempt.reasons.isNotEmpty()) + if (currentAttempt.reasons.isNotEmpty()) { currentAttempt.reasons.joinToString(separator = ",") { it } - else "None" + } else { + "None" + }, ) TracingReasonItem( title = - if (displayForHomeTrace) stringResource(R2.string.last_home_trace_outcome) - else stringResource(R2.string.last_phone_trace_outcome), + if (displayForHomeTrace) { + stringResource(R2.string.last_home_trace_outcome) + } else { + stringResource(R2.string.last_phone_trace_outcome) + }, value = currentAttempt.outcome.ifBlank { "None" }, - verticalRenderOrientation = true + verticalRenderOrientation = true, ) TracingReasonItem( title = stringResource(R2.string.date_of_last_attempt), - value = currentAttempt.lastAttempt?.asDdMmYyyy() ?: "None" + value = currentAttempt.lastAttempt?.asDdMmYyyy() ?: "None", ) TracingReasonItem( title = stringResource(R2.string.number_of_attempts), - value = (currentAttempt.numberOfAttempts).toString() + value = (currentAttempt.numberOfAttempts).toString(), ) } } @@ -395,24 +402,24 @@ private fun TracingContactAddress( if (displayForHomeTrace) { TracingReasonItem( title = stringResource(R2.string.patient_district), - value = patientProfileViewData.addressDistrict + value = patientProfileViewData.addressDistrict, ) TracingReasonItem( title = stringResource(R2.string.patient_tracing_catchment), - value = patientProfileViewData.addressTracingCatchment + value = patientProfileViewData.addressTracingCatchment, ) TracingReasonItem( title = stringResource(R2.string.patient_physcal_locator), - value = patientProfileViewData.addressPhysicalLocator + value = patientProfileViewData.addressPhysicalLocator, ) } else { TracingReasonItem( title = stringResource(R2.string.patient_phone_number, 1), - value = patientProfileViewData.phoneContacts.firstOrNull() ?: "" + value = patientProfileViewData.phoneContacts.firstOrNull() ?: "", ) TracingReasonItem( title = stringResource(R2.string.patient_phone_owner, 1), - value = stringResource(R2.string.patient) + value = stringResource(R2.string.patient), ) CallRow { onCall(patientProfileViewData.phoneContacts.firstOrNull() ?: "") } } @@ -424,7 +431,7 @@ private fun TracingContactAddress( private fun TracingGuardianAddress( guardiansRelatedPersonResource: List, modifier: Modifier = Modifier, - onCall: (String) -> Unit + onCall: (String) -> Unit, ) { guardiansRelatedPersonResource.safeSubList(0..1).mapIndexed { i, guardian -> OutlineCard( @@ -433,15 +440,15 @@ private fun TracingGuardianAddress( Column(modifier = modifier.padding(horizontal = 4.dp)) { TracingReasonItem( title = stringResource(R2.string.guardian_relation), - value = guardian.relationshipFirstRep.codingFirstRep.display + value = guardian.relationshipFirstRep.codingFirstRep.display, ) TracingReasonItem( title = stringResource(R2.string.guardian_phone_number, i + 1), - value = guardian.telecomFirstRep.value + value = guardian.telecomFirstRep.value, ) TracingReasonItem( title = stringResource(R2.string.guardian_phone_owner, i + 1), - value = "Guardian ${i + 1}" + value = "Guardian ${i + 1}", ) CallRow { onCall(guardian.telecomFirstRep.value) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileViewModel.kt index d44fb15597..b4ff08ec6f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/profile/TracingProfileViewModel.kt @@ -77,8 +77,8 @@ constructor( var patientTracingProfileUiState: MutableState = mutableStateOf( TracingProfileUiState( - overflowMenuFactory.retrieveOverflowMenuItems(OverflowMenuHost.TRACING_PROFILE) - ) + overflowMenuFactory.retrieveOverflowMenuItems(OverflowMenuHost.TRACING_PROFILE), + ), ) private val _patientProfileViewDataFlow = MutableStateFlow(ProfileViewData.TracingProfileData()) @@ -101,7 +101,8 @@ constructor( object : OnSyncListener { override fun onSync(state: SyncJobStatus) { when (state) { - is SyncJobStatus.Finished, is SyncJobStatus.Failed -> { + is SyncJobStatus.Finished, + is SyncJobStatus.Failed, -> { isSyncing.value = false fetchTracingData() } @@ -114,7 +115,7 @@ constructor( } } }, - viewModelScope + viewModelScope, ) fetchTracingData() @@ -125,8 +126,8 @@ constructor( registerRepository.loadPatientProfileData(appFeatureName, healthModule, patientId)?.let { patientProfileData = it _patientProfileViewDataFlow.value = - profileViewDataMapper.transformInputToOutputModel(it) as - ProfileViewData.TracingProfileData + profileViewDataMapper.transformInputToOutputModel(it) + as ProfileViewData.TracingProfileData } } } @@ -140,7 +141,7 @@ constructor( event.context, event.questionnaireId, clientIdentifier = patientId, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) is TracingProfileEvent.OverflowMenuClick -> { when (event.menuId) { @@ -149,12 +150,12 @@ constructor( event.context, questionnaireId = EDIT_PROFILE_FORM, clientIdentifier = patientId, - questionnaireType = QuestionnaireType.EDIT + questionnaireType = QuestionnaireType.EDIT, ) R.id.tracing_history -> { val urlParams = NavigationArg.bindArgumentsOf(Pair(NavigationArg.PATIENT_ID, patientId)) event.navController.navigate( - route = MainNavigationScreen.TracingHistory.route + urlParams + route = MainNavigationScreen.TracingHistory.route + urlParams, ) } else -> { @@ -168,7 +169,7 @@ constructor( questionnaireId = event.taskFormId, clientIdentifier = patientId, backReference = event.taskId.asReference(ResourceType.Task).reference, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) is TracingProfileEvent.LoadOutComesForm -> { profile.isHomeTracing?.let { isHomeTracing -> @@ -177,7 +178,7 @@ constructor( if (isHomeTracing) "home-tracing-outcome" else "phone-tracing-outcome", clientIdentifier = patientId, questionnaireType = QuestionnaireType.EDIT, - populationResources = profile.populationResources + populationResources = profile.populationResources, ) } } @@ -185,14 +186,14 @@ constructor( val urlParams = NavigationArg.bindArgumentsOf( Pair(NavigationArg.PATIENT_ID, patientId), - Pair(NavigationArg.TRACING_ID, event.historyId) + Pair(NavigationArg.TRACING_ID, event.historyId), ) event.navController.navigate(route = MainNavigationScreen.TracingOutcomes.route + urlParams) } is TracingProfileEvent.CallPhoneNumber -> { if (event.phoneNumber.isNotBlank()) { event.context.startActivity( - Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:${event.phoneNumber}") } + Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:${event.phoneNumber}") }, ) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingFilterOptions.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingFilterOptions.kt index 64f2d50647..8b0794822a 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingFilterOptions.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingFilterOptions.kt @@ -29,7 +29,8 @@ enum class PhonePatientAssignment : TracingPatientAssignment { ALL_PHONE, ASSIGNED_TO_ME { override fun assignedToMe(): Boolean = true - }; + }, + ; override fun assignedToMe(): Boolean = false @@ -41,7 +42,8 @@ enum class HomePatientAssignment : TracingPatientAssignment { ALL_HOME, ASSIGNED_TO_ME { override fun assignedToMe(): Boolean = true - }; + }, + ; override fun assignedToMe(): Boolean = false @@ -55,7 +57,8 @@ enum class TracingPatientCategory : TracingFilterOption { EXPOSED_INFANT, CHILD_CONTACT, PERSON_WHO_IS_REACTIVE_AT_THE_COMMUNITY, - SEXUAL_CONTACT; + SEXUAL_CONTACT, + ; override fun text(): String = super.toString().lowercase().split("_").joinToString(" ") { it.capitalizeFirstLetter() } @@ -80,7 +83,8 @@ enum class TracingReason : TracingFilterOption { DRY_BLOOD_SAMPLE_RESULT, DRY_BLOOD_SAMPLE_INVALID, MISSED_MILESTONE_VISIT, - MISSED_ROUTINE_VISIT; + MISSED_ROUTINE_VISIT, + ; override fun text(): String = super.toString().lowercase().split("_").joinToString(" ") { it.capitalizeFirstLetter() } @@ -88,15 +92,16 @@ enum class TracingReason : TracingFilterOption { enum class AgeFilter : TracingFilterOption { ALL_AGES, - `0_2_YEARS` { + YEARS_0_TO_2 { override fun text() = "0 -2 Years" }, - `0-18_YEARS` { + YEARS_0_TO_18 { override fun text() = "0 - 18 Years" }, - `18_PLUS_YEARS` { + YEARS_18_PLUS { override fun text() = "18+ Years" - }; + }, + ; override fun text(): String = super.toString().lowercase().split("_").joinToString(" ") { it.capitalizeFirstLetter() } @@ -104,5 +109,5 @@ enum class AgeFilter : TracingFilterOption { data class TracingRegisterUiFilter( val selected: T, - val options: Iterable + val options: Iterable, ) diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingRegisterScreen.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingRegisterScreen.kt index 4dd079b0eb..8bdd1887e9 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingRegisterScreen.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingRegisterScreen.kt @@ -58,7 +58,7 @@ fun TracingRegisterScreen( modifier: Modifier = Modifier, screenTitle: String, navController: NavHostController, - registerViewModel: TracingRegisterViewModel = hiltViewModel() + registerViewModel: TracingRegisterViewModel = hiltViewModel(), ) { var showFiltersDialog by remember { mutableStateOf(false) } val currentFilterState by registerViewModel.filtersStateFlow.collectAsStateWithLifecycle() @@ -68,7 +68,7 @@ fun TracingRegisterScreen( screenTitle = screenTitle, navController = navController, registerViewModel = registerViewModel, - filterNavClickAction = { showFiltersDialog = true } + filterNavClickAction = { showFiltersDialog = true }, ) if (showFiltersDialog) { @@ -78,7 +78,7 @@ fun TracingRegisterScreen( onApplyAction = { registerViewModel.onEvent(StandardRegisterEvent.ApplyFilter(it)) showFiltersDialog = false - } + }, ) } } @@ -87,13 +87,13 @@ fun TracingRegisterScreen( fun FilterTracingRegisterModal( filterState: TracingRegisterFilterState, onDismissAction: () -> Unit, - onApplyAction: (TracingRegisterFilterState) -> Unit + onApplyAction: (TracingRegisterFilterState) -> Unit, ) { var filtersState by remember { mutableStateOf(filterState) } Dialog( onDismissRequest = onDismissAction, - properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false) + properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false), ) { Card(modifier = Modifier.fillMaxWidth().wrapContentHeight()) { Column(modifier = Modifier.padding(8.dp)) { @@ -101,14 +101,14 @@ fun FilterTracingRegisterModal( text = stringResource(id = R.string.filters).uppercase(), textAlign = TextAlign.Start, style = MaterialTheme.typography.h5, - color = MaterialTheme.colors.primary + color = MaterialTheme.colors.primary, ) Spacer(modifier = Modifier.height(8.dp)) Column( horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(8.dp) + verticalArrangement = Arrangement.spacedBy(8.dp), ) { TracingRegisterExposedDropdown( filter = filtersState.patientAssignment, @@ -119,16 +119,16 @@ fun FilterTracingRegisterModal( patientCategory = TracingRegisterUiFilter( TracingPatientCategory.ALL_PATIENT_CATEGORIES, - TracingPatientCategory.values().asList() + TracingPatientCategory.values().asList(), ), reason = TracingRegisterUiFilter( TracingReason.ALL_REASONS, - TracingReason.values().asList() + TracingReason.values().asList(), ), - age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()) + age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()), ) - } + }, ) TracingRegisterExposedDropdown( @@ -140,11 +140,11 @@ fun FilterTracingRegisterModal( reason = TracingRegisterUiFilter( TracingReason.ALL_REASONS, - TracingReason.values().asList() + TracingReason.values().asList(), ), - age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()) + age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()), ) - } + }, ) TracingRegisterExposedDropdown( @@ -153,14 +153,14 @@ fun FilterTracingRegisterModal( filtersState = filtersState.copy( reason = it, - age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()) + age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()), ) - } + }, ) TracingRegisterExposedDropdown( filter = filtersState.age, - onItemSelected = { filtersState = filtersState.copy(age = it) } + onItemSelected = { filtersState = filtersState.copy(age = it) }, ) } @@ -170,14 +170,18 @@ fun FilterTracingRegisterModal( modifier = Modifier.wrapContentWidth(), colors = ButtonDefaults.textButtonColors( - contentColor = Color.DarkGray.copy(alpha = ContentAlpha.medium) - ) - ) { Text(text = stringResource(id = R.string.cancel).uppercase()) } + contentColor = Color.DarkGray.copy(alpha = ContentAlpha.medium), + ), + ) { + Text(text = stringResource(id = R.string.cancel).uppercase()) + } TextButton( onClick = { onApplyAction.invoke(filtersState) }, - modifier = Modifier.wrapContentWidth() - ) { Text(text = stringResource(id = R.string.apply).uppercase()) } + modifier = Modifier.wrapContentWidth(), + ) { + Text(text = stringResource(id = R.string.apply).uppercase()) + } } } } @@ -188,11 +192,11 @@ fun FilterTracingRegisterModal( @Composable fun TracingRegisterExposedDropdown( filter: TracingRegisterUiFilter, - onItemSelected: (TracingRegisterUiFilter) -> Unit + onItemSelected: (TracingRegisterUiFilter) -> Unit, ) { LocalExposedDropdownMenuBox( selectedItem = filter.selected, options = filter.options, - onItemSelected = { onItemSelected.invoke(filter.copy(selected = it)) } + onItemSelected = { onItemSelected.invoke(filter.copy(selected = it)) }, ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingRegisterViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingRegisterViewModel.kt index 558f836a5c..7c8c397329 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingRegisterViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/tracing/register/TracingRegisterViewModel.kt @@ -86,7 +86,7 @@ constructor( val configurationRegistry: ConfigurationRegistry, val registerViewDataMapper: RegisterViewDataMapper, val appFeatureManager: AppFeatureManager, - val sharedPreferencesHelper: SharedPreferencesHelper + val sharedPreferencesHelper: SharedPreferencesHelper, ) : ViewModel(), StandardRegisterViewModel { private val appFeatureName = savedStateHandle.get(NavigationArg.FEATURE) @@ -139,14 +139,14 @@ constructor( patientCategory = categories, isAssignedToMe = it.patientAssignment.selected.assignedToMe(), age = ageFilter, - reasonCode = reasonCode + reasonCode = reasonCode, ) } .onEach { resetPage() } viewModelScope.launch { combine(searchFlow, pageFlow, registerFilterFlow, refreshCounter) { s, p, f, _ -> - Triple(s, p, f) - } + Triple(s, p, f) + } .mapLatest { val pagingFlow = if (it.first.isNotBlank()) { @@ -161,8 +161,8 @@ constructor( } viewModelScope.launch { combine(searchFlow, pageFlow, registerFilterFlow, refreshCounter) { s, p, f, _ -> - Triple(s, p, f) - } + Triple(s, p, f) + } .filter { it.first.isBlank() } .mapLatest { registerRepository.countRegisterFiltered(appFeatureName, healthModule, filters = it.third) @@ -216,14 +216,14 @@ constructor( appFeatureName: String?, loadAll: Boolean = false, page: Int = 0, - registerFilters: TracingRegisterFilter + registerFilters: TracingRegisterFilter, ): Pager = Pager( config = PagingConfig( pageSize = DEFAULT_PAGE_SIZE, initialLoadSize = DEFAULT_INITIAL_LOAD_SIZE, - enablePlaceholders = false + enablePlaceholders = false, ), pagingSourceFactory = { RegisterPagingSource(registerRepository, registerViewDataMapper).apply { @@ -233,11 +233,11 @@ constructor( healthModule = healthModule, loadAll = loadAll, currentPage = if (loadAll) 0 else page, - filters = registerFilters - ) + filters = registerFilters, + ), ) } - } + }, ) override fun countPages() = @@ -260,13 +260,13 @@ constructor( NavigationArg.bindArgumentsOf( Pair(NavigationArg.FEATURE, AppFeature.PatientManagement.name), Pair(NavigationArg.HEALTH_MODULE, healthModule), - Pair(NavigationArg.PATIENT_ID, event.patientId) + Pair(NavigationArg.PATIENT_ID, event.patientId), ) - if (healthModule == HealthModule.FAMILY) + if (healthModule == HealthModule.FAMILY) { event.navController.navigate(route = MainNavigationScreen.FamilyProfile.route + urlParams) - else + } else event.navController.navigate( - route = MainNavigationScreen.TracingProfile.route + urlParams + route = MainNavigationScreen.TracingProfile.route + urlParams, ) } is StandardRegisterEvent.ApplyFilter<*> -> { @@ -295,7 +295,7 @@ data class TracingRegisterFilterState( val patientAssignment: TracingRegisterUiFilter, val patientCategory: TracingRegisterUiFilter, val reason: TracingRegisterUiFilter, - val age: TracingRegisterUiFilter + val age: TracingRegisterUiFilter, ) { companion object { fun default(healthModule: HealthModule) = @@ -305,32 +305,32 @@ data class TracingRegisterFilterState( patientAssignment = TracingRegisterUiFilter( PhonePatientAssignment.ALL_PHONE, - PhonePatientAssignment.values().asList() + PhonePatientAssignment.values().asList(), ), patientCategory = TracingRegisterUiFilter( TracingPatientCategory.ALL_PATIENT_CATEGORIES, - TracingPatientCategory.values().asList() + TracingPatientCategory.values().asList(), ), reason = TracingRegisterUiFilter(TracingReason.ALL_REASONS, TracingReason.values().asList()), - age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()) + age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()), ) HealthModule.HOME_TRACING -> TracingRegisterFilterState( patientAssignment = TracingRegisterUiFilter( HomePatientAssignment.ALL_HOME, - HomePatientAssignment.values().asList() + HomePatientAssignment.values().asList(), ), patientCategory = TracingRegisterUiFilter( TracingPatientCategory.ALL_PATIENT_CATEGORIES, - TracingPatientCategory.values().asList() + TracingPatientCategory.values().asList(), ), reason = TracingRegisterUiFilter(TracingReason.ALL_REASONS, TracingReason.values().asList()), - age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()) + age = TracingRegisterUiFilter(AgeFilter.ALL_AGES, AgeFilter.values().asList()), ) else -> throw IllegalArgumentException("Not allowed") } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/FhirPathUtil.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/FhirPathUtil.kt index 044da25487..26527ceb37 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/FhirPathUtil.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/FhirPathUtil.kt @@ -52,8 +52,9 @@ object FhirPathUtil { } } .also { - if (it == null) + if (it == null) { Timber.i("${resource.resourceType}, ${filter.key}: could not resolve key value filter") + } } } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/GeneralListViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/GeneralListViewModel.kt index 0422d9c9de..da71a0b3bc 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/GeneralListViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/GeneralListViewModel.kt @@ -76,9 +76,11 @@ abstract class GeneralListViewModel(syncBroadcaster: SyncBroadcaster) : } syncBroadcaster.registerSyncListener(syncStateListener, viewModelScope) } + private fun paginateRegisterDataForSearch() { paginateData.value = paginateRegisterDataFlow() } + abstract fun paginateRegisterDataFlow(page: Int = 0): Flow> fun refresh() { diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/PatientUtil.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/PatientUtil.kt index 6f14d6d682..866ab30359 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/PatientUtil.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/PatientUtil.kt @@ -38,13 +38,13 @@ import org.smartregister.fhircore.quest.data.patient.model.AdditionalData suspend fun loadAdditionalData( patientId: String, configurationRegistry: ConfigurationRegistry, - fhirEngine: FhirEngine + fhirEngine: FhirEngine, ): List { val result = mutableListOf() val patientRegisterRowViewConfiguration = configurationRegistry.retrieveConfiguration( - configClassification = QuestConfigClassification.PATIENT_REGISTER_ROW + configClassification = QuestConfigClassification.PATIENT_REGISTER_ROW, ) patientRegisterRowViewConfiguration.filters?.forEach { filter -> @@ -55,19 +55,21 @@ suspend fun loadAdditionalData( val sortedByDescending = conditions.maxByOrNull { it.recordedDate } val recordedDate = sortedByDescending?.recordedDate ?: "" sortedByDescending?.category?.forEach { cc -> - cc.coding.firstOrNull { c -> c.code == filter.valueCoding!!.code }?.let { - val status = sortedByDescending.code?.coding?.firstOrNull()?.display ?: "" - result.add( - AdditionalData( - label = filter.label, - value = status, - valuePrefix = filter.valuePrefix, - lastDateAdded = - DateUtils.simpleDateFormat(pattern = "dd-MMM-yyyy").format(recordedDate), - properties = propertiesMapping(status, filter) + cc.coding + .firstOrNull { c -> c.code == filter.valueCoding!!.code } + ?.let { + val status = sortedByDescending.code?.coding?.firstOrNull()?.display ?: "" + result.add( + AdditionalData( + label = filter.label, + value = status, + valuePrefix = filter.valuePrefix, + lastDateAdded = + DateUtils.simpleDateFormat(pattern = "dd-MMM-yyyy").format(recordedDate), + properties = propertiesMapping(status, filter), + ), ) - ) - } + } } } } @@ -79,7 +81,7 @@ suspend inline fun getSearchResults( reference: String, referenceParam: ReferenceClientParam, filter: Filter?, - fhirEngine: FhirEngine + fhirEngine: FhirEngine, ): List { return fhirEngine .search { @@ -90,7 +92,7 @@ suspend inline fun getSearchResults( Enumerations.DataType.CODEABLECONCEPT -> { filter( TokenClientParam(filter.key), - { value = of(CodeableConcept().addCoding(filter.valueCoding!!.asCoding())) } + { value = of(CodeableConcept().addCoding(filter.valueCoding!!.asCoding())) }, ) } else -> { @@ -111,11 +113,12 @@ fun propertiesMapping(value: String, filter: Filter): Properties { label = filter.properties?.label, value = Property( - color = filter.dynamicColors?.firstOrNull { it.valueEqual == value }?.useColor + color = + filter.dynamicColors?.firstOrNull { it.valueEqual == value }?.useColor ?: filter.properties?.value?.color, textSize = filter.properties?.value?.textSize, - fontWeight = filter.properties?.value?.fontWeight - ) + fontWeight = filter.properties?.value?.fontWeight, + ), ) } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/QuestConfigClassification.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/QuestConfigClassification.kt index 3fd5c0b84f..f15e773bb0 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/QuestConfigClassification.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/QuestConfigClassification.kt @@ -25,6 +25,8 @@ enum class QuestConfigClassification : ConfigClassification { PATIENT_DETAILS_VIEW, CONTROL_TEST_DETAILS_VIEW, RESULT_DETAILS_NAVIGATION, - PATIENT_TASK_REGISTER; + PATIENT_TASK_REGISTER, + ; + override val classification: String = name.lowercase() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/MeasureReportPatientViewDataMapper.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/MeasureReportPatientViewDataMapper.kt index 24e1906f7f..4073d0ee9f 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/MeasureReportPatientViewDataMapper.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/MeasureReportPatientViewDataMapper.kt @@ -30,7 +30,7 @@ class MeasureReportPatientViewDataMapper constructor(@ApplicationContext val context: Context) : DataMapper { override fun transformInputToOutputModel( - inputModel: RegisterData.AncRegisterData + inputModel: RegisterData.AncRegisterData, ): MeasureReportPatientViewData { return MeasureReportPatientViewData( logicalId = inputModel.logicalId, diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/ProfileViewDataMapper.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/ProfileViewDataMapper.kt index c1af9fbc22..991fcb8b29 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/ProfileViewDataMapper.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/ProfileViewDataMapper.kt @@ -62,7 +62,7 @@ class ProfileViewDataMapper @Inject constructor(@ApplicationContext val context: sex = inputModel.gender.translateGender(context), age = inputModel.age, dob = inputModel.birthdate.formatDob(), - identifier = inputModel.identifier + identifier = inputModel.identifier, ) is ProfileData.HivProfileData -> ProfileViewData.PatientProfileViewData( @@ -99,17 +99,19 @@ class ProfileViewDataMapper @Inject constructor(@ApplicationContext val context: // it.executionPeriod.start.makeItReadable()), profileViewSection = PatientProfileViewSection.TASKS, actionButtonIcon = - if (it.status == Task.TaskStatus.COMPLETED) Icons.Filled.Check - else Icons.Filled.Add, + if (it.status == Task.TaskStatus.COMPLETED) { + Icons.Filled.Check + } else Icons.Filled.Add, actionIconColor = - if (it.status == Task.TaskStatus.COMPLETED) SuccessColor - else it.status.retrieveColorCode(), + if (it.status == Task.TaskStatus.COMPLETED) { + SuccessColor + } else it.status.retrieveColorCode(), actionButtonColor = it.status.retrieveColorCode(), actionButtonText = it.description, - subtitleStatus = it.status.name + subtitleStatus = it.status.name, ) }, - practitioners = inputModel.practitioners + practitioners = inputModel.practitioners, ) is ProfileData.DefaultProfileData -> ProfileViewData.PatientProfileViewData( @@ -124,19 +126,23 @@ class ProfileViewDataMapper @Inject constructor(@ApplicationContext val context: PatientProfileRowItem( id = it.logicalId, actionFormId = - if (it.status == Task.TaskStatus.READY && it.hasReasonReference()) + if (it.status == Task.TaskStatus.READY && it.hasReasonReference()) { it.reasonReference.extractId() - else null, + } else { + null + }, title = it.description, subtitle = context.getString(R.string.due_on, it.executionPeriod.start.makeItReadable()), profileViewSection = PatientProfileViewSection.TASKS, actionButtonIcon = - if (it.status == Task.TaskStatus.COMPLETED) Icons.Filled.Check - else Icons.Filled.Add, + if (it.status == Task.TaskStatus.COMPLETED) { + Icons.Filled.Check + } else Icons.Filled.Add, actionIconColor = - if (it.status == Task.TaskStatus.COMPLETED) SuccessColor - else it.status.retrieveColorCode(), + if (it.status == Task.TaskStatus.COMPLETED) { + SuccessColor + } else it.status.retrieveColorCode(), actionButtonColor = it.status.retrieveColorCode(), actionButtonText = it.description, ) @@ -157,8 +163,7 @@ class ProfileViewDataMapper @Inject constructor(@ApplicationContext val context: gender = memberProfileData.gender.translateGender(context), name = memberProfileData.name, memberTasks = - memberProfileData - .tasks + memberProfileData.tasks .filter { it.status == Task.TaskStatus.READY } .take(DEFAULT_TASKS_COUNT) .map { @@ -168,13 +173,15 @@ class ProfileViewDataMapper @Inject constructor(@ApplicationContext val context: taskStatus = it.status, colorCode = it.status.retrieveColorCode(), taskFormId = - if (it.status == Task.TaskStatus.READY && it.hasReasonReference()) + if (it.status == Task.TaskStatus.READY && it.hasReasonReference()) { it.reasonReference.extractId() - else null + } else { + null + }, ) - } + }, ) - } + }, ) is ProfileData.TracingProfileData -> ProfileViewData.TracingProfileData( @@ -196,7 +203,7 @@ class ProfileViewDataMapper @Inject constructor(@ApplicationContext val context: guardians = inputModel.guardians, practitioners = inputModel.practitioners, conditions = inputModel.conditions, - tracingTasks = inputModel.tasks + tracingTasks = inputModel.tasks, ) } } @@ -213,8 +220,9 @@ class ProfileViewDataMapper @Inject constructor(@ApplicationContext val context: fun HealthStatus.retrieveDisplayIdentifierKey(): String = when (this) { HealthStatus.EXPOSED_INFANT -> "HCC Number" - HealthStatus.CHILD_CONTACT, HealthStatus.SEXUAL_CONTACT, HealthStatus.COMMUNITY_POSITIVE -> - "HTS Number" + HealthStatus.CHILD_CONTACT, + HealthStatus.SEXUAL_CONTACT, + HealthStatus.COMMUNITY_POSITIVE, -> "HTS Number" else -> "ART Number" } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/RegisterViewDataMapper.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/RegisterViewDataMapper.kt index 1882b28c93..d12684026e 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/RegisterViewDataMapper.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/RegisterViewDataMapper.kt @@ -46,7 +46,7 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context logicalId = inputModel.logicalId, title = listOf(inputModel.name, inputModel.age).joinToString(", "), subtitle = inputModel.gender.translateGender(context).capitalizeFirstLetter(), - registerType = RegisterData.DefaultRegisterData::class + registerType = RegisterData.DefaultRegisterData::class, ) is RegisterData.FamilyRegisterData -> { val serviceText = @@ -74,7 +74,7 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context it.age.toInt() <= 5 -> R.drawable.ic_kids else -> R.drawable.ic_users }, - logicalId = it.logicalId + logicalId = it.logicalId, ) }, serviceText = serviceText, @@ -82,7 +82,7 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context serviceButtonBorderColor = BlueTextColor, showDivider = true, showServiceButton = !serviceText.isNullOrEmpty(), - registerType = RegisterData.FamilyRegisterData::class + registerType = RegisterData.FamilyRegisterData::class, ) } is RegisterData.AncRegisterData -> @@ -97,7 +97,7 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context if (inputModel.servicesOverdue == 0) BlueTextColor else OverdueDarkRedColor, serviceText = context.getString(R.string.anc_visit), showServiceButton = inputModel.servicesOverdue != 0 || inputModel.servicesDue != 0, - registerType = RegisterData.AncRegisterData::class + registerType = RegisterData.AncRegisterData::class, ) is RegisterData.HivRegisterData -> RegisterViewData( @@ -105,11 +105,14 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context title = inputModel.name, subtitle = "${inputModel.age}, ${inputModel.healthStatus.display}", registerType = inputModel::class, - identifier = inputModel.identifier?.let { if (it.length > 6) it.substring(0..5) else it } - ?: "", + identifier = + inputModel.identifier?.let { if (it.length > 6) it.substring(0..5) else it } ?: "", serviceButtonBackgroundColor = - if (inputModel.gender == Enumerations.AdministrativeGender.MALE) MaleBlueColor - else FemalePinkColor, + if (inputModel.gender == Enumerations.AdministrativeGender.MALE) { + MaleBlueColor + } else { + FemalePinkColor + }, serviceTextIcon = when { inputModel.isBreastfeeding -> R.drawable.ic_person_breastfeeding_solid @@ -121,7 +124,7 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context inputModel.gender == Enumerations.AdministrativeGender.FEMALE -> R.drawable.baseline_woman_24 else -> null - } + }, ) is RegisterData.AppointmentRegisterData -> RegisterViewData( @@ -129,11 +132,14 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context title = inputModel.name, subtitle = "${inputModel.reasons.joinToString()}, ${inputModel.age}", registerType = RegisterData.AppointmentRegisterData::class, - identifier = inputModel.identifier?.let { if (it.length > 6) it.substring(0..5) else it } - ?: "", + identifier = + inputModel.identifier?.let { if (it.length > 6) it.substring(0..5) else it } ?: "", serviceButtonBackgroundColor = - if (inputModel.gender == Enumerations.AdministrativeGender.MALE) MaleBlueColor - else FemalePinkColor, + if (inputModel.gender == Enumerations.AdministrativeGender.MALE) { + MaleBlueColor + } else { + FemalePinkColor + }, serviceTextIcon = when { inputModel.isBreastfeeding -> R.drawable.ic_person_breastfeeding_solid @@ -145,7 +151,7 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context inputModel.gender == Enumerations.AdministrativeGender.FEMALE -> R.drawable.baseline_woman_24 else -> null - } + }, ) is RegisterData.TracingRegisterData -> RegisterViewData( @@ -154,11 +160,14 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context subtitle = "${inputModel.attempts} attempt${if (inputModel.attempts > 1) "s" else ""}, ${inputModel.reasons.joinToString(" + ")}", registerType = inputModel::class, - identifier = inputModel.identifier?.let { if (it.length > 6) it.substring(0..5) else it } - ?: "", + identifier = + inputModel.identifier?.let { if (it.length > 6) it.substring(0..5) else it } ?: "", serviceButtonBackgroundColor = - if (inputModel.gender == Enumerations.AdministrativeGender.MALE) MaleBlueColor - else FemalePinkColor, + if (inputModel.gender == Enumerations.AdministrativeGender.MALE) { + MaleBlueColor + } else { + FemalePinkColor + }, serviceTextIcon = when { inputModel.isBreastfeeding -> R.drawable.ic_person_breastfeeding_solid @@ -170,7 +179,7 @@ class RegisterViewDataMapper @Inject constructor(@ApplicationContext val context inputModel.gender == Enumerations.AdministrativeGender.FEMALE -> R.drawable.baseline_woman_24 else -> null - } + }, ) else -> throw UnsupportedOperationException() } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/TracingFilterMappers.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/TracingFilterMappers.kt index 69e72509d9..77b7625948 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/TracingFilterMappers.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/util/mappers/TracingFilterMappers.kt @@ -26,9 +26,9 @@ import org.smartregister.fhircore.quest.ui.tracing.register.TracingRegisterFilte fun transformToTracingAgeFilterEnum(it: TracingRegisterFilterState) = when (it.age.selected) { AgeFilter.ALL_AGES -> null - AgeFilter.`0_2_YEARS` -> TracingAgeFilterEnum.ZERO_TO_2 - AgeFilter.`0-18_YEARS` -> TracingAgeFilterEnum.ZERO_TO_18 - AgeFilter.`18_PLUS_YEARS` -> TracingAgeFilterEnum.`18_PLUS` + AgeFilter.YEARS_0_TO_2 -> TracingAgeFilterEnum.ZERO_TO_2 + AgeFilter.YEARS_0_TO_18 -> TracingAgeFilterEnum.ZERO_TO_18 + AgeFilter.YEARS_18_PLUS -> TracingAgeFilterEnum.PLUS_18 } fun transformPatientCategoryToHealthStatus(patientCategory: TracingPatientCategory) = diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/CqlContentTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/CqlContentTest.kt index c3c956188b..1bf296ad71 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/CqlContentTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/CqlContentTest.kt @@ -68,17 +68,16 @@ class CqlContentTest : RobolectricTest() { val cqlElm = toJsonElm(cql).readStringToBase64Encoded() val cqlLibrary = parser.parseResource( - "$resourceDir/library.json".readFile().replace("#library-elm.json", cqlElm) - ) as - Library + "$resourceDir/library.json".readFile().replace("#library-elm.json", cqlElm), + ) as Library println(cqlLibrary.convertToString(false) as String) val fhirHelpersLibrary = "cql-common/helper.json".parseSampleResourceFromFile() as Library val patient = - "patient-registration-questionnaire/sample/patient.json".parseSampleResourceFromFile() as - Patient + "patient-registration-questionnaire/sample/patient.json".parseSampleResourceFromFile() + as Patient val dataBundle = Bundle().apply { // output of test results extraction is input of this cql @@ -88,9 +87,10 @@ class CqlContentTest : RobolectricTest() { .forEach { addEntry().apply { resource = it } } // output of test results cql is also added to input of this cql - "cql/test-results/sample".readDir().map { it.parseSampleResource() as Resource }.forEach { - addEntry().apply { resource = it } - } + "cql/test-results/sample" + .readDir() + .map { it.parseSampleResource() as Resource } + .forEach { addEntry().apply { resource = it } } } val fhirEngine = mockk() @@ -111,14 +111,14 @@ class CqlContentTest : RobolectricTest() { this.entry.removeIf { it.resource.resourceType == ResourceType.Patient } }, defaultRepository, - true + true, ) } assertOutput( "$resourceDir/output_medication_request.json", result, - ResourceType.MedicationRequest + ResourceType.MedicationRequest, ) coVerify { defaultRepository.save(any()) } @@ -132,17 +132,16 @@ class CqlContentTest : RobolectricTest() { val cqlElm = toJsonElm(cql).readStringToBase64Encoded() val cqlLibrary = parser.parseResource( - "$resourceDir/library.json".readFile().replace("#library-elm.json", cqlElm) - ) as - Library + "$resourceDir/library.json".readFile().replace("#library-elm.json", cqlElm), + ) as Library println(cqlLibrary.convertToString(false) as String) val fhirHelpersLibrary = "cql-common/helper.json".parseSampleResourceFromFile() as Library val patient = - "patient-registration-questionnaire/sample/patient.json".parseSampleResourceFromFile() as - Patient + "patient-registration-questionnaire/sample/patient.json".parseSampleResourceFromFile() + as Patient val dataBundle = Bundle().apply { // output of test results extraction is input of this cql @@ -170,7 +169,7 @@ class CqlContentTest : RobolectricTest() { this.entry.removeIf { it.resource.resourceType == ResourceType.Patient } }, defaultRepository, - true + true, ) } @@ -178,12 +177,12 @@ class CqlContentTest : RobolectricTest() { assertOutput( "$resourceDir/sample/output_service_request.json", result, - ResourceType.ServiceRequest + ResourceType.ServiceRequest, ) assertOutput( "$resourceDir/sample/output_diagnostic_report.json", result, - ResourceType.DiagnosticReport + ResourceType.DiagnosticReport, ) coVerify(exactly = 3) { defaultRepository.save(any()) } @@ -197,9 +196,8 @@ class CqlContentTest : RobolectricTest() { val cqlElm = toJsonElm(cql).readStringToBase64Encoded() val cqlLibrary = parser.parseResource( - "$resourceDir/library.json".readFile().replace("#library-elm.json", cqlElm) - ) as - Library + "$resourceDir/library.json".readFile().replace("#library-elm.json", cqlElm), + ) as Library println(cqlLibrary.convertToString(false) as String) @@ -210,8 +208,8 @@ class CqlContentTest : RobolectricTest() { addEntry().apply { // questionnaire-response of test results is input of this cql resource = - "test-results-questionnaire/questionnaire-response.json".parseSampleResourceFromFile() as - Resource + "test-results-questionnaire/questionnaire-response.json".parseSampleResourceFromFile() + as Resource } } @@ -236,8 +234,8 @@ class CqlContentTest : RobolectricTest() { result.contains( "OUTPUT -> \nDetails:\n" + "Value (3.0) is in Normal G6PD Range 0-3\n" + - "Value (11.0) is in Normal Haemoglobin Range 8-12" - ) + "Value (11.0) is in Normal Haemoglobin Range 8-12", + ), ) val observationSlot = slot() @@ -245,11 +243,11 @@ class CqlContentTest : RobolectricTest() { Assert.assertEquals( "QuestionnaireResponse/TEST_QUESTIONNAIRE_RESPONSE", - observationSlot.captured.focusFirstRep.reference + observationSlot.captured.focusFirstRep.reference, ) Assert.assertEquals( "Correct Result", - observationSlot.captured.valueCodeableConcept.codingFirstRep.display + observationSlot.captured.valueCodeableConcept.codingFirstRep.display, ) Assert.assertEquals("Device Operation", observationSlot.captured.code.codingFirstRep.display) } @@ -269,7 +267,8 @@ class CqlContentTest : RobolectricTest() { val expectedResource = resource.parseSampleResourceFromFile().convertToString(true) val cqlResultStr = - cqlResult.find { it.startsWith("OUTPUT") && it.contains("\"resourceType\":\"$type\"") }!! + cqlResult + .find { it.startsWith("OUTPUT") && it.contains("\"resourceType\":\"$type\"") }!! .replaceTimePart() println(cqlResultStr) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/QuestConfigServiceTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/QuestConfigServiceTest.kt index 0d54c6c451..78ee9db495 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/QuestConfigServiceTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/QuestConfigServiceTest.kt @@ -48,7 +48,6 @@ class QuestConfigServiceTest : RobolectricTest() { @Test fun testProvideAuthConfigurationShouldReturnConfigs() { - val authConfiguration = configService.provideAuthConfiguration() Assert.assertNotNull(authConfiguration) @@ -58,7 +57,7 @@ class QuestConfigServiceTest : RobolectricTest() { Assert.assertEquals(BuildConfig.OAUTH_CLIENT_SECRET, authConfiguration.clientSecret) Assert.assertEquals( InstrumentationRegistry.getInstrumentation().targetContext.packageName, - authConfiguration.accountType + authConfiguration.accountType, ) } } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/RegisterContentTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/RegisterContentTest.kt index fb633db90c..9b94eb3fba 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/RegisterContentTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/RegisterContentTest.kt @@ -52,8 +52,8 @@ class RegisterContentTest : RobolectricTest() { val tType = targetResource.entry[1].resource as Observation val sampleTType = - "test-results-questionnaire/sample/obs_res_type.json".parseSampleResourceFromFile() as - Observation + "test-results-questionnaire/sample/obs_res_type.json".parseSampleResourceFromFile() + as Observation assertResourceContent(tType, sampleTType) @@ -74,8 +74,9 @@ class RegisterContentTest : RobolectricTest() { // replace properties generating dynamically actual.setPropertySafely("id", expected.idElement) - if (expected.resourceType == ResourceType.Observation) + if (expected.resourceType == ResourceType.Observation) { actual.setPropertySafely("encounter", expected.getNamedProperty("encounter").values[0]) + } val expectedStr = expected.convertToString(true) val actualStr = actual.convertToString(true) @@ -98,15 +99,15 @@ class RegisterContentTest : RobolectricTest() { val patient = targetResource.entry[0].resource as Patient val samplePatient = - "patient-registration-questionnaire/sample/patient.json".parseSampleResourceFromFile() as - Patient + "patient-registration-questionnaire/sample/patient.json".parseSampleResourceFromFile() + as Patient assertResourceContent(patient, samplePatient) val condition = targetResource.entry[1].resource as Condition val sampleCondition = - "patient-registration-questionnaire/sample/condition.json".parseSampleResourceFromFile() as - Condition + "patient-registration-questionnaire/sample/condition.json".parseSampleResourceFromFile() + as Condition // replace subject as registration forms generate uuid on the fly sampleCondition.subject = condition.subject @@ -128,7 +129,7 @@ class RegisterContentTest : RobolectricTest() { val result = ResourceMapper.populate(questionnaire, patient) Assert.assertEquals( "p-category", - result.item.first().itemFirstRep.answerFirstRep.valueCoding.code + result.item.first().itemFirstRep.answerFirstRep.valueCoding.code, ) } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/FakeKeystore.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/FakeKeyStore.kt similarity index 97% rename from android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/FakeKeystore.kt rename to android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/FakeKeyStore.kt index 6ca45dc7c7..ac9ba09257 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/FakeKeystore.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/FakeKeyStore.kt @@ -41,7 +41,7 @@ object FakeKeyStore { put("KeyGenerator.AES", FakeAesKeyGenerator::class.java.name) put("KeyStore.AndroidKeyStore", FakeKeyStore::class.java.name) } - } + }, ) } @@ -49,36 +49,50 @@ object FakeKeyStore { private val wrapped = KeyStore.getInstance(KeyStore.getDefaultType()) override fun engineIsKeyEntry(alias: String?): Boolean = wrapped.isKeyEntry(alias) + override fun engineIsCertificateEntry(alias: String?): Boolean = wrapped.isCertificateEntry(alias) + override fun engineGetCertificate(alias: String?): Certificate = wrapped.getCertificate(alias) + override fun engineGetCreationDate(alias: String?): Date = wrapped.getCreationDate(alias) + override fun engineDeleteEntry(alias: String?) = wrapped.deleteEntry(alias) + override fun engineSetKeyEntry( alias: String?, key: Key?, password: CharArray?, - chain: Array? + chain: Array?, ) = wrapped.setKeyEntry(alias, key, password, chain) override fun engineSetKeyEntry( alias: String?, key: ByteArray?, - chain: Array? + chain: Array?, ) = wrapped.setKeyEntry(alias, key, chain) + override fun engineStore(stream: OutputStream?, password: CharArray?) = wrapped.store(stream, password) + override fun engineSize(): Int = wrapped.size() + override fun engineAliases(): Enumeration = wrapped.aliases() + override fun engineContainsAlias(alias: String?): Boolean = wrapped.containsAlias(alias) + override fun engineLoad(stream: InputStream?, password: CharArray?) = wrapped.load(stream, password) + override fun engineGetCertificateChain(alias: String?): Array = wrapped.getCertificateChain(alias) + override fun engineSetCertificateEntry(alias: String?, cert: Certificate?) = wrapped.setCertificateEntry(alias, cert) + override fun engineGetCertificateAlias(cert: Certificate?): String = wrapped.getCertificateAlias(cert) + override fun engineGetKey(alias: String?, password: CharArray?): Key? = wrapped.getKey(alias, password) } @@ -87,8 +101,11 @@ object FakeKeyStore { private val wrapped = KeyGenerator.getInstance("AES") override fun engineInit(random: SecureRandom?) = Unit + override fun engineInit(params: AlgorithmParameterSpec?, random: SecureRandom?) = Unit + override fun engineInit(keysize: Int, random: SecureRandom?) = Unit + override fun engineGenerateKey(): SecretKey = wrapped.generateKey() } } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/Faker.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/Faker.kt index 8859f2a821..0dcada69a9 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/Faker.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/app/fakes/Faker.kt @@ -51,12 +51,13 @@ import org.smartregister.fhircore.quest.robolectric.RobolectricTest.Companion.re object Faker { private const val APP_DEBUG = "quest" + fun buildPatient( id: String = "sampleId", family: String = "Mandela", given: String = "Nelson", age: Int = 78, - gender: Enumerations.AdministrativeGender = Enumerations.AdministrativeGender.MALE + gender: Enumerations.AdministrativeGender = Enumerations.AdministrativeGender.MALE, ): Patient { return Patient().apply { this.id = id @@ -76,7 +77,6 @@ object Faker { } fun initPatientRepositoryMocks(patientRepository: PatientRepository) { - coEvery { patientRepository.fetchDemographicsWithAdditionalData(any()) } answers { PatientItem(id = firstArg(), name = "John Doe", gender = "M", age = "22y") @@ -89,7 +89,7 @@ object Faker { HumanName().apply { family = "Doe" given = listOf(StringType("John")) - } + }, ) id = "5583145" gender = Enumerations.AdministrativeGender.MALE @@ -99,7 +99,7 @@ object Faker { Address().apply { city = "Nairobi" country = "Kenya" - } + }, ) identifier = listOf(Identifier().apply { value = "12345" }) } @@ -109,13 +109,13 @@ object Faker { QuestionnaireConfig( form = "sample-order-result", title = "Sample Order Result", - identifier = "12345" + identifier = "12345", ), QuestionnaireConfig( form = "sample-test-result", title = "Sample Test Result", - identifier = "67890" - ) + identifier = "67890", + ), ) coEvery { patientRepository.fetchTestResults(any(), any(), any(), any()) } returns @@ -123,34 +123,33 @@ object Faker { QuestResultItem( Pair( QuestionnaireResponseItem("1", Date(), "1", ""), - QuestionnaireItem("1", "Sample Order", "Sample Order") + QuestionnaireItem("1", "Sample Order", "Sample Order"), ), listOf( listOf( AdditionalData(value = "Sample Order", label = "Label"), - AdditionalData(value = "(${Date().asDdMmmYyyy()})") - ) - ) + AdditionalData(value = "(${Date().asDdMmmYyyy()})"), + ), + ), ), QuestResultItem( Pair( QuestionnaireResponseItem("1", Date(), "1", ""), - QuestionnaireItem("1", "ample Test", "ample Test") + QuestionnaireItem("1", "ample Test", "ample Test"), ), listOf( listOf( AdditionalData(value = "Sample Test"), - AdditionalData(value = "(${Date().asDdMmmYyyy()})") - ) - ) - ) + AdditionalData(value = "(${Date().asDdMmmYyyy()})"), + ), + ), + ), ) coEvery { patientRepository.fetchPregnancyCondition(any()) } returns "" } fun initPatientRepositoryEmptyMocks(patientRepository: PatientRepository) { - coEvery { patientRepository.fetchDemographics(any()) } returns Patient() coEvery { patientRepository.fetchTestForms(any()) } returns emptyList() coEvery { patientRepository.fetchTestResults(any(), any(), any(), any()) } returns emptyList() @@ -169,11 +168,11 @@ object Faker { fun loadTestConfigurationRegistryData( appId: String, fhirEngine: FhirEngine, - configurationRegistry: ConfigurationRegistry + configurationRegistry: ConfigurationRegistry, ) { val composition = - getBasePath(appId, "composition").readFile(systemPath).decodeResourceFromString() as - Composition + getBasePath(appId, "composition").readFile(systemPath).decodeResourceFromString() + as Composition coEvery { fhirEngine.search(any()) } returns listOf(SearchResult(composition, included = null, revIncluded = null)) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/configuration/view/DetailViewConfigurationTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/configuration/view/DetailViewConfigurationTest.kt index 2e87b79ac2..16a7b19dfa 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/configuration/view/DetailViewConfigurationTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/configuration/view/DetailViewConfigurationTest.kt @@ -24,7 +24,6 @@ class DetailViewConfigurationTest { @Test fun testDetailViewConfiguration() { - val filters = listOf( Filter( @@ -33,8 +32,8 @@ class DetailViewConfigurationTest { displayableProperty = "label", valuePrefix = "re", valuePostfix = "end", - valueType = Enumerations.DataType.ADDRESS - ) + valueType = Enumerations.DataType.ADDRESS, + ), ) val detailViewConfiguration = @@ -42,7 +41,7 @@ class DetailViewConfigurationTest { appId = "quest", classification = "registration", label = "patient registration", - rows = listOf(DetailViewRowConfiguration(filters)) + rows = listOf(DetailViewRowConfiguration(filters)), ) Assert.assertEquals("quest", detailViewConfiguration.appId) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/configuration/view/ResultDetailsNavigationConfigurationTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/configuration/view/ResultDetailsNavigationConfigurationTest.kt index 61515114c4..04fe4c0e6d 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/configuration/view/ResultDetailsNavigationConfigurationTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/configuration/view/ResultDetailsNavigationConfigurationTest.kt @@ -34,9 +34,9 @@ class ResultDetailsNavigationConfigurationTest { id = "homeNav", title = "homeTitle", icon = "arrow", - action = TestDetailsNavigationAction(form = "reg-form", readOnly = true) - ) - ) + action = TestDetailsNavigationAction(form = "reg-form", readOnly = true), + ), + ), ) Assert.assertEquals("quest", resultDetailsNavigationConfiguration.appId) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/coroutine/CoroutineTestRule.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/coroutine/CoroutineTestRule.kt index 9b4b7a829e..59e827a199 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/coroutine/CoroutineTestRule.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/coroutine/CoroutineTestRule.kt @@ -34,8 +34,11 @@ class CoroutineTestRule(val testDispatcher: TestCoroutineDispatcher = TestCorout val testDispatcherProvider = object : DispatcherProvider { override fun default() = testDispatcher + override fun io() = testDispatcher + override fun main() = testDispatcher + override fun unconfined() = testDispatcher } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/data/PatientRepositoryTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/data/PatientRepositoryTest.kt index b837a1b0aa..3d564b20bd 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/data/PatientRepositoryTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/data/PatientRepositoryTest.kt @@ -100,7 +100,7 @@ class PatientRepositoryTest : RobolectricTest() { fhirEngine, patientItemMapper, coroutineTestRule.testDispatcherProvider, - configurationRegistry + configurationRegistry, ) } @@ -110,7 +110,7 @@ class PatientRepositoryTest : RobolectricTest() { key = "abc", filterType = Enumerations.SearchParamType.STRING, valueString = "cde", - valueType = Enumerations.DataType.CODEABLECONCEPT + valueType = Enumerations.DataType.CODEABLECONCEPT, ) @Test @@ -149,8 +149,8 @@ class PatientRepositoryTest : RobolectricTest() { SearchResult( buildPatient("1234", "Doe", "John", 1, Enumerations.AdministrativeGender.FEMALE), included = null, - revIncluded = null - ) + revIncluded = null, + ), ) coEvery { fhirEngine.count(any()) } returns 1 @@ -199,7 +199,7 @@ class PatientRepositoryTest : RobolectricTest() { questionnaire = "Questionnaire/1" }, included = null, - revIncluded = null + revIncluded = null, ), SearchResult( QuestionnaireResponse().apply { @@ -207,8 +207,8 @@ class PatientRepositoryTest : RobolectricTest() { questionnaire = "Questionnaire/2" }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) val results = @@ -216,7 +216,7 @@ class PatientRepositoryTest : RobolectricTest() { "1", ResourceType.Patient, listOf(QuestionnaireConfig("quest", "form", "title", "1")), - dataDetailsListViewConfigurationOf() + dataDetailsListViewConfigurationOf(), ) Assert.assertEquals("First Questionnaire", results[0].data[0][0].value) @@ -238,7 +238,7 @@ class PatientRepositoryTest : RobolectricTest() { val questionnaire = repository.getQuestionnaire( - QuestionnaireResponse().apply { questionnaire = "Questionnaire/1" } + QuestionnaireResponse().apply { questionnaire = "Questionnaire/1" }, ) Assert.assertEquals("1", questionnaire.id) @@ -286,8 +286,8 @@ class PatientRepositoryTest : RobolectricTest() { title = "G6PD Test" }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) val results = repository.fetchTestForms(searchFilter()) @@ -303,7 +303,7 @@ class PatientRepositoryTest : RobolectricTest() { coroutineTestRule.runBlockingTest { coEvery { fhirEngine.search(any()) } returns listOf( - SearchResult(Questionnaire().apply { id = "1234" }, included = null, revIncluded = null) + SearchResult(Questionnaire().apply { id = "1234" }, included = null, revIncluded = null), ) val results = repository.fetchTestForms(searchFilter()) @@ -325,8 +325,8 @@ class PatientRepositoryTest : RobolectricTest() { name = "Form name" }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) val results = repository.fetchTestForms(searchFilter()) @@ -347,8 +347,8 @@ class PatientRepositoryTest : RobolectricTest() { title = "Form name" }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) val results = repository.fetchTestForms(searchFilter()) @@ -386,14 +386,14 @@ class PatientRepositoryTest : RobolectricTest() { appId = quest.appId, classification = quest.classification, contentTitle = quest.contentTitle, - dynamicRows = quest.dynamicRows + dynamicRows = quest.dynamicRows, ) val data = runBlocking { repository.getResultItem( questionnaire, questionnaireResponse, - patientDetailsViewConfiguration + patientDetailsViewConfiguration, ) } with(data.data[0]) { @@ -424,7 +424,7 @@ class PatientRepositoryTest : RobolectricTest() { { value = of(CodeableConcept().addCoding(Coding("http://snomed.info/sct", "9024005", null))) - } + }, ) } } returns getConditions() @@ -437,7 +437,7 @@ class PatientRepositoryTest : RobolectricTest() { { value = of(CodeableConcept().addCoding(Coding("http://snomed.info/sct", "259695003", null))) - } + }, ) } } returns getObservations() @@ -467,14 +467,14 @@ class PatientRepositoryTest : RobolectricTest() { classification = g6pd.classification, contentTitle = g6pd.contentTitle, valuePrefix = g6pd.valuePrefix, - dynamicRows = g6pd.dynamicRows + dynamicRows = g6pd.dynamicRows, ) val data = runBlocking { repository.getResultItem( questionnaire, questionnaireResponse, - patientDetailsViewConfiguration + patientDetailsViewConfiguration, ) } @@ -497,6 +497,7 @@ class PatientRepositoryTest : RobolectricTest() { Assert.assertEquals(FontWeight.NORMAL, this[1].properties?.label?.fontWeight) } } + private fun getEncounter() = Encounter().apply { id = "1" } private fun getObservations(): List> { @@ -513,7 +514,7 @@ class PatientRepositoryTest : RobolectricTest() { } }, included = null, - revIncluded = null + revIncluded = null, ), SearchResult( Observation().apply { @@ -527,8 +528,8 @@ class PatientRepositoryTest : RobolectricTest() { } }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) } @@ -545,7 +546,7 @@ class PatientRepositoryTest : RobolectricTest() { system = "http://snomed.info/sct" code = "9024005" } - } + }, ) code = CodeableConcept().apply { @@ -557,8 +558,8 @@ class PatientRepositoryTest : RobolectricTest() { } }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) } @@ -570,7 +571,7 @@ class PatientRepositoryTest : RobolectricTest() { val result = repository.getCondition( Encounter().apply { id = "123" }, - filterOf("code", "Code", Properties()) + filterOf("code", "Code", Properties()), ) coVerify { fhirEngine.search(any()) } @@ -586,7 +587,7 @@ class PatientRepositoryTest : RobolectricTest() { val result = repository.getObservation( Encounter().apply { id = "123" }, - filterOf("code", "Code", Properties()) + filterOf("code", "Code", Properties()), ) coVerify { fhirEngine.search(any()) } @@ -598,13 +599,13 @@ class PatientRepositoryTest : RobolectricTest() { fun testGetMedicationRequestShouldReturnValidMedicationRequest() = runBlockingTest { coEvery { fhirEngine.search(any()) } returns listOf( - SearchResult(MedicationRequest().apply { id = "mr1" }, included = null, revIncluded = null) + SearchResult(MedicationRequest().apply { id = "mr1" }, included = null, revIncluded = null), ) val result = repository.getMedicationRequest( Encounter().apply { id = "123" }, - filterOf("code", "Code", Properties()) + filterOf("code", "Code", Properties()), ) coVerify { fhirEngine.search(any()) } @@ -623,7 +624,7 @@ class PatientRepositoryTest : RobolectricTest() { url = "http://hl7.org/fhir/StructureDefinition/translation" addExtension("lang", StringType("sw")) addExtension("content", StringType("Sajili")) - } + }, ) } @@ -634,7 +635,7 @@ class PatientRepositoryTest : RobolectricTest() { url = "http://hl7.org/fhir/StructureDefinition/translation" addExtension("lang", StringType("sw")) addExtension("content", StringType("Sajili2")) - } + }, ) } } @@ -657,7 +658,7 @@ class PatientRepositoryTest : RobolectricTest() { url = "http://hl7.org/fhir/StructureDefinition/translation" addExtension("lang", StringType("sw")) addExtension("content", StringType("Sajili")) - } + }, ) } } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/data/PatientTaskRepositoryTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/data/PatientTaskRepositoryTest.kt index 3ee34186f0..946b3826d5 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/data/PatientTaskRepositoryTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/data/PatientTaskRepositoryTest.kt @@ -64,7 +64,7 @@ class PatientTaskRepositoryTest : RobolectricTest() { context = ApplicationProvider.getApplicationContext(), fhirEngine = fhirEngine, dataMapper = patientTaskItemMapper, - dispatcherProvider = dispatcherProvider + dispatcherProvider = dispatcherProvider, ) } @@ -84,8 +84,8 @@ class PatientTaskRepositoryTest : RobolectricTest() { `for` = Reference("Patient/2") }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) val patient = diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/data/task/model/PatientTaskItemTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/data/task/model/PatientTaskItemTest.kt index 9fff5cb18a..269bedb1f0 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/data/task/model/PatientTaskItemTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/data/task/model/PatientTaskItemTest.kt @@ -39,7 +39,7 @@ class PatientTaskItemTest : RobolectricTest() { birthdate = "2020-03-10".getDate("yyyy-MM-dd"), address = "Nairobi", description = "Sick Visit", - overdue = true + overdue = true, ) } @@ -47,7 +47,7 @@ class PatientTaskItemTest : RobolectricTest() { fun testDemographicsShouldReturnFlatDemographic() { Assert.assertEquals( "${patientTaskItem.name}, ${patientTaskItem.gender}, ${patientTaskItem.birthdate.toAgeDisplay()}", - patientTaskItem.demographics() + patientTaskItem.demographics(), ) } } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/navigation/OverflowMenuFactoryTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/navigation/OverflowMenuFactoryTest.kt index 6785a7e7ee..29590400a6 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/navigation/OverflowMenuFactoryTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/navigation/OverflowMenuFactoryTest.kt @@ -94,7 +94,7 @@ class OverflowMenuFactoryTest : RobolectricTest() { val uiProfileBiologicalParentContact = overflowMenuFactory.retrieveOverflowMenuItems( - OverflowMenuHost.BIOLOGICAL_PARENT_CONTACT_PROFILE + OverflowMenuHost.BIOLOGICAL_PARENT_CONTACT_PROFILE, ) Assert.assertNotNull(uiProfileBiologicalParentContact) Assert.assertEquals(5, uiProfileBiologicalParentContact.size) @@ -103,7 +103,8 @@ class OverflowMenuFactoryTest : RobolectricTest() { @Test fun `client_visit menu items should be hidden for new diagnosed and art clients`() { val newlyDiagnosedClientVisitMenuItem = - overflowMenuFactory.retrieveOverflowMenuItems(OverflowMenuHost.NEWLY_DIAGNOSED_PROFILE) + overflowMenuFactory + .retrieveOverflowMenuItems(OverflowMenuHost.NEWLY_DIAGNOSED_PROFILE) .first { it.id == R.id.client_visit } val artClientClientVisitMenuItem = overflowMenuFactory.retrieveOverflowMenuItems(OverflowMenuHost.ART_CLIENT_PROFILE).first { @@ -121,7 +122,7 @@ class OverflowMenuFactoryTest : RobolectricTest() { .first() Assert.assertEquals( OverflowMenuItem(R.id.client_visit, R.string.client_visit).apply { hidden = true }, - firstMenuItem + firstMenuItem, ) } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/robolectric/FhircoreTestRunner.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/robolectric/FhircoreTestRunner.kt index 26fa3b5012..dc21e51abb 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/robolectric/FhircoreTestRunner.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/robolectric/FhircoreTestRunner.kt @@ -23,6 +23,7 @@ import org.robolectric.util.inject.Injector internal class FhircoreTestRunner : RobolectricTestRunner { constructor(testClass: Class<*>?) : super(testClass) {} + constructor(testClass: Class<*>?, injector: Injector?) : super(testClass, injector) {} override fun createClassLoaderConfig(method: FrameworkMethod): InstrumentationConfiguration { diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/robolectric/RobolectricTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/robolectric/RobolectricTest.kt index a5649b5b2b..a0fac4868f 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/robolectric/RobolectricTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/robolectric/RobolectricTest.kt @@ -103,8 +103,11 @@ abstract class RobolectricTest { fun IBaseResource.convertToString(trimTime: Boolean) = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser().encodeResourceToString(this).let { // replace time part 11:11:11+05:00 with xx:xx:xx+xx:xx - if (trimTime) it.replace(Regex("\\d{2}:\\d{2}:\\d{2}.\\d{2}:\\d{2}"), "xx:xx:xx+xx:xx") - else it + if (trimTime) { + it.replace(Regex("\\d{2}:\\d{2}:\\d{2}.\\d{2}:\\d{2}"), "xx:xx:xx+xx:xx") + } else { + it + } } fun String.replaceTimePart() = @@ -133,7 +136,7 @@ abstract class RobolectricTest { scu: StructureMapUtilities, structureMapJson: String, responseJson: String, - sourceGroup: String + sourceGroup: String, ): Bundle { val map = scu.parse(structureMapJson, sourceGroup) @@ -145,9 +148,9 @@ abstract class RobolectricTest { val source = iParser.parseResource(QuestionnaireResponse::class.java, responseJson) - kotlin.runCatching { scu.transform(scu.worker(), source, map, targetResource) }.onFailure { - println(it.stackTraceToString()) - } + kotlin + .runCatching { scu.transform(scu.worker(), source, map, targetResource) } + .onFailure { println(it.stackTraceToString()) } println(iParser.encodeResourceToString(targetResource)) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailScreenTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailScreenTest.kt index 9a4392cf36..34b8fee69b 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailScreenTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailScreenTest.kt @@ -74,6 +74,7 @@ class ListDataDetailScreenTest : RobolectricTest() { @get:Rule(order = 1) val composeRule = createComposeRule() @Inject lateinit var patientItemMapper: PatientItemMapper + @BindValue var configurationRegistry: ConfigurationRegistry = Faker.buildTestConfigurationRegistry("g6pd") val application = ApplicationProvider.getApplicationContext() @@ -101,8 +102,8 @@ class ListDataDetailScreenTest : RobolectricTest() { defaultRepository = defaultRepository, patientItemMapper = patientItemMapper, mockk(), - fhirEngine - ) + fhirEngine, + ), ) patientDetailsViewConfig = @@ -221,13 +222,17 @@ class ListDataDetailScreenTest : RobolectricTest() { composeRule.onAllNodesWithTag(RESULT_ITEM).assertCountEquals(2) composeRule.onAllNodesWithTag(RESULT_ITEM, true)[0].assert(hasAnyChild(hasText("Label"))) composeRule.onAllNodesWithTag(RESULT_ITEM, true)[0].assert(hasAnyChild(hasText("Sample Order"))) - composeRule.onAllNodesWithTag(RESULT_ITEM, true)[0].assert( - hasAnyChild(hasText("(${Date().asDdMmmYyyy()})")) - ) + composeRule + .onAllNodesWithTag(RESULT_ITEM, true)[0] + .assert( + hasAnyChild(hasText("(${Date().asDdMmmYyyy()})")), + ) composeRule.onAllNodesWithTag(RESULT_ITEM, true)[1].assert(hasAnyChild(hasText("Sample Test"))) - composeRule.onAllNodesWithTag(RESULT_ITEM, true)[1].assert( - hasAnyChild(hasText("(${Date().asDdMmmYyyy()})")) - ) + composeRule + .onAllNodesWithTag(RESULT_ITEM, true)[1] + .assert( + hasAnyChild(hasText("(${Date().asDdMmmYyyy()})")), + ) } @Test @@ -272,8 +277,8 @@ class ListDataDetailScreenTest : RobolectricTest() { defaultRepository = defaultRepository, patientItemMapper = patientItemMapper, mockk(), - fhirEngine - ) + fhirEngine, + ), ) if (shouldLoadAdditionalData) { @@ -284,7 +289,7 @@ class ListDataDetailScreenTest : RobolectricTest() { name = "John Doe", gender = "M", age = "22y", - additionalData = listOf(AdditionalData(label = "G6PD", value = "Normal")) + additionalData = listOf(AdditionalData(label = "G6PD", value = "Normal")), ) } } @@ -297,7 +302,7 @@ class ListDataDetailScreenTest : RobolectricTest() { patientId, ResourceType.Patient, patientDetailsViewConfig.questionnaireFilter!!, - patientDetailsViewConfig + patientDetailsViewConfig, ) getAllForms(patientDetailsViewConfig.questionnaireFilter!!) } @@ -315,8 +320,8 @@ class ListDataDetailScreenTest : RobolectricTest() { defaultRepository = defaultRepository, patientItemMapper = patientItemMapper, mockk(), - fhirEngine - ) + fhirEngine, + ), ) composeRule.setContent { QuestPatientDetailScreen(questPatientDetailViewModel) } } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailViewModelTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailViewModelTest.kt index a9c5a9ce97..6f5eff4f80 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailViewModelTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/ListDataDetailViewModelTest.kt @@ -51,7 +51,9 @@ class ListDataDetailViewModelTest : RobolectricTest() { @Inject lateinit var patientItemMapper: PatientItemMapper @BindValue val patientRepository: PatientRepository = mockk() + @BindValue val defaultRepository: DefaultRepository = mockk() + @BindValue val libraryEvaluator: LibraryEvaluator = spyk() private val patientId = "5583145" @@ -70,7 +72,7 @@ class ListDataDetailViewModelTest : RobolectricTest() { defaultRepository = defaultRepository, patientItemMapper = patientItemMapper, libraryEvaluatorProvider = { libraryEvaluator }, - fhirEngine = fhirEngine + fhirEngine = fhirEngine, ) } @@ -78,7 +80,7 @@ class ListDataDetailViewModelTest : RobolectricTest() { fun testGetDemographicsShouldFetchPatient() { listDataDetailViewModel.getDemographicsWithAdditionalData( patientId, - mockk { every { valuePrefix } returns "" } + mockk { every { valuePrefix } returns "" }, ) val patient = listDataDetailViewModel.patientItem.value Assert.assertNotNull(patient) @@ -121,11 +123,11 @@ class ListDataDetailViewModelTest : RobolectricTest() { Assert.assertEquals(2, listDataDetailViewModel.questionnaireConfigs.value!!.size) Assert.assertEquals( "12345", - listDataDetailViewModel.questionnaireConfigs.value!!.first().identifier + listDataDetailViewModel.questionnaireConfigs.value!!.first().identifier, ) Assert.assertEquals( "67890", - listDataDetailViewModel.questionnaireConfigs.value!!.last().identifier + listDataDetailViewModel.questionnaireConfigs.value!!.last().identifier, ) } @@ -138,8 +140,8 @@ class ListDataDetailViewModelTest : RobolectricTest() { Questionnaire().apply { name = "Sample name" title = "Sample title" - } - ) + }, + ), ) Assert.assertEquals("Sample name", result) @@ -156,8 +158,8 @@ class ListDataDetailViewModelTest : RobolectricTest() { Questionnaire().apply { name = null title = "Sample title" - } - ) + }, + ), ) Assert.assertEquals("Sample title", result) @@ -175,8 +177,8 @@ class ListDataDetailViewModelTest : RobolectricTest() { id = "1234" name = null title = null - } - ) + }, + ), ) Assert.assertEquals("1234", result) @@ -193,7 +195,7 @@ class ListDataDetailViewModelTest : RobolectricTest() { url = "http://hl7.org/fhir/StructureDefinition/translation" addExtension("lang", StringType("sw")) addExtension("content", StringType("Sajili")) - } + }, ) } @@ -204,7 +206,7 @@ class ListDataDetailViewModelTest : RobolectricTest() { url = "http://hl7.org/fhir/StructureDefinition/translation" addExtension("lang", StringType("sw")) addExtension("content", StringType("Sajili2")) - } + }, ) } } @@ -212,13 +214,13 @@ class ListDataDetailViewModelTest : RobolectricTest() { Locale.setDefault(Locale.forLanguageTag("en")) Assert.assertEquals( "Registration", - listDataDetailViewModel.fetchResultItemLabel(Pair(QuestionnaireResponse(), questionnaire)) + listDataDetailViewModel.fetchResultItemLabel(Pair(QuestionnaireResponse(), questionnaire)), ) Locale.setDefault(Locale.forLanguageTag("sw")) Assert.assertEquals( "Sajili", - listDataDetailViewModel.fetchResultItemLabel(Pair(QuestionnaireResponse(), questionnaire)) + listDataDetailViewModel.fetchResultItemLabel(Pair(QuestionnaireResponse(), questionnaire)), ) } @@ -233,7 +235,7 @@ class ListDataDetailViewModelTest : RobolectricTest() { url = "http://hl7.org/fhir/StructureDefinition/translation" addExtension("lang", StringType("sw")) addExtension("content", StringType("Sajili")) - } + }, ) } } @@ -241,13 +243,13 @@ class ListDataDetailViewModelTest : RobolectricTest() { Locale.setDefault(Locale.forLanguageTag("en")) Assert.assertEquals( "Registration", - listDataDetailViewModel.fetchResultItemLabel(Pair(QuestionnaireResponse(), questionnaire)) + listDataDetailViewModel.fetchResultItemLabel(Pair(QuestionnaireResponse(), questionnaire)), ) Locale.setDefault(Locale.forLanguageTag("sw")) Assert.assertEquals( "Sajili", - listDataDetailViewModel.fetchResultItemLabel(Pair(QuestionnaireResponse(), questionnaire)) + listDataDetailViewModel.fetchResultItemLabel(Pair(QuestionnaireResponse(), questionnaire)), ) } } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/QuestPatientDetailActivityTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/QuestPatientDetailActivityTest.kt index 2077bd53e8..e12ed0389f 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/QuestPatientDetailActivityTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/QuestPatientDetailActivityTest.kt @@ -73,13 +73,18 @@ class QuestPatientDetailActivityTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) @BindValue val patientRepository: PatientRepository = mockk() + @BindValue val libraryEvaluator: LibraryEvaluator = mockk() + @BindValue val sharedPreferencesHelper: SharedPreferencesHelper = mockk() + @BindValue val secureSharedPreference: SecureSharedPreference = mockk() val defaultRepository: DefaultRepository = mockk() + @BindValue var configurationRegistry: ConfigurationRegistry = Faker.buildTestConfigurationRegistry("g6pd") + @Inject lateinit var patientItemMapper: PatientItemMapper lateinit var questPatientDetailViewModel: ListDataDetailViewModel @@ -107,8 +112,8 @@ class QuestPatientDetailActivityTest : RobolectricTest() { defaultRepository = defaultRepository, patientItemMapper = patientItemMapper, mockk(), - fhirEngine - ) + fhirEngine, + ), ) val intent = @@ -142,7 +147,7 @@ class QuestPatientDetailActivityTest : RobolectricTest() { @Test fun testOnFormItemClickListenerShouldStartQuestionnaireActivity() { questPatientDetailActivity.patientViewModel.onFormItemClickListener( - QuestionnaireConfig(form = "test-form", title = "Title", identifier = "1234") + QuestionnaireConfig(form = "test-form", title = "Title", identifier = "1234"), ) val expectedIntent = Intent(questPatientDetailActivity, QuestionnaireActivity::class.java) @@ -170,12 +175,12 @@ class QuestPatientDetailActivityTest : RobolectricTest() { this.authored = Date() this.contained = listOf(Encounter().apply { this.id = "12345" }) } - .encodeResourceToString() + .encodeResourceToString(), ), - QuestionnaireItem("12345", "name", "title") + QuestionnaireItem("12345", "name", "title"), ), - listOf(listOf(AdditionalData("", "", "", "", "", null))) - ) + listOf(listOf(AdditionalData("", "", "", "", "", null))), + ), ) val expectedIntent = Intent(questPatientDetailActivity, QuestionnaireActivity::class.java) @@ -185,7 +190,7 @@ class QuestPatientDetailActivityTest : RobolectricTest() { Assert.assertEquals("12345", actualIntent.getStringExtra(QUESTIONNAIRE_ARG_FORM)) Assert.assertEquals( QuestionnaireType.READ_ONLY.name, - actualIntent.getStringExtra(QUESTIONNAIRE_ARG_TYPE) + actualIntent.getStringExtra(QUESTIONNAIRE_ARG_TYPE), ) } @@ -202,13 +207,13 @@ class QuestPatientDetailActivityTest : RobolectricTest() { id = "open_questionnaire", title = "Questionnaire", icon = "", - TestDetailsNavigationAction(form = "", readOnly = true) - ) + TestDetailsNavigationAction(form = "", readOnly = true), + ), ) ResultDetailsNavigationConfiguration( appId = "quest", classification = "result_details_navigation", - navigationOptions + navigationOptions, ) ReflectionHelpers.callInstanceMethod( @@ -219,11 +224,11 @@ class QuestPatientDetailActivityTest : RobolectricTest() { QuestResultItem( Pair( QuestionnaireResponseItem("", Date(), "12345", ""), - QuestionnaireItem("", "name", "title") + QuestionnaireItem("", "name", "title"), ), - listOf() - ) - ) + listOf(), + ), + ), ) val dialog = shadowOf(ShadowAlertDialog.getLatestAlertDialog()) @@ -239,13 +244,13 @@ class QuestPatientDetailActivityTest : RobolectricTest() { id = "open_test_details", title = "Test Details", icon = "", - TestDetailsNavigationAction(form = "", readOnly = true) - ) + TestDetailsNavigationAction(form = "", readOnly = true), + ), ) ResultDetailsNavigationConfiguration( appId = "g6pd", classification = "result_details_navigation", - navigationOptions + navigationOptions, ) ReflectionHelpers.callInstanceMethod( @@ -256,11 +261,11 @@ class QuestPatientDetailActivityTest : RobolectricTest() { QuestResultItem( Pair( QuestionnaireResponseItem("12345", Date(), "12345", ""), - QuestionnaireItem("1", "name", "title") + QuestionnaireItem("1", "name", "title"), ), - listOf() - ) - ) + listOf(), + ), + ), ) val expectedIntent = Intent(questPatientDetailActivity, SimpleDetailsActivity::class.java) @@ -277,19 +282,19 @@ class QuestPatientDetailActivityTest : RobolectricTest() { id = "open_test_details", title = "Test Details", icon = "", - TestDetailsNavigationAction(form = "", readOnly = true) - ) + TestDetailsNavigationAction(form = "", readOnly = true), + ), ) ResultDetailsNavigationConfiguration( appId = "g6pd", classification = "result_details_navigation", - navigationOptions + navigationOptions, ) ReflectionHelpers.callInstanceMethod( questPatientDetailActivity, "handlePatientResources", - ReflectionHelpers.ClassParameter(ArrayList::class.java, arrayListOf("Condition")) + ReflectionHelpers.ClassParameter(ArrayList::class.java, arrayListOf("Condition")), ) Assert.assertEquals("Condition", questPatientDetailActivity.patientResourcesList[0]) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/QuestionnaireDataDetailDetailActivityTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/QuestionnaireDataDetailDetailActivityTest.kt index 90b2c12005..06fa1f03c0 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/QuestionnaireDataDetailDetailActivityTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/QuestionnaireDataDetailDetailActivityTest.kt @@ -51,7 +51,9 @@ class QuestionnaireDataDetailDetailActivityTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) @BindValue val patientRepository: PatientRepository = mockk() + @BindValue val libraryEvaluator: LibraryEvaluator = mockk() + @BindValue val sharedPreferencesHelper: SharedPreferencesHelper = mockk(relaxed = true) @BindValue @@ -79,7 +81,7 @@ class QuestionnaireDataDetailDetailActivityTest : RobolectricTest() { Intent().apply { this.putExtra( QuestionnaireDataDetailActivity.CLASSIFICATION_ARG, - "CONTROL_TEST_DETAILS_VIEW" + "CONTROL_TEST_DETAILS_VIEW", ) } questDetailActivityController = @@ -102,7 +104,7 @@ class QuestionnaireDataDetailDetailActivityTest : RobolectricTest() { @Test fun testOnFormItemClickListenerShouldStartQuestionnaireActivity() { questDetailActivity.viewModel.onFormItemClickListener( - QuestionnaireConfig(form = "test-form", title = "Title", identifier = "1234") + QuestionnaireConfig(form = "test-form", title = "Title", identifier = "1234"), ) val expectedIntent = Intent(questDetailActivity, QuestionnaireActivity::class.java) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsActivityTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsActivityTest.kt index b7e9fb7942..19ff56244c 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsActivityTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsActivityTest.kt @@ -107,9 +107,9 @@ class SimpleDetailsActivityTest : RobolectricTest() { val baseElement = iParser.parseResource(QuestionnaireResponse::class.java, g6pdResponse) - kotlin.runCatching { scu.transform(contextR4, baseElement, map, targetResource) }.onFailure { - Timber.d(it.stackTraceToString()) - } + kotlin + .runCatching { scu.transform(contextR4, baseElement, map, targetResource) } + .onFailure { Timber.d(it.stackTraceToString()) } println(iParser.encodeResourceToString(targetResource)) } @@ -141,9 +141,9 @@ class SimpleDetailsActivityTest : RobolectricTest() { val baseElement = iParser.parseResource(QuestionnaireResponse::class.java, g6pdResponse) - kotlin.runCatching { scu.transform(contextR4, baseElement, map, targetResource) }.onFailure { - Timber.d(it.stackTraceToString()) - } + kotlin + .runCatching { scu.transform(contextR4, baseElement, map, targetResource) } + .onFailure { Timber.d(it.stackTraceToString()) } Timber.d(iParser.encodeResourceToString(targetResource)) } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsScreenTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsScreenTest.kt index 0cf9ab1faf..08618892eb 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsScreenTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsScreenTest.kt @@ -54,6 +54,7 @@ import org.smartregister.fhircore.quest.ui.patient.register.PatientItemMapper class SimpleDetailsScreenTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) + @get:Rule(order = 30) val composeRule = createComposeRule() @Inject lateinit var patientItemMapper: PatientItemMapper @@ -74,7 +75,7 @@ class SimpleDetailsScreenTest : RobolectricTest() { mockk(), mockk(), mockk(), - mockk() + mockk(), ) viewModel = spyk(SimpleDetailsViewModel(patientRepository = patientRepository)) @@ -92,7 +93,7 @@ class SimpleDetailsScreenTest : RobolectricTest() { .onNodeWithTag(DETAILS_TOOLBAR_TITLE) .assertTextEquals( ApplicationProvider.getApplicationContext() - .getString(R.string.test_results) + .getString(R.string.test_results), ) composeRule.onNodeWithTag(DETAILS_TOOLBAR_BACK_ARROW).assertHasClickAction() } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsViewModelTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsViewModelTest.kt index 47624d3d3a..ee02eb0127 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsViewModelTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/details/SimpleDetailsViewModelTest.kt @@ -94,7 +94,7 @@ class SimpleDetailsViewModelTest : RobolectricTest() { listOf( MedicationRequest().apply { this.intent = MedicationRequest.MedicationRequestIntent.FILLERORDER - } + }, ) coEvery { viewModel.getPatient(any()) } returns Patient() @@ -102,7 +102,7 @@ class SimpleDetailsViewModelTest : RobolectricTest() { Encounter().apply { id = "123" subject = Reference().apply { reference = "Encounter/123" } - } + }, ) coVerify { patientRepository.getCondition(any(), any()) } @@ -118,7 +118,7 @@ class SimpleDetailsViewModelTest : RobolectricTest() { key = "code", valueType = Enumerations.DataType.CODEABLECONCEPT, valueCoding = Code("http://a.b.com", "c1"), - valuePrefix = null + valuePrefix = null, ) val obs = diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientMapperTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientMapperTest.kt index 7a73acf817..66d513c3d7 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientMapperTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientMapperTest.kt @@ -90,7 +90,7 @@ class PatientMapperTest : RobolectricTest() { family: String, given: String, age: Int, - telephones: List + telephones: List, ): Patient { return Patient().apply { this.id = id diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterActivityTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterActivityTest.kt index 3ce9a32788..7da5c61726 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterActivityTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterActivityTest.kt @@ -62,6 +62,7 @@ class PatientRegisterActivityTest : ActivityRobolectricTest() { var configurationRegistry: ConfigurationRegistry = Faker.buildTestConfigurationRegistry("quest") @BindValue val sharedPreferencesHelper: SharedPreferencesHelper = mockk() + @BindValue val secureSharedPreference: SecureSharedPreference = mockk() private lateinit var patientRegisterActivity: PatientRegisterActivity @@ -97,20 +98,20 @@ class PatientRegisterActivityTest : ActivityRobolectricTest() { @Test fun testOnClientMenuOptionSelectedShouldLaunchPatientRegisterFragment() { patientRegisterActivity.onNavigationOptionItemSelected( - RoboMenuItem().apply { itemId = R.id.menu_item_clients } + RoboMenuItem().apply { itemId = R.id.menu_item_clients }, ) // switched to patient register fragment Assert.assertEquals( "Clients", - patientRegisterActivity.findViewById(R.id.register_filter_textview).text + patientRegisterActivity.findViewById(R.id.register_filter_textview).text, ) Assert.assertEquals( View.GONE, - patientRegisterActivity.findViewById(R.id.filter_register_button).visibility + patientRegisterActivity.findViewById(R.id.filter_register_button).visibility, ) Assert.assertEquals( View.VISIBLE, - patientRegisterActivity.findViewById(R.id.edit_text_search).visibility + patientRegisterActivity.findViewById(R.id.edit_text_search).visibility, ) } @@ -118,26 +119,25 @@ class PatientRegisterActivityTest : ActivityRobolectricTest() { fun testOnBottomNavigationOptionItemSelectedShouldLaunchUserProfileFragment() { patientRegisterActivity.onBottomNavigationOptionItemSelected( RoboMenuItem().apply { itemId = "menu_item_settings".hashCode() }, - patientRegisterActivity.registerViewModel.registerViewConfiguration.value!! + patientRegisterActivity.registerViewModel.registerViewConfiguration.value!!, ) // switched to user profile fragment Assert.assertEquals( "Settings", - patientRegisterActivity.findViewById(R.id.register_filter_textview).text + patientRegisterActivity.findViewById(R.id.register_filter_textview).text, ) Assert.assertEquals( View.GONE, - patientRegisterActivity.findViewById(R.id.middle_toolbar_section).visibility + patientRegisterActivity.findViewById(R.id.middle_toolbar_section).visibility, ) Assert.assertEquals( View.GONE, - patientRegisterActivity.findViewById(R.id.filter_register_button).visibility + patientRegisterActivity.findViewById(R.id.filter_register_button).visibility, ) } @Test fun testOnBottomNavigationOptionItemSelectedShouldLaunchQuestionnaireDataDetailActivity() { - val config = patientRegisterActivity.registerViewModel.registerViewConfiguration.value!! config.bottomNavigationOptions?.plus( @@ -146,13 +146,13 @@ class PatientRegisterActivityTest : ActivityRobolectricTest() { title = "Control Test", icon = "ic_reports", action = - QuestionnaireDataDetailsNavigationAction(classification = "control_test_details_view") - ) + QuestionnaireDataDetailsNavigationAction(classification = "control_test_details_view"), + ), ) patientRegisterActivity.onBottomNavigationOptionItemSelected( RoboMenuItem().apply { itemId = "control_test".hashCode() }, - config + config, ) val expectedIntent = @@ -168,7 +168,7 @@ class PatientRegisterActivityTest : ActivityRobolectricTest() { val activityBinding = ReflectionHelpers.getField( patientRegisterActivity, - "registerActivityBinding" + "registerActivityBinding", ) with(activityBinding) { @@ -206,7 +206,7 @@ class PatientRegisterActivityTest : ActivityRobolectricTest() { val list = ReflectionHelpers.callInstanceMethod>( patientRegisterActivity, - "registersList" + "registersList", ) Assert.assertEquals(1, list.size) with(list[0]) { diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterFragmentTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterFragmentTest.kt index 003c4daefe..141a185563 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterFragmentTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterFragmentTest.kt @@ -74,7 +74,7 @@ class PatientRegisterFragmentTest : RobolectricTest() { composeRule.setContent { registerFragment.ConstructRegisterList( pagingItems = dummyPatientPagingList(), - modifier = Modifier + modifier = Modifier, ) } @@ -87,45 +87,45 @@ class PatientRegisterFragmentTest : RobolectricTest() { registerFragment.performFilter( RegisterFilterType.SEARCH_FILTER, PatientItem(name = "Samia"), - "" - ) + "", + ), ) Assert.assertTrue( registerFragment.performFilter( RegisterFilterType.SEARCH_FILTER, PatientItem(identifier = "12345"), - "12345" - ) + "12345", + ), ) Assert.assertTrue( registerFragment.performFilter( RegisterFilterType.SEARCH_FILTER, PatientItem(name = "Razi"), - "Razi" - ) + "Razi", + ), ) Assert.assertTrue( registerFragment.performFilter( RegisterFilterType.SEARCH_FILTER, PatientItem(id = "1234"), - "1234" - ) + "1234", + ), ) } @Test fun testPerformFilterShouldReturnTrueForEmptyFilter() { Assert.assertTrue( - registerFragment.performFilter(RegisterFilterType.SEARCH_FILTER, PatientItem(), "") + registerFragment.performFilter(RegisterFilterType.SEARCH_FILTER, PatientItem(), ""), ) } @Test fun testPerformFilterShouldReturnFalseForUnhandledFilterType() { Assert.assertFalse( - registerFragment.performFilter(RegisterFilterType.OVERDUE_FILTER, PatientItem(), "222") + registerFragment.performFilter(RegisterFilterType.OVERDUE_FILTER, PatientItem(), "222"), ) } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterListTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterListTest.kt index 91e0f2a37d..f1da40188e 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterListTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/PatientRegisterListTest.kt @@ -53,12 +53,14 @@ class PatientRegisterListTest : RobolectricTest() { composeRule.onAllNodesWithTag(PATIENT_BIO).assertCountEquals(2) - composeRule.onAllNodesWithTag(PATIENT_BIO, true)[0] + composeRule + .onAllNodesWithTag(PATIENT_BIO, true)[0] .assertHasClickAction() .assert(hasAnyChild(hasText("John Doe, 27y"))) .assert(hasAnyChild(hasText("Male"))) - composeRule.onAllNodesWithTag(PATIENT_BIO, true)[1] + composeRule + .onAllNodesWithTag(PATIENT_BIO, true)[1] .assertHasClickAction() .assert(hasAnyChild(hasText("Jane Doe, 20y"))) .assert(hasAnyChild(hasText("Female"))) @@ -83,7 +85,7 @@ class PatientRegisterListTest : RobolectricTest() { Assert.assertEquals(OpenPatientProfile, i) clickedItemList.add(p) - } + }, ) } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientRowTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientRowTest.kt index 57c97f73db..488afff697 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientRowTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/patient/register/components/PatientRowTest.kt @@ -35,6 +35,7 @@ import org.smartregister.fhircore.quest.robolectric.RobolectricTest class PatientRowTest : RobolectricTest() { @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) + @get:Rule(order = 1) val composeRule = createComposeRule() @Before @@ -54,9 +55,9 @@ class PatientRowTest : RobolectricTest() { label = "G6PD", value = "Deficient", valuePrefix = " G6PD Status - ", - lastDateAdded = "04-Feb-2022" - ) - ) + lastDateAdded = "04-Feb-2022", + ), + ), ) composeRule.setContent { PatientRow(patientItem = patientItem, { _, _ -> }) } } @@ -72,7 +73,7 @@ class PatientRowTest : RobolectricTest() { .onNodeWithText( " " + ApplicationProvider.getApplicationContext() - .getString(R.string.last_test, "04-Feb-2022") + .getString(R.string.last_test, "04-Feb-2022"), ) .assertExists() .assertIsDisplayed() diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/PatientTaskFragmentTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/PatientTaskFragmentTest.kt index 838109d2b9..105181bdef 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/PatientTaskFragmentTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/PatientTaskFragmentTest.kt @@ -85,11 +85,11 @@ class PatientTaskFragmentTest : RobolectricTest() { RegisterViewConfiguration( appId = "quest", classification = "classification", - useLabel = true + useLabel = true, ) patientTaskFragment.ConstructRegisterList( pagingItems = dummyPatientTaskPagingList(), - modifier = Modifier + modifier = Modifier, ) } @@ -102,8 +102,8 @@ class PatientTaskFragmentTest : RobolectricTest() { patientTaskFragment.performFilter( RegisterFilterType.SEARCH_FILTER, PatientTaskItem(name = "Samia"), - "" - ) + "", + ), ) } @@ -114,7 +114,7 @@ class PatientTaskFragmentTest : RobolectricTest() { assertNotNull(registerDataViewModel) Assert.assertEquals( PatientTaskRepository::class.simpleName, - registerDataViewModel.registerRepository::class.simpleName + registerDataViewModel.registerRepository::class.simpleName, ) } } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/PatientTaskItemMapperTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/PatientTaskItemMapperTest.kt index 06baf4d39b..22e91b286e 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/PatientTaskItemMapperTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/PatientTaskItemMapperTest.kt @@ -53,7 +53,7 @@ class PatientTaskItemMapperTest : RobolectricTest() { start = "2020-03-10".getDate("yyyy-MM-dd") end = "2020-03-12".getDate("yyyy-MM-dd") } - } + }, ) val patientTaskItem = mapper.transformInputToOutputModel(patientTask) diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/components/PatientTaskListItemTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/components/PatientTaskListItemTest.kt index b9f3373e8b..072d84f5c9 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/components/PatientTaskListItemTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/task/components/PatientTaskListItemTest.kt @@ -40,7 +40,7 @@ class PatientTaskListItemTest : RobolectricTest() { // Imitate row click action by doing nothing return { _: PatientTaskListenerIntent, _: PatientTaskItem -> } } - } + }, ) @Test @@ -53,14 +53,14 @@ class PatientTaskListItemTest : RobolectricTest() { birthdate = "2020-03-10".getDate("yyyy-MM-dd"), address = "Nairobi", description = "Sick Visit", - overdue = true + overdue = true, ) composeRule.setContent { PatientTaskRow( patientItem = patientTaskItem, useLabel = true, clickListener = listenerObjectSpy.onRowClick(), - modifier = Modifier + modifier = Modifier, ) } @@ -90,14 +90,14 @@ class PatientTaskListItemTest : RobolectricTest() { birthdate = "2020-03-10".getDate("yyyy-MM-dd"), address = "Nairobi", description = "Sick Visit", - overdue = false + overdue = false, ) composeRule.setContent { PatientTaskRow( patientItem = patientTaskItem, useLabel = true, clickListener = listenerObjectSpy.onRowClick(), - modifier = Modifier + modifier = Modifier, ) } @@ -125,14 +125,14 @@ class PatientTaskListItemTest : RobolectricTest() { birthdate = "2020-03-10".getDate("yyyy-MM-dd"), address = "Nairobi", description = "Sick Visit", - overdue = true + overdue = true, ) composeRule.setContent { PatientTaskRow( patientItem = patientTaskItem, useLabel = false, clickListener = listenerObjectSpy.onRowClick(), - modifier = Modifier + modifier = Modifier, ) } @@ -166,12 +166,12 @@ class PatientTaskListItemTest : RobolectricTest() { birthdate = "2020-03-10".getDate("yyyy-MM-dd"), address = "Nairobi", description = "Sick Visit", - overdue = false + overdue = false, ), useLabel = false, displaySelectContentOnly = true, clickListener = listenerObjectSpy.onRowClick(), - modifier = Modifier + modifier = Modifier, ) } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/util/PatientUtilTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/util/PatientUtilTest.kt index e8e7cdfc27..bbb078518f 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/util/PatientUtilTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/util/PatientUtilTest.kt @@ -52,6 +52,7 @@ class PatientUtilTest : RobolectricTest() { @BindValue var configurationRegistry: ConfigurationRegistry = Faker.buildTestConfigurationRegistry("g6pd") + @Inject lateinit var fhirEngine: FhirEngine @get:Rule(order = 0) val hiltRule = HiltAndroidRule(this) @@ -97,14 +98,13 @@ class PatientUtilTest : RobolectricTest() { @Test fun testPropertiesMapping() { - var filter = Filter( resourceType = Enumerations.ResourceType.CONDITION, key = "code", valueType = Enumerations.DataType.CODEABLECONCEPT, valueCoding = Code(), - dynamicColors = listOf(DynamicColor("Normal", "#00FF00")) + dynamicColors = listOf(DynamicColor("Normal", "#00FF00")), ) var properties = runBlocking { propertiesMapping("Normal", filter) } @@ -119,7 +119,7 @@ class PatientUtilTest : RobolectricTest() { key = "code", valueType = Enumerations.DataType.CODEABLECONCEPT, valueCoding = Code(), - properties = Properties(label = Property(), value = Property(color = "#000000", 20)) + properties = Properties(label = Property(), value = Property(color = "#000000", 20)), ) properties = runBlocking { propertiesMapping("Deficient", filter) } @@ -141,7 +141,7 @@ class PatientUtilTest : RobolectricTest() { system = "http://snomed.info/sct" code = "9024005" } - } + }, ) code = CodeableConcept().apply { @@ -153,8 +153,8 @@ class PatientUtilTest : RobolectricTest() { } }, included = null, - revIncluded = null - ) + revIncluded = null, + ), ) } } diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/util/mappers/ProfileViewDataMapperTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/util/mappers/ProfileViewDataMapperTest.kt index 2fe9baaf72..4aa136ec38 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/util/mappers/ProfileViewDataMapperTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/util/mappers/ProfileViewDataMapperTest.kt @@ -66,8 +66,8 @@ class ProfileViewDataMapperTest : RobolectricTest() { fun testMapToDomainModelHiv() { val dto = buildProfileData(HealthModule.HIV) val profileViewDataHiv = - profileViewDataMapper.transformInputToOutputModel(dto) as - ProfileViewData.PatientProfileViewData + profileViewDataMapper.transformInputToOutputModel(dto) + as ProfileViewData.PatientProfileViewData with(profileViewDataHiv) { Assert.assertEquals("logicalId", logicalId) Assert.assertEquals("testName", name) @@ -87,8 +87,8 @@ class ProfileViewDataMapperTest : RobolectricTest() { fun testMapToDomainModelHomeTracing() { val dto = buildProfileData(HealthModule.HOME_TRACING) val profileViewDataHiv = - profileViewDataMapper.transformInputToOutputModel(dto) as - ProfileViewData.PatientProfileViewData + profileViewDataMapper.transformInputToOutputModel(dto) + as ProfileViewData.PatientProfileViewData with(profileViewDataHiv) { Assert.assertEquals("logicalId", logicalId) Assert.assertEquals("testName", name) @@ -103,8 +103,8 @@ class ProfileViewDataMapperTest : RobolectricTest() { fun testMapToDomainModelAnc() { val dto = buildProfileData(HealthModule.ANC) val profileViewDataHiv = - profileViewDataMapper.transformInputToOutputModel(dto) as - ProfileViewData.PatientProfileViewData + profileViewDataMapper.transformInputToOutputModel(dto) + as ProfileViewData.PatientProfileViewData with(profileViewDataHiv) { Assert.assertEquals("logicalId", logicalId) Assert.assertEquals("testName", name) @@ -121,8 +121,8 @@ class ProfileViewDataMapperTest : RobolectricTest() { fun testMapToDomainModelFamily() { val dto = buildProfileData(HealthModule.FAMILY) val profileViewDataHiv = - profileViewDataMapper.transformInputToOutputModel(dto) as - ProfileViewData.FamilyProfileViewData + profileViewDataMapper.transformInputToOutputModel(dto) + as ProfileViewData.FamilyProfileViewData with(profileViewDataHiv) { Assert.assertEquals("logicalId", logicalId) Assert.assertEquals("testName Family", name) @@ -136,8 +136,8 @@ class ProfileViewDataMapperTest : RobolectricTest() { fun testMapToDomainModelDefault() { val dto = buildProfileData(HealthModule.DEFAULT) val profileViewDataHiv = - profileViewDataMapper.transformInputToOutputModel(dto) as - ProfileViewData.PatientProfileViewData + profileViewDataMapper.transformInputToOutputModel(dto) + as ProfileViewData.PatientProfileViewData with(profileViewDataHiv) { Assert.assertEquals("logicalId", logicalId) Assert.assertEquals("testName", name) @@ -178,9 +178,10 @@ class ProfileViewDataMapperTest : RobolectricTest() { healthStatus = HealthStatus.EXPOSED_INFANT, services = buildCarePlanServices(), tasks = emptyList(), - showIdentifierInProfile = true + showIdentifierInProfile = true, ) - HealthModule.HOME_TRACING, HealthModule.PHONE_TRACING -> + HealthModule.HOME_TRACING, + HealthModule.PHONE_TRACING, -> ProfileData.DefaultProfileData( logicalId = "logicalId", name = "testName", @@ -188,7 +189,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { address = "testAddress", age = "5y", gender = Enumerations.AdministrativeGender.MALE, - birthdate = SimpleDateFormat("yyyy-MM-dd").parse("2021-05-25") + birthdate = SimpleDateFormat("yyyy-MM-dd").parse("2021-05-25"), ) HealthModule.APPOINTMENT -> ProfileData.DefaultProfileData( @@ -198,7 +199,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { address = "testAddress", age = "5y", gender = Enumerations.AdministrativeGender.MALE, - birthdate = SimpleDateFormat("yyyy-MM-dd").parse("2021-05-25") + birthdate = SimpleDateFormat("yyyy-MM-dd").parse("2021-05-25"), ) HealthModule.ANC -> ProfileData.AncProfileData( @@ -214,7 +215,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { tasks = emptyList(), conditions = emptyList(), flags = emptyList(), - visits = emptyList() + visits = emptyList(), ) HealthModule.FAMILY -> ProfileData.FamilyProfileData( @@ -225,7 +226,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { age = "5y", services = emptyList(), tasks = emptyList(), - members = emptyList() + members = emptyList(), ) HealthModule.FAMILY_PLANNING -> ProfileData.FamilyProfileData( @@ -236,7 +237,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { age = "5y", services = emptyList(), tasks = emptyList(), - members = emptyList() + members = emptyList(), ) HealthModule.RDT -> ProfileData.FamilyProfileData( @@ -247,7 +248,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { age = "5y", services = emptyList(), tasks = emptyList(), - members = emptyList() + members = emptyList(), ) HealthModule.PNC -> ProfileData.FamilyProfileData( @@ -258,7 +259,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { age = "5y", services = emptyList(), tasks = emptyList(), - members = emptyList() + members = emptyList(), ) HealthModule.CHILD -> ProfileData.AncProfileData( @@ -274,7 +275,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { tasks = emptyList(), conditions = emptyList(), flags = emptyList(), - visits = emptyList() + visits = emptyList(), ) HealthModule.DEFAULT -> ProfileData.DefaultProfileData( @@ -289,7 +290,7 @@ class ProfileViewDataMapperTest : RobolectricTest() { tasks = emptyList(), conditions = emptyList(), flags = emptyList(), - visits = emptyList() + visits = emptyList(), ) } }