Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
2fa0913
Merge update_version_to3.4.0-DEV into develop (#4574)
github-actions[bot] Jan 8, 2026
7db8417
deps: bump the gradle-updates group across 1 directory with 15 update…
dependabot[bot] Jan 8, 2026
db5796e
chore: [ANDROAPP-7435] deprecate android sdk 21 and 22
taridepaco Jan 9, 2026
d558609
chore: [ANDROAPP-7435] simplify logic depending on deprecated android…
taridepaco Jan 9, 2026
61d1137
feat: add workflow and gradle plugin for generating sbom [skip size] …
rohit-wa Jan 9, 2026
a137aa4
chore: [ANDROAPP-7435] fix kapt error
taridepaco Jan 9, 2026
0977504
chore: [ANDROAPP-7435] fix ktlint complaints
taridepaco Jan 9, 2026
57c0ee3
chore: [ANDROAPP-7435] deprecate android sdk 21 and 22
taridepaco Jan 9, 2026
28a8f6f
chore: [ANDROAPP-7435] simplify logic depending on deprecated android…
taridepaco Jan 9, 2026
5dc741d
chore: [ANDROAPP-7435] fix kapt error
taridepaco Jan 9, 2026
8fcfc0b
chore: [ANDROAPP-7435] fix ktlint complaints
taridepaco Jan 9, 2026
f34eff0
Merge branch 'ANDROAPP-7435-Deprecate-Android-sdk-versions-21-and-22'…
taridepaco Jan 12, 2026
a090fd6
chore: [ANDROAPP-7435] simplify version logic
taridepaco Jan 13, 2026
a0c7d3f
Merge pull request #4582 from dhis2/ANDROAPP-7435-Deprecate-Android-s…
taridepaco Jan 13, 2026
e425b51
build: [ANDROAPP-7434] remove ui components [skip size] (#4573)
Balcan Jan 13, 2026
7230c23
chore: [ANDROAPP-7348] Enable dependency verification [skip size] (#4…
xavimolloy Jan 14, 2026
811f9d6
build: [ANDROAPP-7337] Implement usecases for Home screen [skip size]…
Balcan Jan 15, 2026
16886bd
Merge branch 'develop' into release/3.3.1
xavimolloy Jan 16, 2026
a6a33fd
chore: update dependency verification file
xavimolloy Jan 16, 2026
0674aa6
Merge pull request #4599 from dhis2/update-release-dependency-verific…
xavimolloy Jan 19, 2026
f8ad342
chore: [ANDROAPP-7463] Change database creation date type on main pre…
taridepaco Jan 19, 2026
3913420
chore: [ANDROAPP-7432] add android app to dhis2 dependency tracker (#…
rohit-wa Jan 20, 2026
1334aeb
Merge branch 'develop' into release/3.3.1
xavimolloy Jan 20, 2026
4db7d3a
fix: correct dependency verification conflict resolution error
xavimolloy Jan 20, 2026
1a2ef22
Merge pull request #4597 from dhis2/release/3.3.1
xavimolloy Jan 20, 2026
7121cc2
chore: [ANDROAPP-7466] add new MetadataSyncPeriod item 6h (#4604)
taridepaco Jan 21, 2026
165951d
fix: Manage Invalid configuration d2 error (#4606)
xavimolloy Jan 23, 2026
e9e4c8a
fix: set compose multiplatform resources of type XML (#4608)
andresmr Jan 23, 2026
feec09f
fix: [ANDROAPP-7433] Do not format option set display name values (#4…
xavimolloy Jan 23, 2026
fdeb192
chore: [ANDROAPP-7303] Update apk name and use custom debug keystore …
ferdyrod Jan 23, 2026
e74911f
ANDROAPP-7231-Test-legacy-login [skip size] (#4410)
andresmr Jan 27, 2026
4a6bca7
chore: [ANDROAPP-7387] Update README.md (#4611)
xavimolloy Jan 28, 2026
a1fdd00
deps: update sdk version (#4617)
andresmr Jan 28, 2026
84112c1
chore: [ANDROAPP- 6429] feature/tracker-search-refactor [skip size] (…
andresmr Jan 29, 2026
d3767fe
ANDROAPP-7478-dependabot-specific-rules (#4619)
andresmr Jan 30, 2026
d63432c
test: improve some tests (#4629)
andresmr Jan 30, 2026
468e168
deps: update dependabot (#4630)
andresmr Jan 30, 2026
b321675
build: Move flavor dependant class to correct path (#4612)
Balcan Feb 1, 2026
b650763
ci: [ANDROAPP-7303] Updates Apk name and uploads correct artifact (#4…
ferdyrod Feb 1, 2026
a1501ca
feat: [ANDROAPP-7472] I Clean up old search repository [skip size] I …
xavimolloy Feb 2, 2026
e4e52e4
refactor: [ANDROAPP-7461] remove deprecated onNextClicked (#4613)
mmmateos Feb 2, 2026
feb6b1d
feat: [ANDROAPP-7472] II data models and mappers (#4623)
xavimolloy Feb 2, 2026
de1a818
fix: [ANDROAPP-7465] ds data input periods appear available but are a…
taridepaco Feb 2, 2026
98ffe5b
fix(translations): sync translations from transifex (develop) [skip s…
dhis2-bot Feb 3, 2026
af7ccdd
chore: [ANDROAPP-7472] Update paging data (#4632)
xavimolloy Feb 4, 2026
c0892d1
chore: [ANDROAPP-7483] Adapt app to changes caused by category combo …
marcamsn Feb 4, 2026
381bfd2
feat: [ANDROAPP-7472] III Repositories and usecase [skip size] (#4624)
xavimolloy Feb 4, 2026
f2dbbec
feat: [ANDROAPP-7472] V Use case implementation into SearchTEIViewMod…
xavimolloy Feb 5, 2026
42031e3
feat: [ANDROAPP-7370] Support 6 and 12 hours metadata sync (#4605)
Balcan Feb 6, 2026
1759a88
test: Add waitForView in openMenuMoreOptions action in EventRobot.kt …
andresmr Feb 9, 2026
ca9f339
fix(translations): sync translations from transifex (develop) (#4634)
dhis2-bot Feb 10, 2026
8c4244a
test: update DataSetTableViewModel.kt to increment and decrement asyn…
andresmr Feb 10, 2026
78afccf
refactor: [ANDROAPP-7305] Include error when device doesn't have netw…
ferdyrod Feb 10, 2026
a30b68f
translations: update transifex types to Android (#4645)
andresmr Feb 11, 2026
bb677b0
fix(translations): sync translations from transifex (develop) [skip s…
dhis2-bot Feb 12, 2026
5e177fa
test: Add NotesIdlingResource to NoteDetailPresenter.kt on save() met…
andresmr Feb 12, 2026
d3fd9f8
review-flaky-tests (#4653)
andresmr Feb 13, 2026
b52006d
ANDROAPP-7218-Implement-OAuth-login-flow-Part-2-Retrieving-authentica…
andresmr Feb 13, 2026
b0fb5a0
refactor(test): [Login] Update test annotations to use Kotlin test fr…
andresmr Feb 16, 2026
24b20d9
feat: [ANDROAPP-7459][1/6] Added new worker to update sync settings […
Balcan Feb 18, 2026
ff25169
test: refactor how dataset waits to table (#4655)
Balcan Feb 19, 2026
58a37a2
chore: [ANDROAPP-7470] File relocation and fetchOptionSets usecase (I…
xavimolloy Feb 19, 2026
8372fc8
test: Replaced all awaitIdle() calls with waitForIdle() (#4673)
andresmr Feb 20, 2026
387070c
feat: [ANDROAPP-7470] - II - Fetch parameters use case [skip size] (…
xavimolloy Feb 20, 2026
bf7b8e2
feat: [ANDROAPP-7470] - III - Injection of new use cases and final pr…
xavimolloy Feb 20, 2026
f8af65f
chore: [ANDROAPP-7498 ] handle new period types [skip size] (#4664)
taridepaco Feb 20, 2026
6e30070
chore: [ANDROAPP-7517] Adapt to mandatory enrollment category combo o…
taridepaco Feb 20, 2026
1ffd849
feat: [ANDROAPP-7470] - IV - Move SearchParameters Screen to tracker …
xavimolloy Feb 23, 2026
d320e42
test: adding WaitForView in checkDataSetIsNotCompletedAndModified ste…
andresmr Feb 23, 2026
f8a57fd
feat: [ANDROAPP-7459][3/6] Added wew sync metadata worker [skip size]…
Balcan Feb 24, 2026
e804222
feat: [ANDROAPP-7129] Update to Rule Engine 3.6.0, apply sort order f…
vgarciabnz Feb 24, 2026
5d3e48e
fix(translations): sync translations from transifex (develop) (#4666)
dhis2-bot Feb 25, 2026
d3592d3
deps: bump the gradle-updates group across 1 directory with 4 updates…
dependabot[bot] Feb 25, 2026
39cddbc
fix: [ANDROAPP-7081] program stage sections order is not applied corr…
taridepaco Feb 26, 2026
49a8189
feat: check minCharacters to search and display warning (#4682)
andresmr Feb 26, 2026
9f28705
feat: [ANDROAPP-7226] Support of search operators [skip size] (#4683)
ferdyrod Feb 26, 2026
0282fc6
feat: Use new Indicator component for feedback [ANDROAPP-7511] (#4689)
fernandogmz Feb 26, 2026
f4b9f2e
test: Implement SearchParametersIntegrationTest.kt (#4684)
andresmr Feb 27, 2026
ee9bff4
chore: [ANDROAPP-7525] adapt to changes in sdk event service and enro…
taridepaco Mar 2, 2026
1b29526
fix: Replace .height(columnHeightDp) from MainContent.kt by fillMaxHe…
andresmr Mar 3, 2026
04cb2ef
Androapp 7534 refactor data set table view model to improve asynchron…
andresmr Mar 5, 2026
2e0ac97
fix: [ANDROAPP-7522] Handles Yes Only value when checked (#4707)
ferdyrod Mar 5, 2026
f7556c3
test: Search operators automation tests (#4704)
ferdyrod Mar 5, 2026
f221b3d
test: update NoteRobot.kt (#4709)
andresmr Mar 5, 2026
70fca84
build: ANDROAPP-7529 update-gradle-9 [skip size] (#4694)
andresmr Mar 5, 2026
db30687
feat: [ANDROAPP-7189] implement InputSegmentedShell on TFA (#4677)
mmmateos Mar 6, 2026
821f462
build: update dhis2sdk to 1.14.0-SNAPSHOT (#4715)
andresmr Mar 9, 2026
f9e35a5
fix: [ANDROAPP-7510] Update compose android and multiplatform [skip s…
xavimolloy Mar 10, 2026
7701483
fix: escape special characters in string resources (#4716)
andresmr Mar 10, 2026
3c5c8a8
feat: [ANDROAPP-7507] Support hybrid basemaps (#4708)
Balcan Mar 10, 2026
0d364dd
fix: Wrap OpenID login response handling in IO context in LoginReposi…
andresmr Mar 10, 2026
402f2e2
build(deps): bump actions/upload-artifact from 6.0.0 to 7.0.0 (#4713)
dependabot[bot] Mar 11, 2026
8abb993
build: update composePluginVersion to 1.10.2 and refresh verification…
andresmr Mar 11, 2026
1f67d3d
build: [ANDROAPP-7497] Move data sync to sync module [skip size] (#4690)
Balcan Mar 11, 2026
5ea695e
test: update testing DB to include search operators
rohit-wa Mar 11, 2026
c746384
Merge pull request #4725 from dhis2/ANDROAPP-7545-update-test-db-add-…
rohit-wa Mar 11, 2026
b3931e7
add focus change handler to input fields for ui event triggering (#4718)
ferdyrod Mar 12, 2026
0565c52
feat: Add ColorMatcher.kt to find the closest color palette [skip siz…
andresmr Mar 12, 2026
b4abb3c
build: Allow rooted devices for training app (#4719)
Balcan Mar 12, 2026
0df74ce
Updates Rule engine. (#4724)
ferdyrod Mar 12, 2026
079c3c7
fix: [ANDROAPP-7494] Remove compose animation forced version (#4723)
Balcan Mar 12, 2026
8ef16e6
remove legacy unused code
Balcan Mar 13, 2026
81a8636
feat: [ANDROAPP-7445] adapt to mandatory dataset for value (#4717)
mmmateos Mar 13, 2026
36d86fb
fix: [ANDROAPP-7530] Sync config status not updating occasionally (#4…
Balcan Mar 13, 2026
83d3dbb
fix: [ANDROAPP-7496] hide enrolled orgunit (#4726)
mmmateos Mar 13, 2026
e229dec
ANDROAPP-7448 Replace Pin layout [skip size] (#4712)
andresmr Mar 16, 2026
9e28875
build: [ANDROAPP-7455] Improve Program Rule performance in forms [ski…
Balcan Mar 17, 2026
50b5004
fix: [ANDROAPP-7539] optimize data loading in stock management (#4736)
xavimolloy Mar 17, 2026
db54310
fix(translations): sync translations from transifex (develop) [skip s…
dhis2-bot Mar 17, 2026
921680a
Update rule engine to 3.7.0 (#4740)
Copilot Mar 17, 2026
26d2847
feat: [ANDROAPP-7456] Legend evaluation for rule actions (#4727)
vgarciabnz Mar 17, 2026
2da3def
Update version to 3.4.0-RC
dhis2-bot Mar 18, 2026
955aab1
build: update ruleEngine to 3.7.1 and expressionParser to 1.4.0 (#4758)
andresmr Mar 24, 2026
de2cd0f
fix: [ANDROAPP-7550] Update filters in main thread (#4783)
xavimolloy Apr 6, 2026
e0edafb
fix: [ANDROAPP-7550] maintain running status in syncStatusController …
xavimolloy Apr 10, 2026
aa15034
fix: [ANDROAPP-7569] change sync settings job period to one hour, syn…
xavimolloy Apr 10, 2026
d901176
fix: [ANDROAPP-7569] Workers not been properly scheduled (#4807)
Balcan Apr 28, 2026
20ebb7f
fix(translations): sync translations from transifex (main) (#4833)
dhis2-bot Apr 28, 2026
94f889d
fix: [ANDROAPP-7569] Set default sync periods if ASWA is not configur…
Balcan Apr 28, 2026
ac5fd7d
Update Sdk, Design System, and Version Code (#4845)
github-actions[bot] May 1, 2026
97bf68c
Merge branch 'main' into release/3.4.0-RC
andresmr May 1, 2026
315eb8d
build: update release 3.4.0 with main
andresmr May 1, 2026
f75af25
Merge pull request #4847 from dhis2/release/3.4.0-RC
andresmr May 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ ktlint_standard_no-wildcard-imports = enabled
ktlint_standard_trailing-comma-on-call-site = enabled
ktlint_standard_trailing-comma-on-declaration-site = enabled
ktlint_standard_import-ordering = enabled
ktlint_experimental_no-unused-imports = enabled
6 changes: 5 additions & 1 deletion .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,12 @@ updates:
update-types: ["version-update:semver-major", "version-update:semver-minor"]
- dependency-name: "com.squareup.okhttp3:*"
- dependency-name: "org.hisp.dhis.mobile:designsystem"
- dependency-name: "org.hisp.dhis:android-core"
- dependency-name: "org.hisp.dhis.rules:rule-engine-jvm"
- dependency-name: "org.hisp.dhis.lib.expression:expression-parser-jvm"
groups:
dhis2-android-core:
patterns:
- "org.hisp.dhis:android-core"
gradle-updates:
patterns:
- "*" # Group all Gradle updates into one PR
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/build-release-candidate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
encodedString: ${{ secrets.KEYSTORE }}

- name: Build Release APKs
run: ./gradlew app:assembleDhis2Release app:assembleDhis2PlayServicesRelease
run: ./gradlew --dependency-verification lenient app:assembleDhis2Release app:assembleDhis2PlayServicesRelease
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
Expand All @@ -69,7 +69,7 @@ jobs:
TRAINING_KEY_PASSWORD: ${{ secrets.TRAINING_KEY_PASSWORD }}
TRAINING_STORE_PASSWORD: ${{ secrets.TRAINING_STORE_PASSWORD }}
TRAINING_STORE_FILE: ${{ steps.decode_training_keystore.outputs.filePath }}
run: ./gradlew app:assembleDhis2TrainingRelease
run: ./gradlew --dependency-verification lenient app:assembleDhis2TrainingRelease

- name: Read version name from file
working-directory: ./gradle
Expand All @@ -78,21 +78,21 @@ jobs:

# Upload DhisRelease APK
- name: Upload DhisRelease APK
uses: actions/upload-artifact@v6.0.0
uses: actions/upload-artifact@v7.0.0
with:
name: ${{ env.repository_name }} - DhisRelease APK
path: ${{ env.main_project_module }}/build/outputs/apk/dhis2/release/dhis2-v${{ steps.read-version.outputs.vName }}.apk

# Upload DhisPlayServicesRelease APK
- name: Upload DhisPlayServicesRelease APK
uses: actions/upload-artifact@v6.0.0
uses: actions/upload-artifact@v7.0.0
with:
name: ${{ env.repository_name }} - DhisPlayServicesRelease APK
path: ${{ env.main_project_module }}/build/outputs/apk/dhis2PlayServices/release/dhis2-v${{ steps.read-version.outputs.vName }}-googlePlay.apk

# Upload Training Release APK
- name: Upload Training Release APK
uses: actions/upload-artifact@v6.0.0
uses: actions/upload-artifact@v7.0.0
with:
name: ${{ env.repository_name }} - Training Release APK
path: ${{ env.main_project_module }}/build/outputs/apk/dhis2Training/release/dhis2-v${{ steps.read-version.outputs.vName }}-training.apk
30 changes: 22 additions & 8 deletions .github/workflows/continuous-delivery.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,34 @@ jobs:
- name: Change wrapper permissions
run: chmod +x ./gradlew

- name: Decode Keystore
id: decode_keystore
uses: timheuer/base64-to-file@784a1a4a994315802b7d8e2084e116e783d157be
with:
fileName: 'debug.keystore'
encodedString: ${{ secrets.DEBUG_KEYSTORE_BASE64 }}

# Create APK Debug
- name: Build apk debug project (APK) - ${{ env.main_project_module }} module
run: ./gradlew assembleDhis2Debug
run: ./gradlew --dependency-verification lenient assembleDhis2Debug
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}

- name: Read version name from file
working-directory: ./gradle
id: read-version
run: echo "vName=$(grep 'vName' libs.versions.toml | awk -F' = ' '{print $2}' | tr -d '"')" >> "$GITHUB_OUTPUT"
DEBUG_KEYSTORE_ALIAS: ${{ secrets.DEBUG_KEYSTORE_ALIAS }}
DEBUG_KEY_PASS: ${{ secrets.DEBUG_KEY_PASS }}
DEBUG_KEYSTORE_PASSWORD: ${{ secrets.DEBUG_KEYSTORE_PASSWORD }}
DEBUG_KEYSTORE_PATH: ${{ steps.decode_keystore.outputs.filePath }}

- name: Locate built APK
id: apk-path
run: |
echo "Searching for APKs under ${{ env.main_project_module }}/build/outputs/apk"
find "${{ env.main_project_module }}/build/outputs/apk" -type f -name "*.apk"
APK_PATH=$(find "${{ env.main_project_module }}/build/outputs/apk" -type f -name "*.apk" -print -quit)
echo "apk_path=$APK_PATH" >> "$GITHUB_OUTPUT"

# Upload Artifact Build
- name: Upload Android artifacts
uses: actions/upload-artifact@v6.0.0
uses: actions/upload-artifact@v7.0.0
with:
name: ${{ env.repository_name }} - Android APK - ${{ steps.date.outputs.date }}
path: ${{ env.main_project_module }}/build/outputs/apk/dhis2/debug/dhis2-v${{ steps.read-version.outputs.vName }}.apk
path: ${{ steps.apk-path.outputs.apk_path }}
4 changes: 2 additions & 2 deletions .github/workflows/deploy-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
encodedString: ${{ secrets.KEYSTORE }}

- name: Build Release APKs
run: ./gradlew app:assembleDhis2Release app:assembleDhis2PlayServicesRelease
run: ./gradlew --dependency-verification lenient app:assembleDhis2Release app:assembleDhis2PlayServicesRelease
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
Expand All @@ -73,7 +73,7 @@ jobs:
TRAINING_KEY_PASSWORD: ${{ secrets.TRAINING_KEY_PASSWORD }}
TRAINING_STORE_PASSWORD: ${{ secrets.TRAINING_STORE_PASSWORD }}
TRAINING_STORE_FILE: ${{ steps.decode_training_keystore.outputs.filePath }}
run: ./gradlew app:assembleDhis2TrainingRelease
run: ./gradlew --dependency-verification lenient app:assembleDhis2TrainingRelease

- name: Read version name from file
working-directory: ./gradle
Expand Down
9 changes: 0 additions & 9 deletions .tx/config
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,6 @@ type = ANDROID
minimum_perc = 0
resource_name = Main App

[o:hisp-uio:p:dhis2-android-capture-app:r:ui-strings-xml]
file_filter = ui-components/src/main/res/values-<lang>/strings.xml
source_file = ui-components/src/main/res/values/strings.xml
source_lang = en
type = ANDROID
minimum_perc = 0
resource_name = UI Components

[o:hisp-uio:p:dhis2-android-capture-app:r:table-strings-xml]
file_filter = compose-table/src/main/res/values-<lang>/strings.xml
source_file = compose-table/src/main/res/values/strings.xml
Expand Down Expand Up @@ -105,4 +97,3 @@ source_lang = en
type = ANDROID
minimum_perc = 0
resource_name = Sync

15 changes: 13 additions & 2 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -66,21 +66,26 @@ pipeline {
}
}
stage('Unit tests') {
when {
expression {
return !isSkipUnitTest()
}
}
environment {
ANDROID_HOME = '/opt/android-sdk'
}
steps {
script {
echo 'Running unit tests'
sh './gradlew testDebugUnitTest testDhis2DebugUnitTest --stacktrace --no-daemon'
sh './gradlew --dependency-verification lenient testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest --stacktrace --no-daemon'
}
}
}
stage('Build Test APKs') {
steps {
script {
echo 'Building UI APKs'
sh './gradlew :app:assembleDhis2Debug :app:assembleDhis2DebugAndroidTest :form:assembleAndroidTest'
sh './gradlew --dependency-verification lenient :app:assembleDhis2Debug :app:assembleDhis2DebugAndroidTest :form:assembleAndroidTest'
}
}
}
Expand Down Expand Up @@ -202,3 +207,9 @@ def isSkipSizeCheck() {
def prDescription = env.CHANGE_DESCRIPTION ?: ""
return (prTitle.contains("[skip size]") || prDescription.contains("[skip size]"))
}

def isSkipUnitTest() {
def prTitle = env.CHANGE_TITLE ?: ""
def prDescription = env.CHANGE_DESCRIPTION ?: ""
return (prTitle.contains("[skip unitTest]") || prDescription.contains("[skip unitTest]"))
}
29 changes: 25 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,31 @@
# README #
# DHIS2 Android Capture App

[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=dhis2_dhis2-android-capture-app&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=dhis2_dhis2-android-capture-app)
[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=dhis2_dhis2-android-capture-app&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=dhis2_dhis2-android-capture-app)

Check the [Wiki](https://github.com/dhis2/dhis2-android-capture-app/wiki) for information about how to build the project and its architecture **(WIP)**
## Introduction

### What is this repository for? ###
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.

DHIS2 Android application.
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.

## Documentation

Implementation guidance and user documentation can be found in the [Android Implementation Guide](https://docs.dhis2.org/en/implement/android-implementation/executive-summary.html) in DHIS2 documentation.

Developer-oriented documentation and architecture details can be found in [AGENTS.md](AGENTS.md).

## Getting Started

This app is built using the [DHIS2 Android SDK](https://github.com/dhis2/dhis2-android-sdk) and the [DHIS2 Mobile UI library](https://developers.dhis2.org/docs/mobile/mobile-ui/overview). To get started with development, check the [AGENTS.md](AGENTS.md) file for comprehensive development guidelines, architecture patterns, and best practices.

## Community

Community support can be found in the [DHIS2 Community portal](https://community.dhis2.org/c/implementation/mobile). Any feedback on the app will be highly appreciated.

To report bugs or request new features, visit the [DHIS2 Jira project](https://jira.dhis2.org/projects/ANDROAPP/issues).
79 changes: 31 additions & 48 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -1,75 +1,58 @@
# Release notes - Android App for DHIS2 - 3.3.1
# Release notes - Android App for DHIS2 - 3.4.0

### Bug
### NEW FUNCTIONALITY AND WEB PARITY

[ANDROAPP-6870](https://dhis2.atlassian.net/browse/ANDROAPP-6870) Let the rule-engine apply the logic for useCodeForOptionSet in RuleVariable
#### Tracked Entity Search Performance Configuration:
This feature enables the configuration of the search operators for the different Tracked Entity Attributes to improve search performance.

[ANDROAPP-6975](https://dhis2.atlassian.net/browse/ANDROAPP-6975) Crash when rotating the device with the save dialog open
Tracked entity attributes can now define a preferred default search operator. This configuration is set in the Maintenance app and interpreted by the Capture Web and Android applications, third party clients can also use the recommended operator when performing searches. Specific operators can also be restricted to protect system performance.

[ANDROAPP-7211](https://dhis2.atlassian.net/browse/ANDROAPP-7211) NoSuchElementException: Collection contains no element matching the predicate.
Sensible defaults are automatically applied to guide efficient queries. The LIKE operator—commonly associated with slow performance—is no longer selected by default; instead, EQUALS or other more efficient operators are pre-selected

[ANDROAPP-7235](https://dhis2.atlassian.net/browse/ANDROAPP-7235) Program rules not triggered when moving between fields manually
To further optimize tracked entity instance (TEI) searches, this feature adds support for specifying a minimum number of characters required for searching and for enabling trigram indexing.

[ANDROAPP-7260](https://dhis2.atlassian.net/browse/ANDROAPP-7260) Incorrect behavior when creating a new event in timeline view
[Jira](https://dhis2.atlassian.net/browse/ROADMAP-128) | [Feature card](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/releases/screenshots/43/feature-cards/43-search-performance-operators-combo.png)

[ANDROAPP-7261](https://dhis2.atlassian.net/browse/ANDROAPP-7261) Keyboard blocks the last field when entering data \(screen doesn’t scroll\)

[ANDROAPP-7269](https://dhis2.atlassian.net/browse/ANDROAPP-7269) Crash on search
#### DHIS2 Custom Theme:
DHIS2 version 43 now supports changing the theme color of your DHIS2 instance. This is done via the theme color setting under the Appearance tab in the Settings app. The color picker has a curated set of preset colors to choose from, or the user can enter a specific RGB value. The selected color is applied consistently across the headerbar on the entire instance, as well as on the Android app. A contrast algorithm automatically adjusts the text and icon color to maintain legibility against the selected background. Removing the color reverts the instance to the default blue color. The android style setting is restricted to v42 and below.

[ANDROAPP-7293](https://dhis2.atlassian.net/browse/ANDROAPP-7293) Bottom sheet landscape behavior
[Jira](https://dhis2.atlassian.net/browse/ROADMAP-622) | [Feature card](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/releases/screenshots/43/feature-cards/43-custom-color-combo-new.png)

[ANDROAPP-7345](https://dhis2.atlassian.net/browse/ANDROAPP-7345) Changes to enrollment date not respected by program rules \(version 3.2.1.2\)
#### Markdown and legend support in Android Feedback Widget:
Feedback messages generated through display text and key-value pair actions can now include formatted text using Markdown, enabling the display of structured content such as titles, lists, and emphasized text.

[ANDROAPP-7368](https://dhis2.atlassian.net/browse/ANDROAPP-7368) crash: when trying to update fields in Tracker
In addition, support for legend-based styling has been introduced, allowing feedback values to be visually highlighted based on predefined legend sets. This enables dynamic color-coding of key values, helping users quickly interpret results and identify important conditions.

[ANDROAPP-7394](https://dhis2.atlassian.net/browse/ANDROAPP-7394) Login blocked after logout “The user is already logged in” error
[Jira]() | [Feature card]()

[ANDROAPP-7400](https://dhis2.atlassian.net/browse/ANDROAPP-7400) Crash - changing org unit and dates
#### Program rule priority for Actions:
Each program rule action can define an optional priority value. During rule evaluation, actions are first grouped based on their parent program rule, and then ordered by the611ir assigned priority. Actions with lower priority values are processed first, while actions without a defined priority are placed at the end.

[ANDROAPP-7402](https://dhis2.atlassian.net/browse/ANDROAPP-7402) Bottom sheet org unit not displaying buttons
This allows multiple related actions to be managed within a single program rule while still maintaining a clear and predictable execution order.

[ANDROAPP-7403](https://dhis2.atlassian.net/browse/ANDROAPP-7403) Home cards lose proper layout
[Jira](https://dhis2.atlassian.net/browse/ROADMAP-625) | [Feature card](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/releases/screenshots/43/feature-cards/43-action-priority.png)

[ANDROAPP-7411](https://dhis2.atlassian.net/browse/ANDROAPP-7411) Android sync by working lists: After updating predefined list views settings, changes aren't reflected in android app after syncing

[ANDROAPP-7415](https://dhis2.atlassian.net/browse/ANDROAPP-7415) Android: WORKING LIST incorrect result in app
### USER EXPERIENCE

[ANDROAPP-7419](https://dhis2.atlassian.net/browse/ANDROAPP-7419) Server selection title is missing
#### Android Log In process improvements:
The new PIN design provides a more modern and consistent user experience during setup. This change is part of the broader work to improve authentication related screens and prepare the foundation for future enhancements

[ANDROAPP-7421](https://dhis2.atlassian.net/browse/ANDROAPP-7421) Data set table not opening after clicking next for default category combo
[Jira](https://dhis2.atlassian.net/browse/ROADMAP-618) | [Feature card](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/releases/screenshots/43/feature-cards/Android-3-4-PIN-redesign-new.png)

[ANDROAPP-7425](https://dhis2.atlassian.net/browse/ANDROAPP-7425) NullPointerException: ProgramFragment
### PERFORMANCE & MAINTENANCE

[ANDROAPP-7428](https://dhis2.atlassian.net/browse/ANDROAPP-7428) LMIS program is using completed enrollment
#### Android Metadata Sync Improvements
Metadata synchronization has been enhanced with more frequency options. In addition to existing intervals, automatic metadata sync can now run every 6 or 12 hours, allowing for more timely updates and better alignment with data sync behavior.

[ANDROAPP-7442](https://dhis2.atlassian.net/browse/ANDROAPP-7442) Program rules not triggering for completed enrollments
As part of the improvements, the app also performs a daily background check to detect any changes in the configuration when the sync is set to "Manual". If a change is detected from manual to an automatic sync frequency, an immediate metadata sync is triggered and the corresponding schedule is applied.

### Task
[Jira](https://dhis2.atlassian.net/browse/ROADMAP-617) | [Feature card](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/releases/screenshots/43/feature-cards/Android-3-4-new-sync-periods-new.png)

[ANDROAPP-7286](https://dhis2.atlassian.net/browse/ANDROAPP-7286) Replace deprecated categoryComboUid usages with categoryCombo in Program and DataElement
#### Improved Event ordering for consistent sync and calculations:
With this update, event ordering has been aligned across Web, Android, and API sources, allowing events to be processed in the correct sequence during synchronization and improving overall data consistency and reliability.

[ANDROAPP-7288](https://dhis2.atlassian.net/browse/ANDROAPP-7288) Implement UseCase interface
[Jira](https://dhis2.atlassian.net/browse/ROADMAP-619) | [Feature card](https://s3.eu-west-1.amazonaws.com/content.dhis2.org/releases/screenshots/43/feature-cards/43-stock-management-lmis.png)

[ANDROAPP-7318](https://dhis2.atlassian.net/browse/ANDROAPP-7318) Create AGENTS.md file

[ANDROAPP-7349](https://dhis2.atlassian.net/browse/ANDROAPP-7349) Sonarcloud - Use full commit SHA hash for this dependency.

[ANDROAPP-7373](https://dhis2.atlassian.net/browse/ANDROAPP-7373) LogoutUser use case improvements

[ANDROAPP-7384](https://dhis2.atlassian.net/browse/ANDROAPP-7384) Update transifex tracker configuration

[ANDROAPP-7386](https://dhis2.atlassian.net/browse/ANDROAPP-7386) QA: Remove duplicated UI modules

[ANDROAPP-7388](https://dhis2.atlassian.net/browse/ANDROAPP-7388) Create sync module

[ANDROAPP-7395](https://dhis2.atlassian.net/browse/ANDROAPP-7395) Review settings repository data loading for log out request

[ANDROAPP-7396](https://dhis2.atlassian.net/browse/ANDROAPP-7396) Remove and update usage to design systems' deprecated methods

[ANDROAPP-7424](https://dhis2.atlassian.net/browse/ANDROAPP-7424) Gradle warnings: Remove RX binding dependency and zxing dependency

[ANDROAPP-7426](https://dhis2.atlassian.net/browse/ANDROAPP-7426) Upload proguard mapping on Sentry

[ANDROAPP-7440](https://dhis2.atlassian.net/browse/ANDROAPP-7440) Update Expression parser to 1.2.2

[ANDROAPP-7441](https://dhis2.atlassian.net/browse/ANDROAPP-7441) Remove username from Sentry reports
Loading