DHIS2 data and tracker capture app for Android to support integration with SimprintsID.
Summary of changes comparing to upstream dhis2/dhis2-android-capture-app:
| Feature | File / line of code | Type of change | Description |
|---|---|---|---|
| Infra: fork sync from upstream | simcapture-sync-fork-upstream-main.yml | New file | GitHub Action to sync upstream's main to this repo's upstream-main nightly on Mon-Fri |
| Infra: automatic PR on upstream release | simcapture-upstream-release-pr.yml | New file | GitHub Action to open a PR when upstream-main has an upstream release newly merged into it |
| Infra: signed APK releases | simcapture-github-release-signed-apk.yml | New file | GitHub Action to create a GitHub Release on a merge to main |
| Infra: signed APK releases | app/build.gradle.kts#L121 | Code change | App's Package ID set to com.simprints.simcapture |
| Infra: GitHub Actions filtering | simcapture-disable-upstream-workflows.yml | New file | GitHub Action to limit allowed Actions to the ones starting with simcapture- or copilot- |
| Docs: fork-specific README | README.md#L1-L82 | Code change | This section in README |
| Enrolment+ Possible Duplicates | CustomIntentActivityResultContract.kt#L95 | Code addition | Treats non-identify Simprints callouts that return identification matches as PossibleDuplicates results |
| Enrolment+ Possible Duplicates | FormView.kt#L627 | Code addition | Stores the returned SID session and hands the enrolment form off to the possible duplicates search flow |
| Enrolment+ Possible Duplicates | EnrollmentActivity.kt#L296 | Code addition | Launches possible duplicates search from the enrolment form, carrying the biometric field and returned GUID matches |
| Enrolment+ Possible Duplicates | SimprintsLoadPossibleDuplicatesSearchResultsUseCase.kt | New file | Resolves returned GUIDs one by one into TEI search results for the possible duplicates review list |
| Enrolment+ Possible Duplicates | SearchTEIViewModel.kt#L676 | Code addition | Switches search loading into possible-duplicates mode and auto-falls back to Enrol Last when no matching TEIs exist in DHIS2 |
| Enrolment+ Possible Duplicates | SearchTEList.kt#L315 | Code addition | Replaces the default "+ New" action button with None of the above while reviewing possible duplicates |
| Enrolment+ Enrol Last | SearchTEIViewModel.kt#L608 | Code addition | Marks None of the above as a pending enrolment action and closes the possible duplicates search |
| Enrolment+ Enrol Last | SearchTEActivity.kt#L649 | Code addition | Returns possible duplicates search with an auto-enrol-last signal when the flow should continue to REGISTER_LAST_BIOMETRICS |
| Enrolment+ Enrol Last | EnrollmentActivity.kt#L150 | Code addition | Receives the possible duplicates return flow and launches save-time Enrol Last before enrolment finishes |
| Enrolment+ Enrol Last | SimprintsEnrollmentViewModel.kt#L41 | Code addition | Builds the auto-enrol-last intent from the stored session and restores pending actions across lifecycle interruptions |
| Enrolment+ Enrol Last | SimprintsSessionRepository.kt#L30 | Code addition | Keeps separate pending Enrol Last source state for possible-duplicates returns |
| Enrolment+ Enrol Last | SimprintsRememberCustomIntentFormPresenter.kt#L32 | Code change | Shows (Using last biometrics) when Enrol Last is resumed after returning from possible duplicates |
| Identification+ Enrol Last | EnrollmentActivity.kt#L313 | Code addition | Launches Enrol Last before completing a valid enrollment save and resumes finish after SID returns |
| Identification+ Enrol Last | EnrollmentPresenterImpl.kt#L163 | Code addition | Delegates save-time Enrol Last resolution and result handling |
| Identification+ Enrol Last | EnrollmentModule.kt#L182 | Code addition | DI for separate Simprints-specific components for Identification+ Enrol Last |
| Identification+ Enrol Last | SimprintsEnrollmentViewModelFactory.kt | New file | Creates activity-scoped Simprints Enrol Last ViewModel so pending save-time state survives configuration changes |
| Identification+ Enrol Last | SearchTEActivity.kt#L571 | Code change | Carries biometric search context into create/enroll actions via prepared enrollment query data |
| Identification+ Enrol Last | SimprintsSearchViewModel.kt#L103 | Code addition | Prepares Simprints enrollment query data and tracks whether the create action should use last biometrics |
| Identification+ Enrol Last | SearchTEIViewModel.kt#L1440 | Code change | Preserves existing search parameter values when fields reload so pending Enrol Last state survives configuration changes |
| Identification+ Enrol Last | SearchTEList.kt#L297 | Code addition | Observes the Simprints create-action label state for if the new TEI enrollment button in the result list should use Enrol Last |
| Identification+ Enrol Last | SearchTEUi.kt#L694 | Code change | Switches the new TEI enrollment button text to the last-biometrics label when a pending biometric session exists |
| Identification+ Enrol Last | FormRepositoryImpl.kt#L58 | Code change | Counts pending Enrol Last values as present for form completion, sections, and mandatory validation |
| Identification+ Enrol Last | Injector.kt#L270 | Code addition | DI for separate Simprints-specific components for Identification+ Enrol Last |
| Identification+ Enrol Last | CustomIntentProvider.kt#L74 | Code addition | Shows pending biometric placeholder state, clears it on user clear, and routes Simprints enrollment results |
| Identification+ Enrol Last | SimprintsCustomIntentResultMapper.kt | New file | Maps SID result intents through the existing custom-intent response contract |
| Identification+ Enrol Last | SimprintsEnrollmentViewModel.kt | New file | Coordinates pending Enrol Last launch, save-time result persistence, and session clearing |
| Identification+ Enrol Last | SimprintsD2Repository.kt | New file | Provides D2 access for enrollment context and TEA value reads/writes used by Simprints flows |
| Identification+ Enrol Last | SimprintsSessionRepository.kt | New file | Persists last identification session and pending Enrol Last state in shared preferences |
| Identification+ Enrol Last | SimprintsResolvePendingEnrollmentActionUseCase.kt | New file | Finds the configured register callout and prepares REGISTER_LAST_BIOMETRICS for the pending enrollment |
| Identification+ Enrol Last | SimprintsIntentUtils.kt | New file | Centralizes Simprints callout detection, request preparation, session extraction, and pending placeholder checks |
| Identification+ Enrol Last | SimprintsSearchUtils.kt | New file | Detects biometric identification queries and filters biometric GUIDs before carrying enrollment data |
| Identification+ Enrol Last | SimprintsCustomIntentFormPresenter.kt | New file | Handles Simprints form callout launch, session capture, placeholder display, and pending-state clearing |
| Identification+ Enrol Last | SimprintsRememberCustomIntentFormPresenter.kt | New file | Builds the Simprints form presenter from Compose field state and placeholder resources |
| Identification Confirm Identity | SearchTEActivity.kt#L126 | Code addition | Registers the confirm-identity SID launcher and waits for Simprints navigation before opening dashboards |
| Identification Confirm Identity | SearchTEIViewModel.kt#L959 | Code addition | Intercepts TEI openings from biometric search to launch Confirm Identity when required |
| Identification Confirm Identity | SearchTEModule.java#L357 | Code addition | DI for separate Simprints-specific components for Identification Confirm Identity |
| Identification Confirm Identity | SearchTeiViewModelFactory.kt#L33 | Code addition | Passes Simprints search state into SearchTEIViewModel |
| Identification Confirm Identity | SimprintsSearchViewModelFactory.kt | New file | Creates activity-scoped Simprints search ViewModel so Confirm Identity and Enrol Last state survives configuration changes |
| Identification Confirm Identity | SimprintsSearchViewModel.kt | New file | Coordinates biometric search handoff for Enrol Last labels and Confirm Identity navigation |
| Identification Confirm Identity | SimprintsResolveConfirmIdentityCalloutUseCase.kt | New file | Resolves the selected TEI's biometric GUID and prepares the CONFIRM_IDENTITY callout |
| ModuleID in Identification | CustomIntentRepositoryImpl.kt#L105 | Code addition | Overrides moduleId for Simprints identification intents with the current user's Org Unit value |
| Identification result ordering by score | SearchTEIViewModel.kt#L696 | Code addition | Routes biometric search loading through SID-order-aware lookup so results follow identification match score order |
| Identification result ordering by score | SearchTEModule.java#L365 | Code change | DI for separate Simprints-specific components for Identification result ordering by score |
| Identification result ordering by score | SearchTeiViewModelFactory.kt#L34 | Code addition | Passes the ordered-result use case into SearchTEIViewModel |
| Identification result ordering by score | SimprintsOrderSearchResultsByIdentifyResponseUseCase.kt | New file | Orders matching TEIs to follow the SID identification response order |
| Identification with less buttons | SearchTEIViewModel.kt#L1659 | Code addition | Starts Simprints identification callout immediately on biometric search field click instead of expanding the field |
| Identification with less buttons | SearchTEUi.kt#L214 | Code change | Keeps the Biometric search label read-only |
| Identification with less buttons | SearchParametersScreenProvider.kt#L93 | Code addition | Treats a successful Simprints identification return as an immediate search command instead of waiting for a manual extra step |
| Identification with less buttons | SearchTEIViewModel.kt#L1385 | Code addition | Rehydrates carried query values and performs the search immediately when biometric query data is present |
| Identification with less buttons | SearchTEActivity.kt#L611 | Code addition | Skips the transient search editor and jumps straight to the biometric result list without backdrop animation |
| MFID Auto-Open Record | SearchParametersScreenProvider.kt#L97 | Code addition | Detects credential-linked identification results that qualify for the MFID direct-open shortcut |
| MFID Auto-Open Record | SimprintsSearchViewModel.kt#L190 | Code addition | Consumes an eligible single MFID identification to open the matched record directly instead of showing the result list |
| MFID Auto-Open Record | SimprintsResolveSingleBiometricSearchNavigationUseCase.kt | New file | Resolves the biometric search to exactly one TEI before auto-opening the record |
SimCapture releases have the following naming
scheme: SimCapture-DHIS2-<upstream_DHIS2_version>-fork-<SimCapture_version>.
An example of a release APK name: SimCapture-DHIS2-v3.3.1-fork-1-signed-release.apk.
The workflows of this fork repo should start with simcapture-.
The upstream README is preserved below.
DHIS2 Android Capture App is a mobile application that allows offline data collection for DHIS2. It enables health workers and data collectors to access and update DHIS2 data from their mobile devices without requiring constant internet connectivity.
Main features:
- Offline-first data capture. Enter data for events, tracked entities, and data sets without an internet connection. Data is stored locally and synchronized when connectivity is available.
- Complete DHIS2 workflows. Support for Tracker programs, Event programs, and Data Sets with validation rules, program rules, and indicators.
- Native mobile experience. Built with modern Android technologies to provide a fast, intuitive, and reliable user experience.
- Synchronized with DHIS2. Seamlessly integrates with DHIS2 server instances, ensuring data consistency and compatibility across DHIS2 versions.
Implementation guidance and user documentation can be found in the Android Implementation Guide in DHIS2 documentation.
Developer-oriented documentation and architecture details can be found in AGENTS.md.
This app is built using the DHIS2 Android SDK and the DHIS2 Mobile UI library. To get started with development, check the AGENTS.md file for comprehensive development guidelines, architecture patterns, and best practices.
Community support can be found in the DHIS2 Community portal. Any feedback on the app will be highly appreciated.
To report bugs or request new features, visit the DHIS2 Jira project.